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

Webpack 原理系列十:HMR 原理全解析

開發
HMR 全稱 Hot Module Replacement,中文語境通常翻譯為模塊熱更新,它能夠在保持頁面狀態的情況下動態替換資源模塊,提供絲滑順暢的 Web 頁面開發體驗。

[[423457]]

一、什么是 HMR

HMR 全稱 Hot Module Replacement,中文語境通常翻譯為模塊熱更新,它能夠在保持頁面狀態的情況下動態替換資源模塊,提供絲滑順暢的 Web 頁面開發體驗。

HMR 最初由 Webpack 設計實現,至今已幾乎成為現代工程化工具必備特性之一。

1.1 HMR 之前

在 HMR 之前,應用的加載、更新是一種頁面級別的原子操作,即使只是單個代碼文件發生變更都需要刷新整個頁面才能最新代碼映射到瀏覽器上,這會丟失之前在頁面執行過的所有交互與狀態,例如:

對于復雜表單場景,這意味著你可能需要重新填充非常多字段信息

彈框消失,你必須重新執行交互動作才會重新彈出

再小的改動,例如更新字體大小,改變備注信息都會需要整個頁面重新加載執行,影響開發體驗。引入 HMR 后,雖然無法覆蓋所有場景,但大多數小改動都可以實時熱更新到頁面上,從而確保連續、順暢的開發調試體驗,對開發效率有較大增益效果。

1.2 使用 HMR

Webpack 生態下,只需要經過簡單的配置即可啟動 HMR 功能,大致上分兩步:

