精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊 Vue-SSR 激活失敗(Vue hydration fails)

開發 項目管理
服務端渲染有很多好處,特別是當像 Nuxt.js 或 GridSome 這樣的網站,無論是使用動態 SSR 還是生成靜態網站,開發 Vue-SSR 應用程序都是一件輕而易舉的事。

認識 Vue-SSR 激活失敗

對于 SSR 服務端渲染這個概念稍有經驗的開發應該都不陌生,官方文檔 Vue SSR 指南 對于什么是服務端渲染、為什么使用服務端渲染以及什么時候使用服務端渲染已經說的很清楚了,結合一張經典的構建過程總結關于 SSR 的基本知識。

1. 基本常識

什么是服務端渲染?

  • 客戶端渲染是在瀏覽器中輸出 Vue 組件,進行生成 DOM 和操作 DOM,并渲染為 HTML 頁面展示;
  • 服務端渲染是將同一個組件渲染為服務器端的 HTML 字符串,將它們直接發送到瀏覽器展示;
  • Vue SSR 則將這些服務端渲染的靜態 HTML "激活"為客戶端上完全可交互的 HTML 頁面,服務端與客戶端渲染的 HTML 混合,體現了 Vue SSR 的一大特性--同構。

為什么使用 SSR?

  • 首屏渲染速度快;
  • SEO,服務端渲染的頁面內容可以被搜索引擎爬蟲獲取;

什么場景下使用 SSR?

SSR 服務端渲染的優勢主要在于首屏渲染與 SEO,那為什么不直接全面推廣使用呢?主要考慮到存在以下劣勢:

  • 代碼復雜度增加 - 為了實現前面提到的同構,應用代碼中需要兼容服務端和客戶端兩種運行情況,那么原先只支持瀏覽器環境運行的 API 方法必須增加特殊處理才能在服務端渲染程序中運行;
  • 涉及構建設置和部署有更多要求 - 完全靜態單頁面應用程序 (SPA) 可以部署在任何靜態文件服務器上,而服務器渲染應用程序,需要處于 Node.js server 運行環境;
  • 更多的服務器負載 - 在 Node.js 中渲染完整的應用程序,

所以是否可以使用服務端渲染 SSR,需要開發者考慮投入產出比,如果應用系統的大多數頁面都不需要 SEO,且首屏時間基本可以滿足需求,使用 SSR 就沒有必要了。結合上面的第 2 點, SSR 的使用場景:

  • 對首屏渲染時間要求高,且盡可能只把首屏內容放到服務端渲染;
  • 對 SEO 要求高的內容。

2. 主要痛點問題

服務端渲染有很多好處,特別是當像 Nuxt.js 或 GridSome 這樣的網站,無論是使用動態 SSR 還是生成靜態網站,開發 Vue-SSR 應用程序都是一件輕而易舉的事。但從另一方面來講,由于同構帶來的代碼復雜性與 node 端未知錯誤,降低了系統應用的穩定性與可靠性,并不推薦在非必要場景下使用 SSR 開發。盡管在官方指南的指導下,以及在前人踩坑后提供了變通的解決方案,多數錯誤都可以避開或者解決,但仍有未知錯誤導致的報錯致使我們無從下手。

比如我曾在 SSR 服務端渲染中遇到了一個 Bug,排查了整整 2 個小時,定位為客戶端渲染失敗,但導致客戶端渲染失敗的原因又有很多。

Error: Error while mounting app: HierarchyRequestError: Failed to execute 'appendChild' on 'Node':
This node type does not support this method. at some-file.js:1

在 SSR 應用中不斷踩坑地經歷讓我意識到:大多數時候遇到的棘手錯誤都是 Vue 客戶端激活失敗導致的。

3. 什么是 Vue 客戶端激活失敗(client-side hydration)客戶端激活

官方指南對 Vue 客戶端激活(client-side hydration)定義很清晰:

所謂客戶端激活,指的是 Vue 在瀏覽器端接管由服務端發送的靜態 HTML,使其變為由 Vue 管理的動態 DOM 的過程。

這里 hydration,又可以翻譯為“注入”,可以了理解為將在客戶端生成的虛擬 DOM 結構注入到服務端渲染出的 HTML 中使這些靜態的 HTML 變為動態的。從上面的構建過程圖我們也可以看到,這里的激活發生在客戶端構建完成的包到渲染為 HTML 的過程中。

客戶端激活失敗

服務端已經渲染好了 HTML,無需將其丟棄再重新創建所有的 DOM 元素,而是去激活這些渲染好的靜態 HTML,使他們成為動態的以能夠響應后續的數據變化。但如果 Vue 客戶端生成的虛擬 DOM 樹與服務端渲染的 DOM 結構無法匹配,就會發生客戶端激活失敗。

這里又分為開發模式和生產模式兩種情況:

在開發模式下,如果無法匹配,它將退出混合模式,丟棄現有的 DOM 并從頭開始渲染;

在生產模式下,此檢測會被跳過,以避免性能損耗。

這也就能說明為什么有些錯誤僅在生產模式下才會出現。

在排查錯誤問題的過程中,讀到(谷歌)了一篇關于 SSR 服務中客戶端激活失敗梳理較為細致的文章,列舉出了大多數可能出現的原因以及解決方案。

原文地址 - What to do when Vue hydration fails

二、正文 - What to do when Vue hydration fails

1. 什么是 Vue 激活失敗

第一次聽到"hydration"這個詞時,它對我來說非常抽象,我想不出它的意思。最終,我意識到它并不像一開始聽起來那么復雜:

hydration 是 Vue 轉換服務器端渲染的標記并使其具有動態反應性的過程,因此它可以反映來自 Vue 的動態更改。

如果 Vue 期望與服務端渲染的 HTML 不同的標記,則 hydration 將失敗(也稱為“Vue 將 hydration 丟棄”)。你可以在官方的 Vue SSR 文檔中閱讀更多相關內容。

2. 如何識別激活失敗

我們現在已經意識到激活是什么和在什么時候會失敗,但是我們作為開發者要如何發現激活沒有如預期一般工作呢?

有兩條錯誤消息肯定會指出激活失敗但都有限制條件。

1)第一條是僅在開發環境中出現:Parent:

Parent:  <div class="container"> client-hook-3.js:1:16358
Mismatching childNodes vs. VNodes: NodeList(3) [ p, p, p ] Array [ {} ]

[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content.
This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>.
Bailing hydration and performing full client-side render.

2)第二條錯誤消息是僅在生產環境下使用靜態生成站點時:

Error: Error while mounting app: HierarchyRequestError: Failed to execute 'appendChild' on 'Node':
This node type does not support this method. at some-file.js:1

眾所周知,激活僅在頁面首先由服務端渲染時發生,因此通常僅在你應用的初始化請求中。

當通過一個標簽導航時激活失敗是不可見的,僅能在硬重載時才能復現,這就使得在開發環境下發現激活失敗問題變得更加困難。

因此激活錯誤有時僅在階段系統或者更糟,僅在生產環境下被發現。在極少數情況下,甚至不會打印出錯誤而僅僅時某些組件停止工作。

3. 一般引發錯誤的原因

現在我們了解了如何發現激活錯誤,接下來將研究導致 Vue 激活錯誤的典型原因。當然這里不可能覆蓋所有可能的原因,因為這些錯誤原因差別很大,而且主要取決于代碼。

在以下章節中,每次提到服務端渲染,它就與兩種情況都相關(動態 SSR 和靜態站點生成),因為從技術上講,兩者都具有服務端渲染內容(除非另有說明)。

1)不合理的 HTML當激活失敗發生時,首先要檢查的應該是 HTML 是否合理,官方指南有這類踩坑提示,同時一般會有錯誤信息提示:


This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>

不幸的是,不合理的 HTML 通常不是激活失敗的原因。不過,你還是應該仔細檢查你的標記。

另外,你還要確保檢查縮小設置,因為過度的 HTML 縮小可能會導致無效的 HTML。

如果你有用戶生成的輸出或來自 CMS 的內容,需要驗證此內容也是有效的 HTML。