配置 devServer.hot 屬性為 true,如:

  1. // webpack.config.js 
  2. module.exports = { 
  3.   // ... 
  4.   devServer: { 
  5.     // 必須設置 devServer.hot = true,啟動 HMR 功能 
  6.     hot: true 
  7.   } 
  8. }; 
  • 之后,還需要調用 module.hot.accept 接口,聲明如何將模塊安全地替換為最新代碼,如:
  1. import component from "./component"
  2. let demoComponent = component(); 
  3.  
  4. document.body.appendChild(demoComponent); 
  5. // HMR interface 
  6. if (module.hot) { 
  7.   // Capture hot update 
  8.   module.hot.accept("./component", () => { 
  9.     const nextComponent = component(); 
  10.  
  11.     // Replace old content with the hot loaded one 
  12.     document.body.replaceChild(nextComponent, demoComponent); 
  13.  
  14.     demoComponent = nextComponent; 
  15.   }); 

模塊代碼的替換邏輯可能非常復雜,幸運的是我們通常不太需要對此過多關注,因為業界許多 Webpack Loader 已經提供了針對不同資源的 HMR 功能,例如:

  • style-loader 內置 Css 模塊熱更
  • vue-loader 內置 Vue 模塊熱更
  • react-hot-reload 內置 React 模塊熱更接口

因此,站在使用的角度,只需要針對不同資源配置對應支持 HMR 的 Loader 即可,很容易上手。

二、實現原理

Webpack HMR 特性的原理并不復雜,核心流程:

  1. 使用 webpack-dev-server (后面簡稱 WDS)托管靜態資源,同時以 Runtime 方式注入 HMR 客戶端代碼
  2. 瀏覽器加載頁面后,與 WDS 建立 WebSocket 連接
  3. Webpack 監聽到文件變化后,增量構建發生變更的模塊,并通過 WebSocket 發送 hash 事件
  4. 瀏覽器接收到 hash 事件后,請求 manifest 資源文件,確認增量變更范圍
  5. 瀏覽器加載發生變更的增量模塊
  6. Webpack 運行時觸發變更模塊的 module.hot.accept 回調,執行代碼變更邏輯
  7. done

接下來我會展開 HMR 的核心源碼,詳細講解 Webpack 5 中 Hot Module Replacement 原理的關鍵部分,內容略微晦澀,不感興趣的同學可以直接跳到下一章。

2.1 注入 HMR 客戶端運行時

執行 npx webpack serve 命令后,WDS 調用 HotModuleReplacementPlugin 插件向應用的主 Chunk 注入一系列 HMR Runtime,包括:

  • 用于建立 WebSocket 連接,處理 hash 等消息的運行時代碼
  • 用于加載熱更新資源的 RuntimeGlobals.hmrDownloadManifest 與 RuntimeGlobals.hmrDownloadUpdateHandlers 接口
  • 用于處理模塊更新策略的 module.hot.accept 接口
  • 等等

關于 Webpack Runtime,可參考 Webpack 原理系列六:徹底理解 Webpack 運行時。

經過 HotModuleReplacementPlugin 處理后,構建產物中即包含了所有運行 HMR 所需的客戶端運行時與接口。這些 HMR 運行時會在瀏覽器執行一套基于 WebSocket 消息的時序框架,如圖:

2.2 增量構建

除注入客戶端代碼外,HotModuleReplacementPlugin 插件還會借助 Webpack 的 watch 能力,在代碼文件發生變化后執行增量構建,生成:

  • manifest 文件:JSON 格式文件,包含所有發生變更的模塊列表,命名為 [hash].hot-update.json
  • 模塊變更文件:js 格式,包含編譯后的模塊代碼,命名為 [hash].hot-update.js增量構建完畢后,Webpack 將觸發 compilation.hooks.done 鉤子,并傳遞本次構建的統計信息對象 stats。WDS 則監聽 done 鉤子,在回調中通過 WebSocket 發送模塊更新消息:
  1. {"type":"hash","data":"${stats.hash}"

實際效果:

2.3 加載更新

客戶端接受到 hash 消息后,首先發出 manifest 請求獲取本輪熱更新涉及的 chunk,如:

注意,在 Webpack 4 及之前,熱更新文件以模塊為單位,即所有發生變化的模塊都會生成對應的熱更新文件; Webpack 5 之后熱更新文件以 chunk 為單位,如上例中,main chunk 下任意文件的變化都只會生成 main.[hash].hot-update.js 更新文件。

manifest 請求完成后,客戶端 HMR 運行時開始下載發生變化的 chunk 文件,將最新模塊代碼加載到本地。

2.4module.hot.accept回調

經過上述步驟,瀏覽器加載完最新模塊代碼后,HMR 運行時會繼續觸發 module.hot.accept 回調,將最新代碼替換到運行環境中。

module.hot.accept 是 HMR 運行時暴露給用戶代碼的重要接口之一,它在 Webpack HMR 體系中開了一個口子,讓用戶能夠自定義模塊熱替換的邏輯。module.hot.accept 接口簽名如下:

  1. module.hot.accept(path?: string, callback?: function); 

它接受兩個參數:

  • path:指定需要攔截變更行為的模塊路徑
  • callback:模塊更新后,將最新模塊代碼應用到運行環境的函數

例如,對于如下代碼:

  1. // src/bar.js 
  2. export const bar = 'bar' 
  3.  
  4. // src/index.js 
  5. import { bar } from './bar'
  6. const node = document.createElement('div'
  7. node.innerText = bar; 
  8. document.body.appendChild(node) 
  9.  
  10. module.hot.accept('./bar.js'function () { 
  11.     node.innerText = bar; 
  12. }) 

示例中,module.hot.accept 函數監聽 ./bar.js 模塊的變更事件,一旦代碼發生變動就觸發回調,將 ./bar.js 導出的值應用到頁面上,從而實現熱更新效果。

module.hot.accept 的作用并不復雜,但使用過程中還是有一些值得注意的點,下面細講。

2.4.1 失敗兜底

module.hot.accept 函數只接受具體路徑的 path 參數,也就是說我們無法通過 glob 或類似風格的方式批量注冊熱更新回調。

一旦某個模塊沒有注冊對應的 module.hot.accept 函數后,HMR 運行時會執行兜底策略,通常是刷新頁面,確保頁面上運行的始終是最新的代碼。

2.4.2 更新事件冒泡

在 Webpack HMR 框架中,module.hot.accept 函數只能捕獲當前模塊對應子孫模塊的更新事件,例如對于下面的模塊依賴樹:

示例中,更新事件會沿著模塊依賴樹自底向上逐級傳遞,從 foo 到 index ,從 bar-1 到 bar 再到 index,但不支持反向或跨子樹傳遞,也就是說:

  • 在 foo.js 中無法捕獲 bar.js 及其子模塊的變更事件
  • 在 bar-1.js 中無法捕獲 bar.js 的變更事件

這一特性與 DOM 事件規范中的冒泡過程極為相似,使用時如果摸不準模塊的依賴關系,建議直接在應用的入口文件中編寫熱更新函數。

2.4.3 無參數調用

除上述調用方式外,module.hot.accept 函數還支持無參數調用風格,作用是捕獲當前文件的變更事件,并從模塊第一行開始重新運行該模塊的代碼,例如:

  1. // src/bar.js 
  2. console.log('bar'); 
  3.  
  4. module.hot.accept(); 

示例模塊發生變動之后,會從頭開始重復執行 console.log 語句。

2.5 小結

回顧整個 HMR 過程,所有的狀態流轉均由 WebSocket 消息驅動,這部分邏輯由 HMR 運行時控制,開發者幾乎無感。

唯一需要開發者關心的是為每一個需要處理熱更新的文件注冊 module.hot.accept 回調,所幸這部分需求已經被許多成熟的 Loader 處理,作為示例,下一節我們挖掘 vue-loader 源碼,學習如何靈活使用 module.hot.accept 函數處理文件更新。

三、 vue-loader 如何實現 HMR

vue-loader 是一個用于處理 Vue Single File Component 的 Webpack 加載器,它能夠將如下格式的內容轉譯為可在瀏覽器運行的等價代碼:

除常規的代碼轉譯外,在 HMR 模式下,vue-loader 還會為每一個 Vue 文件注入一段處理模塊替換的邏輯,如:

  1. "./src/a.vue"
  2. /*!*******************!*\ 
  3.     !*** ./src/a.vue ***! 
  4.     \*******************/ 
  5. /***/ 
  6. ((module, __webpack_exports__, __webpack_require__) => { 
  7.     // 模塊代碼 
  8.     // ... 
  9.     /* hot reload */ 
  10.     if (true) { 
  11.     var api = __webpack_require__( /*! ../node_modules/vue-hot-reload-api/dist/index.js */ "../node_modules/vue-hot-reload-api/dist/index.js"
  12.     api.install(__webpack_require__( /*! vue */ "../node_modules/vue/dist/vue.runtime.esm.js")) 
  13.     if (api.compatible) { 
  14.         module.hot.accept() 
  15.         if (!api.isRecorded('45c6ab58')) { 
  16.         api.createRecord('45c6ab58', component.options) 
  17.         } else { 
  18.         api.reload('45c6ab58', component.options) 
  19.         } 
  20.         module.hot.accept( /*! ./a.vue?vue&type=template&id=45c6ab58& */ "./src/a.vue?vue&type=template&id=45c6ab58&", __WEBPACK_OUTDATED_DEPENDENCIES__ => { 
  21.         /* harmony import */ 
  22.         _a_vue_vue_type_template_id_45c6ab58___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__( /*! ./a.vue?vue&type=template&id=45c6ab58& */ "./src/a.vue?vue&type=template&id=45c6ab58&"); 
  23.         (function () { 
  24.             api.rerender('45c6ab58', { 
  25.             render: _a_vue_vue_type_template_id_45c6ab58___WEBPACK_IMPORTED_MODULE_0__.render, 
  26.             staticRenderFns: _a_vue_vue_type_template_id_45c6ab58___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns 
  27.             }) 
  28.         })(__WEBPACK_OUTDATED_DEPENDENCIES__); 
  29.         }) 
  30.     } 
  31.     } 
  32.     // ... 
  33.  
  34.     /***/ 
  35. }), 

這段被注入用于處理模塊熱替換的代碼,主要步驟有:

  • 首次執行時,調用 api.createRecord 記錄組件配置,api 為 vue-hot-reload-api 庫暴露的接口
  • 執行 module.hot.accept() 語句,監聽當前模塊變更事件,當模塊發生變化時調用 api.reload
  • 執行 module.hot.accept("xxx.vue?vue&type=template&xxxx", fn) ,監聽 Vue 文件 template 代碼的變更事件,當 template 模塊發生變更時調用 api.rerender

為什么需要調用兩次 module.hot.accept?

這是因為 vue-loader 在做轉譯時,會將 SFC 不同板塊拆解成多個 module,例如: template 對應生成 xxx.vue?vue&type=template ;script 對應生成 xxx.vue?vue&type=script。因此,vue-loader 必須為這些不同的 module 分別調用 accept 接口,才能處理好不同代碼塊的變更事件。

可以看到,vue-loader 對 HMR 的支持,基本上圍繞 vue-hot-reload-api 展開,當代碼文件發生變化觸發 module.hot.accept 回調時,會根據情況執行 vue-hot-reload-api 暴露的 reload 與 rerender 函數,兩者最終都會觸發組件實例的 $forceUpdate 函數強制執行重新渲染。

四、總結

最后再回顧一下,Webpack 的 HMR 特性有兩個重點,一是監聽文件變化并通過 WebSocket 發送變更消息;二是需要客戶端提供配合,通過 module.hot.accept 接口明確告知 Webpack 如何執行代碼替換。整體盤下來,并沒有想象中那么困難。

本文轉載自微信公眾號「Tecvan」

 

責任編輯:姜華 來源: Tecvan
相關推薦

2021-08-26 10:30:29

WebpackTree-Shakin前端

2021-05-31 05:36:43

WebpackJavaScript 前端

2020-08-05 08:21:41

Webpack

2021-06-28 05:59:17

Webpack 前端打包與工程化

2025-05-29 08:35:00

Nacos服務注冊開發

2021-12-20 00:03:38

Webpack運行機制

2010-10-08 13:53:02

Silverlight

2024-04-26 08:41:04

ViteHMR項目

2020-07-08 14:50:18

WebpackHMR前端

2021-04-19 10:45:52

Webpack熱更新前端

2025-01-23 00:00:01

2025-06-03 04:10:00

2021-06-15 07:20:47

Webpack 機制HMR

2022-08-26 13:24:03

version源碼sources

2019-11-15 15:12:19

Windows激活KMS

2023-02-28 09:07:18

ChatGPTAI

2021-12-15 23:42:56

Webpack原理實踐

2020-12-03 10:40:23

webpack加載原理前端

2009-11-11 10:21:25

路由選擇協議

2024-06-27 08:26:10

LooperAndroid內存
點贊
收藏

51CTO技術棧公眾號

极品裸体白嫩激情啪啪国产精品| 色狠狠一区二区三区| 91麻豆高清视频| 国产精品久久久久久网站| 搜索黄色一级片| 欧美日韩破处| 9191久久久久久久久久久| 日本阿v视频在线观看| 黄色av网站在线看| 国内精品久久久久影院薰衣草| 性色av一区二区三区在线观看| 加勒比一区二区| 日韩精品一区国产| 在线看日本不卡| 毛片在线播放视频| 日本在线观看免费| 久久嫩草精品久久久久| 成人免费看片网站| 又骚又黄的视频| 美女诱惑一区| 国模叶桐国产精品一区| 日韩在线不卡av| 精品国产一区二区三区久久久蜜臀 | 国内精品视频666| 日韩女优人人人人射在线视频| 欧美日韩在线观看免费| 日韩欧美视频| 亚洲欧洲日本专区| 视频免费在线观看| 亚洲一区二区免费在线观看| 欧美人妖巨大在线| 国产成人精品无码播放| av在线视屏| 亚洲第一搞黄网站| 国产成人亚洲综合无码| 麻豆传媒视频在线| 国产精品的网站| 亚洲a∨一区二区三区| 欧美女v视频| 91论坛在线播放| 精品国产一区二区三区麻豆免费观看完整版| 国产免费一区二区三区最新不卡| 老司机免费视频一区二区| 国产成人91久久精品| 日本一区二区三区精品| 99re国产精品| 91精品91久久久久久| 日本熟妇一区二区| 亚洲福利精品| 91av福利视频| 人妻丰满熟妇av无码区| 亚洲一区二区网站| 日韩av电影手机在线| 精品免费囯产一区二区三区 | 亚洲私人黄色宅男| 资源网第一页久久久| 黄色成人影院| 夜夜嗨av一区二区三区网页| 欧美中文字幕在线观看视频 | 中文字幕免费精品| 欧美精品情趣视频| 国产一级做a爰片在线看免费 | 久久久久国产一区| 成人在线视频观看| 91麻豆精品91久久久久久清纯| 91看片破解版| 伊人久久亚洲| 亚洲精品国产欧美| a毛片毛片av永久免费| 成人aaaa| 久久成人av网站| 久久这里只有精品国产| 日韩视频一区| 国产成人久久久精品一区| 在线播放国产一区| 国产大片一区二区| 久久久久久九九| 国产特黄在线| 一区二区激情视频| 国模吧无码一区二区三区| 三级成人黄色影院| 91精品国产全国免费观看 | 蜜臀av一区| 亚洲人成网站免费播放| 操她视频在线观看| 亚洲特级毛片| 日本最新高清不卡中文字幕| 在线播放精品视频| av电影在线观看完整版一区二区| 日韩高清国产精品| 中文字幕伦理免费在线视频| 欧美日韩亚洲激情| 国产美女18xxxx免费视频| 粉嫩av一区二区| 一夜七次郎国产精品亚洲| 欧美日韩中文字幕在线观看| 久久xxxx精品视频| 91视频免费在线观看| 免费福利在线观看| 亚洲一区免费在线观看| 黄色片视频在线播放| 日韩视频一区二区三区四区| 亚洲天堂一区二区三区| 国产一级片视频| 卡一卡二国产精品| 久久久久久久免费| 牛牛精品视频在线| 欧美日韩一区二区在线观看 | 国产精品毛片高清在线完整版| 91免费国产精品| 福利一区和二区| 日韩av在线精品| 午夜爽爽爽男女免费观看| 国产精品毛片一区二区三区| 亚洲最大福利视频网站| 高清国产福利在线观看| 午夜不卡在线视频| 91亚洲一区二区| 色综合久久一区二区三区| 97精品在线视频| 精品国产99久久久久久宅男i| 久久久99免费| 欧美国产亚洲一区| 日韩在线观看中文字幕| 久久精品电影网站| 日韩 国产 欧美| 91香蕉视频黄| cao在线观看| 亚洲网址在线观看| 久久精品视频va| 亚洲国产无线乱码在线观看| 91社区在线播放| 欧美日韩二三区| jizz性欧美23| 欧美国产日韩一区二区| 国产精品久久久久久久久久久久久久久久久久 | 嗯啊主人调教在线播放视频| 欧美一区二区三区小说| 国产大屁股喷水视频在线观看| 久久国产直播| 日本不卡免费新一二三区| 中文在线8资源库| 亚洲精品一区二区三区婷婷月| 日韩免费黄色片| 99精品欧美一区| 免费av观看网址| 卡通动漫精品一区二区三区| 午夜精品久久久久久久久久久久久 | 精品国产一区二区三区在线| 伊人久久大香| 色综合久久精品亚洲国产| 亚洲av无码乱码国产精品| 亚洲欧美日本在线| 99久久综合网| 亚洲国内欧美| 久久成人资源| 日本电影欧美片| 中文字幕日韩有码| 91精品视频免费在线观看| 亚洲同性gay激情无套| 日韩va在线观看| 中文不卡在线| 精品国产乱码久久久久久丨区2区| 345成人影院| 国产一区二区美女视频| 一级二级三级视频| 亚洲精品久久久久久国产精华液| 97中文字幕在线观看| 日韩午夜av| 欧美重口乱码一区二区| 日日狠狠久久| 国模私拍视频一区| 国产小视频在线| 欧美精品一卡两卡| 久久免费黄色网址| 久久伊99综合婷婷久久伊| 天美星空大象mv在线观看视频| 天天射成人网| 国产原创精品| 欧美黄色a视频| 久久91精品国产| 四虎精品成人影院观看地址| 欧美三级韩国三级日本一级| 欧美激情精品久久| 久久天堂av综合合色蜜桃网| 91视频这里只有精品| 影音先锋在线一区| 日本一区二区不卡高清更新| 国产精品中文| 国产97在线亚洲| 国产成人午夜| 亚洲欧美日本另类| 国产免费视频一区二区三区| 日韩欧美在线字幕| 私库av在线播放| 久久精品亚洲乱码伦伦中文 | 国产精品久久久久久久免费看| 午夜视频在线观看一区二区| 极品尤物一区二区| 成人午夜精品在线| 久久国产激情视频| 亚洲制服av| 成人在线视频一区二区三区| 欧美丝袜激情| 国产精品永久入口久久久| 久久福利在线| 日本精品在线视频 | 91亚洲人成网污www| 国外成人免费视频| 精品一区二区三区亚洲| 欧美壮男野外gaytube| a级片国产精品自在拍在线播放| 亚洲欧洲一区二区三区在线观看 | 国产成a人亚洲| 777视频在线| 久久中文在线| 精品少妇人妻av免费久久洗澡| 伊人久久大香线蕉综合四虎小说| 美日韩精品免费| 超碰97成人| 亚洲精品日产aⅴ| 国产精品.xx视频.xxtv| 欧美亚洲在线观看| 1区2区在线| 久久久久久久久网站| 黄网站视频在线观看| 中文字幕亚洲天堂| 精品资源在线看| 日韩精品极品在线观看| 少妇av在线播放| 精品欧美久久久| aaa国产视频| 91精品久久久久久蜜臀| 91成人一区二区三区| 欧美色图天堂网| 自拍偷拍精品视频| 欧美亚洲国产一区二区三区va| av图片在线观看| 欧美午夜性色大片在线观看| 五月天综合激情| 精品动漫一区二区三区| 国产精品.www| 午夜在线成人av| 日本一级淫片免费放| 亚洲第一久久影院| 亚洲 欧美 视频| 欧美日韩视频免费播放| 国产精品久免费的黄网站| 日韩欧美中文在线| 久久影视中文字幕| 欧美性生交片4| 国产又粗又大又爽| 欧美一区二区三区在线观看 | 久久精品亚洲麻豆av一区二区| 四虎影成人精品a片| 久久久久国产精品麻豆ai换脸 | 日本黄色一区二区三区| 亚洲精品一区二区三区四区高清| 欧美 日韩 人妻 高清 中文| 亚洲黄色成人网| 青青青手机在线视频观看| 国产亚洲精品美女久久久| av国产在线观看| 久久在线精品视频| xxx.xxx欧美| 日本国产一区二区三区| 国产69精品久久久久9999人| 成人精品久久久| 99这里只有精品视频| 精品无人乱码一区二区三区的优势 | 97在线观看视频免费| 一区二区三区精品视频| 在线天堂中文字幕| 欧美色综合影院| 亚洲毛片欧洲毛片国产一品色| 日韩精品极品在线观看播放免费视频| 你懂的视频在线观看| 日韩视频免费中文字幕| 欧美日韩经典丝袜| 亲子乱一区二区三区电影| 国产成人精品一区二区三区视频 | 亚洲成人免费av| 精品免费囯产一区二区三区| 在线播放国产精品二区一二区四区| 性一交一乱一伧老太| 日韩国产精品视频| 欧美jizzhd欧美| 97人人模人人爽人人喊中文字 | 日韩精品午夜视频| 在线播放黄色av| 久久久噜噜噜久久人人看| 潘金莲一级黄色片| 日韩欧美a级成人黄色| 国产精品伦理一区| 亚洲精品视频网上网址在线观看| 秋霞午夜理伦电影在线观看| 97视频在线观看亚洲| 国产精品伦一区二区| 国产麻豆日韩| 国产精品x453.com| 欧美成人xxxxx| 国产精品一区在线观看你懂的| 丰满少妇一区二区| 亚洲影视在线播放| 亚洲一卡二卡在线| 精品一区二区亚洲| 欧美黄色视屏| 成人av.网址在线网站| 羞羞色国产精品网站| 喜爱夜蒲2在线| 男人的天堂久久精品| jizz日本免费| 亚洲国产视频一区二区| 一区二区精品视频在线观看| 日韩麻豆第一页| 第一中文字幕在线| 成人性生交xxxxx网站| 欧美三级伦理在线| 国产乱子夫妻xx黑人xyx真爽 | 久久精品国产一区二区三区日韩 | 亚洲国产精品久久艾草纯爱| 国产有码在线观看| 一区二区三区亚洲| 成人影院入口| 精品日本一区二区三区| 伊人久久大香线蕉av超碰演员| 在线观看av免费观看| 国产精品每日更新| 中文字幕在线播放av| 亚洲午夜精品久久久久久久久久久久| 欧亚av在线| 九九九九精品| 一区二区动漫| 国产乱了高清露脸对白| 午夜精品视频一区| 秋霞视频一区二区| 97国产真实伦对白精彩视频8| 粉嫩久久久久久久极品| 99热久久这里只有精品| 国产成人在线视频免费播放| 日韩a级片在线观看| 欧美一级生活片| 羞羞视频在线观看不卡| 9a蜜桃久久久久久免费| 综合av在线| 野花视频免费在线观看| 一个色妞综合视频在线观看| 国产黄a三级三级三级| 欧美日韩福利视频| 波多野结衣一区二区三区免费视频| 欧美这里只有精品| www..com久久爱| 久久久久久少妇| 亚洲视频网站在线观看| 欧美在线va视频| 性欧美videosex高清少妇| 九九热在线视频观看这里只有精品| 少妇视频一区二区| 欧美一级欧美三级在线观看| 日本孕妇大胆孕交无码| 国产日韩欧美综合精品| 久久成人国产| www.99re6| 欧美成人aa大片| 国产精欧美一区二区三区蓝颜男同| 日本视频一区二区不卡| 久久国产欧美日韩精品| 日本老熟俱乐部h0930| 欧美精品一区二区精品网| 老司机2019福利精品视频导航| 亚洲欧美国产不卡| 国产精品综合av一区二区国产馆| 中文字幕第28页| 亚洲人成电影在线播放| 日韩黄色碟片| 日韩人妻无码精品久久久不卡| 91女厕偷拍女厕偷拍高清| 中文字幕乱码人妻二区三区| 蜜月aⅴ免费一区二区三区| 欧美日韩看看2015永久免费| 中文字幕在线综合| 亚洲综合久久久| 国产一级片在线播放| 99国产在线| 石原莉奈一区二区三区在线观看| 久久久久人妻一区精品色| 亚洲国产精品中文| jizz欧美| 久久久久久免费看| 国产精品素人视频| 蜜桃视频污在线观看| 国产成人免费av电影| 欧美视频四区| 四季av中文字幕| 精品亚洲国产成av人片传媒| 日韩色性视频| av免费播放网址| 亚洲一区日韩精品中文字幕| 一级日本在线| 久久久com|