最后,第三方插件或服務也可能影響和操縱 HTML。后者的一個常見示例是 Cloudflare,當你啟用了它們的服務 -- 如 HTML 縮小,Rocket loader 或其他更改頁面內容的功能時。

這里有一個簡單的示例 codeandbox,其中包含無效的 HTML 并觸發了激活失敗。

2)修改 HTML 的腳本關于腳本:如果向 Vue 應用中插入第三方 JS 文件,也可以在 Vue 接收并激活來自服務器的 HTML 之前更改 HTML。

3)服務器和客戶端的狀態不同服務器和客戶端上狀態不一致是發生激活失敗最常見的原因。像往常一樣,不一致的原因千差萬別。

日期、時間戳和隨機化

當網站包含日期或者時間戳時,應盡可能小心并使其盡可能靜態,尤其在網站是靜態生成的情況下。如果客戶端評估像 new Date() 這樣的表達式,則該表達式可能會與在服務器上開發階段檢索相同日期時生成的日期不同。這也讓我對公司的“關于”頁面感到困惑,在該頁面上,我想根據當前分鐘對顯示的人員進行排序。

export const deterministicRotate = (arr) => {
if (arr.length <= 1) {
return arr
}
const rotations = (new Date()).getMinutes() % arr.length

return rotations ? arr : arr.reverse()
}

如果用戶打開頁面的時間很奇怪,則計劃將陣列反轉。當使用動態 SSR 時效果很好。但當切換到靜態生成的 JAMstack 站點時,該功能就會成為一個 Bug。你可以在一分鐘后點擊鏈接刷新,會發現名字和人正確的交換了,但圖片和原來一致。糟糕!這是由于服務器和客戶端時間不匹配導致的。在移除不確定性代碼后工作恢復正常。

  • 授權

不一致的另一個常見原因是用戶身份驗證。這適用于動態 SSR 和靜態站點生成。當僅在客戶端(例如,在 localStorage 中)上存儲身份驗證狀態時,服務器“不知道身份驗證”。這將不可避免地導致激活問題,因為登錄時服務器和客戶端信息根本不同。因此,如果服務器不知道正在靜態生成頁面的身份驗證狀態**,**則不應在服務器端呈現任何與身份驗證相關的組件。你可能想知道為什么它總是適用于靜態網站:因為當生成網站時,它是 HTML,而序列化的代碼是“無狀態的”。在構建階段,我們無法考慮“已登錄的用戶狀態”。這意味著必須從服務器上的渲染中排除所有與身份驗證相關的組件。

  • 其他原因

除了這兩種情況外,還有更多邊緣情況可能會打擊你并引起不一致。即使未在此處列出,我們也將解決激活錯誤!首先,我們應該將其范圍縮小到導致問題的 DOM 元素。

4. 解決激活失敗問題

1)發現導致激活失敗的元素我們可以使用您最喜愛的瀏覽器上的 devTools 縮小問題到一個特定的組件或者 DOM 元素。

  • 確保你在開發環境下
  • 打開開發調試工具
  • 觸發激活警告(通常通過重載網頁)
  • 展開[Vue Warn] The client side ...錯誤消息查看追蹤堆棧(取決于瀏覽器,也打開彈出的 VueJS 列表)
  • 點擊一個激活回調,將會打開 Vue 激活函數的源代碼
  • 現在,無論何時這個函數返回 false 都設置一個 debugger,在撰寫文本時,這種情況發生了三遍:
if (process.env.NODE_ENV !== 'production') {
if (!assertNodeMatch(elm, vnode, inVPre)) {
return false //HERE
}
}
if (process.env.NODE_ENV !== 'production' &&
typeof console !== 'undefined' &&
!hydrationBailed
) {
hydrationBailed = true;
console.warn('Parent: ', elm);
console.warn('server innerHTML: ', i);
console.warn('client innerHTML: ', elm.innerHTML);
}
return false //HERE
}
 if (process.env.NODE_ENV !== 'production' &&
typeof console !== 'undefined' &&
!hydrationBailed
) {
hydrationBailed = true;
console.warn('Parent: ', elm);
console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
}
return false //HERE
}

這同樣允許在激活失敗前檢查激活函數的參數。

  • 最后但同樣重要的是,讓激活錯誤復現,通常再次重載頁面是有可能的但有時更困難
  • 你現在看到觸發了我們的一個斷點,腳本停止執行了
  • 現在打開調試工具的控制臺,在激活失敗的地方寫一個元素去獲取 DOM 元素。使用 DOM 元素,你將能夠將激活錯誤追溯到你的 Vue 組件之一
  • 繼續執行下一步 PS:這是用戶 budden73對此 StackOverflow 答案改編后的問題定位順序。

2)確保你的 HTML 標記合理現在你發現了導致問題的代碼,你首先要做的事確保你的標記(也許來自一個 API)是合理的。像這樣的代碼<p><p>Text</p></p> 無效,因為一個p元素不允許在其中包含其他塊元素(如段落標簽)。但是注意,標記不允許像

這樣的標簽作為子元素,這些標記是 Vue 過渡的默認標記。你可以通過<Transition tag="div">進行改變。因為一個p元素不允許在其中包含其他塊元素(如段落標簽)。但是注意,標記不允許像

3)解決服務器與客戶端之間的不一致在 debugger 期間,你能夠從服務器看到結果和重新繪制客戶端側。如果存在不同,你可以看一看,你是如何獲取數據和你在服務端或客戶端渲染了什么。一個常見的問題是靜態網頁的認證,因為 HTML 在構建時生成的是無狀態的,因此不知道任何授權狀態,你應用的所有和授權有關的部分都應該在客戶端重新渲染。否則,在客戶端有授權狀態的用戶,因為登錄而期望從服務端獲取不同的 HTML。然后只剩下一個方案...

4)最終避免措施:最后一個解決激活錯誤的選擇是完全避免組件出現激活錯誤。這對于在靜態生成的頁面上與身份驗證相關的組件來說是必須的,有時對于交付你不能更改但必須嵌入的內容的組件(例如,來自第三方應用程序)也是必需的。正如我們在一開始了解到的,激活僅發生在組件被同時渲染在服務端和客戶端時。為了避免激活失敗,可以通過標簽避免重新渲染服務端組件。唯一的缺點:該組件不包含在服務器返回的 HTML 中,對 SEO 沒有幫助。

5. 總結

這篇文章結束了!現在你了解了更多關于 vue 激活失敗的知識:

  • 什么是激活以及它做了什么?
  • 激活怎么失敗的以及如何發現激活失敗?
  • 激活失敗的一般原因
  • 如何調試激活失敗及解決你的應用程序

我希望這篇文章很有見解,并且你學到了一兩件事。你是否遇到了此處未描述的激活錯誤原因,或者我錯過了一個常見原因?隨時在 Twitter 上或通過郵件給我發消息。而且像往常一樣 —— 如果您能宣傳并與同事分享博客文章,我將很高興。

三、踩坑小結

這篇博客講到了大多數我在服務端渲染中遇到的客戶端激活失敗報錯問題,甚至也包括了我沒有遇到的問題。當然這篇博客也有不足,比如這是 2020 年的文章,其中一些問題也許有了新的進展,當然可能也有許多如我一般的新手還在踩坑。最后整理一下我在開發期間學習踩坑所得經驗:

1. 同構

因為我們采用同構的目的是寫一份盡量通用的代碼, 讓它運行在兩端。所以我們需要熟悉不同端的運行環境, 至少要熟悉相關 API,Node.js 端是沒有瀏覽器對象的, 所以 window, document, DOM 操作都沒法執行。同理, 瀏覽器端是沒有 process 對象的,他們各自的 API 實現也有差別, 這點需要特別留意。還有比較麻煩的就是第三方庫的引入, 有時候你并不知道引入的庫能不能完全運行在 Node 端/瀏覽器端,如果它只能運行在純瀏覽器環境, 那可以在 created 階段之后引入和執行來避開 Node.js 下執行。

2. 數據預取問題

問題:使用 v-html 注入動態獲取的 HTML 內容的時候. 如果 HTML 內容有<script>

所包含的 JS 代碼, 會發現 script 中的事件綁定失效。

分析:其實在這里頁面被渲染了兩次, 第一次是發生在 SSR 直接交給瀏覽器的時候: 此時<script>完整被渲染在瀏覽器里, 其內容正常執行, 事件綁定也正常的綁定在了當時的 DOM 元素上。而第二次渲染時, 走的是 CSR: 在這時由于是以 v-html 的方式來渲染替換 HTML, 但是 v-html 實質上是 innerHTML 操作, 這樣<script>雖然會被替換上去, 但是其中的內容不會執行(innerHTML 為安全性考慮而設計)。所以經過這樣兩次渲染之后, 此時的 DOM 元素是第二次渲染時得到的, 而正常執行過的 JS 的事件綁定是綁在在第一次渲染出來的 DOM 元素上, 這樣就出現了雖然 DOM 存在,但是無法觸發該 DOM 上的事件的情況。

解決方法: 將獲取到的 HTML 內容進行匹配, 剔出<script>內容, 無論第一次或第二次渲染, 只將內容交給 v-html 頁面, 然后單獨在生命周期 updated(頁面已將 HTML 內容渲染完成)中將<script>創建出來, 添加到頁面里自動執行, 實現綁定。并在下一次頁面重渲染(可能是頁面跳轉來到)時判斷<script>是否存在, 如果真則先刪去再添加, 這樣避免添加多余的<script>塊。

** 那么頁面為什么會渲染兩次呢? **

這是由于 Vue SSR 在初始頁面渲染完成后會有一次 hydration 過程, 在這個過程中會照常執行流程 mounted 等生命周期。此時會判定是否此時的組件渲染出的內容與 SSR 渲染得到的內容一致, 如果出現不一致就會單獨執行一次額外的 CSR(客戶端激活失敗), 以達到頁面被能正確地渲染。而因為我們使用了 v-html, 這個過程只有在 CSR 時才會被執行, 所以導致了兩次渲染出來的內容不一致, 觸發了 Vue SSR 的”補償渲染機制”, 進而執行了第二次渲染。

參考文章

  • [Vue SSR 指南] (https://ssr.vuejs.org/zh/guide/hydration.html)
  • [What to do when Vue hydration fails] (https://blog.lichter.io/posts/vue-hydration-error/)
  • [徹底理解服務端渲染 - SSR 原理 ] (https://github.com/yacan8/blog/issues/30)
  • [Vue.js 服務端渲染(SSR)不完全指北] (https://lqs469.com/Vue.js%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B8%B2%E6%9F%93(SSR)%E4%B8%8D%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8C%97/)
  • [從頭開始,徹底理解服務端渲染原理(8 千字匯總長文)] (https://juejin.cn/post/6844903881390964744#heading-16)
責任編輯:姜華 來源: 微醫大前端技術
相關推薦

2021-02-15 15:36:20

Vue框架數組

2021-02-22 14:04:47

Vue框架項目

2025-02-18 00:00:05

vue后端權限

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2018-06-07 13:17:12

契約測試單元測試API測試

2023-07-06 13:56:14

微軟Skype

2021-02-06 08:34:49

函數memoize文檔

2022-11-01 08:46:20

責任鏈模式對象

2021-01-29 08:32:21

數據結構數組

2020-10-15 06:56:51

MySQL排序

2021-08-04 09:32:05

Typescript 技巧Partial

2022-08-08 08:25:21

Javajar 文件

2019-02-13 14:15:59

Linux版本Fedora

2018-11-29 09:13:47

CPU中斷控制器

2023-05-15 08:38:58

模板方法模式

2021-01-01 09:01:05

前端組件化設計

2020-08-12 08:34:16

開發安全We

2022-10-08 11:33:56

邊緣計算云計算
點贊
收藏

51CTO技術棧公眾號

美国一区二区| 99热99re6国产在线播放| 美腿丝袜一区二区三区| 亚洲深夜福利在线| 超碰在线播放91| 麻豆av在线免费看| 99视频精品在线| 91精品国产综合久久久久久蜜臀| 久久久久无码精品国产| 久久99蜜桃| 欧美成人免费网站| 九色porny91| 日本大胆在线观看| 欧美激情中文字幕| 国产精品亚洲综合| 中文字字幕在线观看| 黄色成人精品网站| 色偷偷9999www| 久久久久久久久免费看无码 | 亚洲动漫第一页| 日韩高清dvd| 日韩在线一区二区三区四区| 蜜桃视频在线观看一区| 2019av中文字幕| 欧美日韩午夜视频| 欧美一级精品| 亚洲欧美在线一区| 日韩av无码一区二区三区不卡| 精品久久福利| 日本韩国欧美一区二区三区| 免费一级淫片aaa片毛片a级| 日本www在线观看| 欧美国产精品劲爆| 蜜桃视频在线观看91| 丰满人妻一区二区三区免费视频| 精品伊人久久久久7777人| 奇米成人av国产一区二区三区| 久久久久久久极品内射| 日韩在线二区| 最好看的2019的中文字幕视频| 少妇久久久久久久久久| 日韩精选在线| 日韩成人小视频| 国产69视频在线观看| 亚洲日本va中文字幕| 日韩一级完整毛片| 国产传媒免费观看| 91精品视频一区二区| 欧美日韩中文精品| 天天插天天操天天射| 天天综合网站| 色一情一乱一乱一91av| www.亚洲天堂网| 在线天堂新版最新版在线8| 亚洲成a人片在线观看中文| 91黄色在线看| 成人观看网址| 岛国av在线不卡| 少妇人妻在线视频| 新版的欧美在线视频| 狠狠躁夜夜躁人人躁婷婷91 | 国产乱码精品| 欧美重口另类videos人妖| 欧美 日韩 精品| 久久激情网站| 国产日本欧美一区| a级片在线播放| 丁香另类激情小说| 精品一区二区视频| 国产小视频免费在线网址| 国产日韩精品久久久| 天堂av一区二区| 91.com在线| 成年人看的免费视频| 91亚洲一区| 欧美巨大黑人极品精男| 香蕉视频一区二区| 亚洲欧美日韩国产综合精品二区| 久久国产天堂福利天堂| 久久久美女视频| 亚洲自拍另类| 国产精国产精品| 91久久精品国产91性色69| 国产凹凸在线观看一区二区| 精品91免费| 粉嫩av一区| 一区二区三区在线免费视频| 国产精品50p| 久久久久久久性潮| 日韩美女一区二区三区四区| 亚洲国产欧美视频| 999国产精品| 久久久中文字幕| 中文字幕永久在线| 国产成人精品1024| 视频一区二区在线| 好久没做在线观看| 日本高清免费不卡视频| 又大又长粗又爽又黄少妇视频| 亚洲第一论坛sis| 久久色精品视频| 成人毛片18女人毛片| 美女任你摸久久| 精品日韩电影| 国产黄色在线网站| 欧美最猛性xxxxx直播| 男人添女人荫蒂国产| 日本道不卡免费一区| 久久久久久久久中文字幕| 中文字幕日韩三级| av综合在线播放| 大桥未久一区二区三区| 大胆人体一区二区| 欧美成人video| 欧美xxxx精品| 亚洲欧美日韩精品一区二区| 福利精品视频| 精品51国产黑色丝袜高跟鞋| 色悠久久久久综合欧美99| 丰满饥渴老女人hd| 欧美wwwww| 日韩av免费看网站| 手机在线精品视频| 亚洲精品欧美专区| 8x8x成人免费视频| 欧美日韩国产一区二区三区不卡| 97国产suv精品一区二区62| 国产精品久久久久久久成人午夜| 久久久不卡网国产精品一区| www.av毛片| 日韩av综合| www.日韩.com| 91精品国产乱码久久久久| 久久精品亚洲国产奇米99| 精品少妇一区二区三区在线| 成人av地址| 欧美国产第二页| 精品国产999久久久免费| 国产精品天美传媒沈樵| mm1313亚洲国产精品无码试看| 人妖一区二区三区| 51午夜精品视频| 天天综合天天色| 偷拍亚洲欧洲综合| 欧亚乱熟女一区二区在线| 狠狠入ady亚洲精品经典电影| 国产乱肥老妇国产一区二| 亚洲天天影视| 欧美卡1卡2卡| 在线观看美女av| 国产精品白丝av| 久久综合亚洲精品| 97超碰成人| 国语自产在线不卡| 囯产精品久久久久久| 亚洲永久精品国产| 日本不卡视频一区| 99精品国产在热久久| 黑人另类av| 中文字幕 在线观看| 亚洲欧美国产一区二区三区| 日韩综合在线观看| 国产精品成人免费在线| 青青草原播放器| 黄色成人av网站| 免费试看一区| 久久精品黄色| 欧美黄色www| 午夜性色福利视频| 欧洲国内综合视频| 男女性高潮免费网站| 丰满白嫩尤物一区二区| 欧美成人三级在线视频| 夜夜春成人影院| 91九色精品视频| 欧美另类tv| 亚洲人成电影网站色xx| 91精品国产色综合久久不8| 亚洲综合视频在线| 一区二区精品免费| 激情五月播播久久久精品| 免费一级淫片aaa片毛片a级| 亚洲丝袜美腿一区| 91精品视频观看| 极品av在线| 久久精品成人欧美大片古装| 亚洲av无码一区二区三区dv| 欧美日韩在线第一页| 黄色精品视频在线观看| 成人av免费在线| 国产原创精品在线| 黑人一区二区| 一本色道久久99精品综合| 永久免费精品视频| 国产精品视频xxx| 男插女视频久久久| 一区二区三区四区精品| 亚洲乱码国产乱码精品精软件| 在线观看日韩精品| 久久久久无码国产精品| 国产精品美女视频| 波多野结衣视频播放| 精品一区二区av| 丰满少妇被猛烈进入高清播放| 国产精品久久观看| 久久精品日产第一区二区三区乱码 | 国产农村老头老太视频| 午夜欧美视频在线观看| 无码人妻精品中文字幕| 久久九九影视网| 好男人香蕉影院| 国产一区激情在线| 黄色av免费在线播放| 亚洲性人人天天夜夜摸| 中文字幕中文字幕99| 精品一区免费| 国产一区二区免费电影| 美女国产精品久久久| 国产精品久久久一区| 亚洲福利影院| 国语自产精品视频在免费| 高h视频在线观看| 伊人亚洲福利一区二区三区| 日韩在线视频免费| 欧美sm极限捆绑bd| 国产偷人妻精品一区二区在线| 91福利在线导航| 伊人中文字幕在线观看| 午夜精品久久久| 伊人国产在线观看| 亚洲激情校园春色| 91免费公开视频| 亚洲天堂网中文字| 午夜成人亚洲理伦片在线观看| 日本一区二区三区在线观看| 美女被到爽高潮视频| 91日韩在线专区| 国产精品jizz| 91啪亚洲精品| 日本aaa视频| 91在线小视频| 久久亚洲AV成人无码国产野外| 成人a区在线观看| 欧美大喷水吹潮合集在线观看| 国产成人在线视频网站| 日批视频在线看| 国产成人免费在线视频| 佐佐木明希电影| 高清日韩电视剧大全免费| 亚洲911精品成人18网站| 国产成人99久久亚洲综合精品| 四虎国产精品永久免费观看视频| 国产精品66部| 在线中文字日产幕| 成人av片在线观看| 人妻熟女aⅴ一区二区三区汇编| 91婷婷韩国欧美一区二区| 亚洲最大成人网站| 国产欧美精品国产国产专区| 摸摸摸bbb毛毛毛片| 国产精品卡一卡二卡三| 久久免费看少妇高潮v片特黄| 亚洲欧美激情一区二区| 国产性70yerg老太| 欧美日韩国产精品专区| 国产熟妇一区二区三区四区| 精品视频一区 二区 三区| 艳妇乳肉豪妇荡乳av| 欧美一级片在线观看| 欧美自拍第一页| 亚洲人成电影网站色www| 日本成人网址| 久久久亚洲天堂| 欧洲av一区二区| 96pao国产成视频永久免费| 中文字幕一区图| 欧美日韩国产不卡在线看| 日韩欧美1区| 成人av在线不卡| 日韩电影免费在线| 污免费在线观看| 99久久精品国产精品久久| 国产精久久一区二区三区| 亚洲欧洲一区二区在线播放| 久久久久香蕉视频| 在线观看一区二区视频| 精品国产99久久久久久宅男i| 日韩电影大片中文字幕| 午夜免费福利在线观看| 欧美大胆在线视频| 欧美大片高清| 99久久综合狠狠综合久久止| 亚洲自拍都市欧美小说| 日韩精品第1页| 久久青草久久| 日本泡妞xxxx免费视频软件| 久久久不卡影院| 精品人妻在线播放| 欧美日韩精品欧美日韩精品一综合| 亚洲AV无码乱码国产精品牛牛| 伊人一区二区三区久久精品| 丰乳肥臀在线| 成人做爰www免费看视频网站| 西野翔中文久久精品国产| 强开小嫩苞一区二区三区网站| 男人的天堂亚洲在线| 欧美激情一区二区三区p站| 日本一区二区三区视频视频| 国产精品第108页| 欧美精品少妇一区二区三区| 你懂的在线观看视频网站| 欧美激情精品久久久| 999精品视频在线观看| 欧洲国产精品| 国产欧美日本| 日本中文字幕精品| 综合激情成人伊人| 97se视频在线观看| 亚洲人视频在线观看| 按摩亚洲人久久| 色8久久影院午夜场| 国产在线精品日韩| 韩国亚洲精品| 午夜免费视频网站| 中文字幕精品一区二区三区精品 | 极品av少妇一区二区| 婷婷激情小说网| 国产精品久久久久永久免费观看 | 91香蕉一区二区三区在线观看| 欧美性jizz18性欧美| 四虎精品一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 成人黄色毛片| 日本高清视频一区二区三区| 米奇777在线欧美播放| 日韩无码精品一区二区| 亚洲一区二区影院| 国产成人毛毛毛片| 久久国产加勒比精品无码| 婷婷成人av| 国产树林野战在线播放| 精品亚洲国产成人av制服丝袜 | 午夜视频在线观看一区二区 | japansex久久高清精品| 亚洲色图自拍| 美腿丝袜亚洲综合| 一级免费黄色录像| 欧美久久久久久久久| 超碰公开在线| 91视频免费进入| 影音先锋一区| 中国一级特黄录像播放| 精品国产精品自拍| 视频国产一区二区三区| 日本一区二区在线播放| 欧美日韩国产高清电影| 超碰成人在线播放| 亚洲精品写真福利| 亚洲乱码在线观看| 91国偷自产一区二区三区的观看方式| 久久超级碰碰| 日本熟妇人妻xxxxx| 国产免费观看久久| 国产精品视频一区二区三区,| 欧美成人中文字幕| 精品精品国产毛片在线看| 欧美日韩亚洲第一| 国产欧美综合在线观看第十页| 91亚洲欧美激情| 欧美日韩国产999| 日韩高清影视在线观看| 日韩福利视频在线| 亚洲手机成人高清视频| 亚洲国产精品久久久久爰性色| 91禁外国网站| 日韩精品中文字幕第1页| 欧美人与性动交α欧美精品| 午夜精品福利在线| 国产乱视频在线观看| 91免费版网站在线观看| 国产亚洲在线观看| 影音先锋男人看片资源| 欧美xxxxxxxx| 韩日精品一区| 中文字幕在线中文| 国产性天天综合网| 99久久夜色精品国产亚洲| 欧美亚洲另类在线| 欧美激情成人| 成人免费无码大片a毛片| 欧日韩精品视频| 成人免费网站观看| 伊人狠狠色丁香综合尤物| 成年人网站91| 在线免费观看av片| 亚州av一区二区| 一区二区三区在线| av女人的天堂| 亚洲精品一区二区三区精华液| 日韩黄色在线|