精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人欧美一区二区三区在线观看| 色婷婷香蕉在线一区二区| 国产精品久久久久秋霞鲁丝| 成人午夜免费影院| gogo大尺度成人免费视频| 伊人一区二区三区| 免费在线观看91| 91麻豆国产视频| av成人国产| 俺去亚洲欧洲欧美日韩| 人妻激情偷乱频一区二区三区| 韩国美女久久| 三区四区在线视频| 欧美伦理在线视频| 日韩女优电影在线观看| 欧美v在线观看| huan性巨大欧美| 国产午夜精品一区二区三区视频| 国产在线视频2019最新视频| 91久久国产视频| 久久久久久久久国产一区| 亚洲电影在线观看| 一二三av在线| 福利精品一区| 色综合久久99| 国产毛片视频网站| 国产cdts系列另类在线观看| 国产欧美日韩另类一区| 国产一区二区无遮挡| 97免费观看视频| 久久一二三区| 538国产精品一区二区免费视频| 精品无码久久久久成人漫画| 精品理论电影在线| 精品国产乱码久久| 日韩在线中文视频| 成人不卡免费视频| 绯色av蜜臀vs少妇| 人成在线免费视频| 成人免费视频视频| 91亚洲国产成人久久精品网站| 国产黄色免费观看| 亚洲国产电影| 欧美福利在线观看| 青娱乐国产精品| 婷婷综合五月| 久久黄色av网站| 又色又爽的视频| 国内成人自拍| 在线观看国产精品日韩av| 久久久久亚洲av成人无码电影| 国产精品zjzjzj在线观看| 欧美日韩一本到| 99视频在线视频| 福利一区二区| 欧美绝品在线观看成人午夜影视| 亚洲综合色在线观看| 色猫猫成人app| 欧美在线视频日韩| 天堂中文视频在线| 精品肉辣文txt下载| аⅴ资源新版在线天堂| 久久成人18免费观看| 国产精品视频自拍| 怡春院在线视频| 久久精品久久99精品久久| 国产精品久久一| 在线视频 91| 精品一区二区三区免费| 91九色国产视频| 亚洲高清视频网站| 99re视频这里只有精品| 久热国产精品视频一区二区三区 | 欧美在线色视频| 15—17女人毛片| 日韩在线观看一区二区三区| 欧美xfplay| 亚洲狠狠婷婷综合久久久久图片| 国产va免费精品观看精品视频| 永久免费看mv网站入口亚洲| 国产免费美女视频| 好看的日韩av电影| 日韩av免费在线| 91成品人影院| 成人一区在线观看| 欧美一区亚洲二区| 麻豆视频在线播放| 亚洲国产欧美在线| 成人一区二区三| 精品三级国产| 亚洲另类激情图| 久久国产高清视频| 亚洲日本视频| 国产美女久久久| 国 产 黄 色 大 片| 久久嫩草精品久久久久| 亚洲一区免费看| 3344国产永久在线观看视频| 色婷婷久久一区二区三区麻豆| 亚洲免费黄色录像| 亚洲盗摄视频| 欧美床上激情在线观看| 亚洲日本视频在线观看| 精品写真视频在线观看| 狠狠色综合一区二区| 都市激情在线视频| 亚洲国产va精品久久久不卡综合| 白嫩少妇丰满一区二区| 天堂av一区| 在线观看日韩www视频免费| 激情综合网五月天| 麻豆一区二区99久久久久| 国产精品视频免费观看| 男人在线资源站| 色综合一区二区| jjzz黄色片| 色诱av手机版| 中文字幕一区二区中文字幕| 国产专区一区二区三区| 精品视频站长推荐| 欧洲激情视频| 98精品国产高清在线xxxx天堂| 中文字幕 人妻熟女| a美女胸又www黄视频久久| 日韩亚洲欧美一区二区三区| 色片在线免费观看| 丁香社区五月天| 在线欧美三级| 日韩欧美高清在线视频| 国产亚洲色婷婷久久| 精品国产乱码久久久| 久久噜噜噜精品国产亚洲综合| 亚洲综合精品视频| 国产欧美一区二区三区鸳鸯浴 | 二区在线视频| 色偷偷88欧美精品久久久| 国产女人18毛片水真多18| 在线免费观看日本欧美爱情大片| 国产精品久久久久7777婷婷| 五月激情婷婷综合| 亚洲va欧美va国产va天堂影院| 超碰在线免费av| 久久久久久久久久久9不雅视频| 国产精品美乳一区二区免费 | 国产精品久99| 五月天av在线播放| 日韩精品中文字幕第1页| 国产不卡av在线免费观看| 亚洲区小说区图片区| 五月天久久比比资源色| 色哟哟无码精品一区二区三区| 欧美三级特黄| 91视频九色网站| 成人国产免费电影| 日韩欧美区一区二| 久一视频在线观看| 成人免费毛片嘿嘿连载视频| 日韩精品一区二区在线视频| 成人资源在线播放| 97精品国产91久久久久久| 丰满肥臀噗嗤啊x99av| 最新日韩三级| 日本不卡视频| 91xxx在线观看| 六月丁香激情综合| 欧美日韩一级大片| 国产日韩换脸av一区在线观看| 欧美亚洲另类在线| 国产99久久精品一区二区永久免费| 高清欧美性猛交xxxx| 91夜夜揉人人捏人人添红杏| 午夜精品免费视频| 黄色录像二级片| 精久久久久久久久久久| 中文字幕日韩精品久久| 亚洲精品伦理| 美女扒开尿口让男人操亚洲视频网站| 精品国自产在线观看| 亚洲一区二区五区| 素人fc2av清纯18岁| 日本色综合中文字幕| 亚洲最新免费视频| 91欧美极品| 国产99视频精品免视看7| 色开心亚洲综合| 日韩精品中午字幕| 国产99久久久| 亚洲丝袜另类动漫二区| xfplay5566色资源网站| 日韩精品乱码av一区二区| 中文字幕一区二区三区四区五区人| 中文无码日韩欧| 国产盗摄xxxx视频xxx69| 国产黄网站在线观看| 欧美精品一区二区三区四区| 无码视频在线观看| 亚洲人成亚洲人成在线观看图片| av在线播放网址| 蜜桃视频在线观看一区| a天堂资源在线观看| av伊人久久| 国产精品v欧美精品v日韩| 亚洲第一会所001| 久久久久久中文字幕| 最新av网站在线观看| 亚洲成人精品久久| 一级久久久久久久| 日韩欧美在线播放| 加勒比av在线播放| 日本一区二区三区四区在线视频| 中文字幕视频观看| 久久99久久久久| 麻豆av免费在线| 欧美性久久久| 中文字幕一区二区三区精彩视频 | 91精品免费视频| 伊人色综合一区二区三区影院视频| 久久色在线播放| 中文字幕第99页| 成年人在线观看| 欧美大片网站| 久久久久99| 一区二区三区中文字幕电影| 免费日韩av电影| 日韩精品中文字幕吗一区二区| 日韩女优在线播放| 黄色污网站在线观看| 久久综合免费视频| 18视频免费网址在线观看| 亚洲欧美国产另类| 天天操天天操天天操| 欧美一区二区免费视频| 中国老头性行为xxxx| 色哟哟在线观看一区二区三区| 久久精品女人毛片国产| 亚洲精品久久久蜜桃| 日韩激情小视频| 国产精品免费视频观看| 最新中文字幕av| 久久久久99精品国产片| 黄色a一级视频| 91在线丨porny丨国产| 亚洲av熟女高潮一区二区| 成人综合在线网站| 一二三区视频在线观看| 国产精品一色哟哟哟| 在线观看av免费观看| 极品销魂美女一区二区三区| 一女二男3p波多野结衣| 久久精品国产亚洲高清剧情介绍 | 亚洲精品不卡在线| 丰满人妻一区二区| 欧美精品一区二区三区在线| 黄频网站在线观看| 亚洲国产99精品国自产| 天堂8在线视频| 精品网站999www| 毛片在线播放网址| 国产一区二区三区日韩欧美| 成人高清免费观看mv| 中文字幕一区电影| 毛片在线看片| 欧美国产日韩一区二区| 99re6在线精品视频免费播放| 97国产精品免费视频| 欧美中文字幕精在线不卡| 国产成人精品av| 日韩欧乱色一区二区三区在线 | 136国产福利精品导航| 午夜爽爽爽男女免费观看| 亚洲资源中文字幕| 91精品国产高清一区二区三密臀| 91久久精品网| 国产精品久久成人免费观看| 乱色精品无码一区二区国产盗| 精品国产一区二区国模嫣然| 日韩专区第一页| 亚洲美女精品久久| 3p在线观看| 欧美高清在线播放| 亚洲伊人av| 成人午夜激情网| 国产福利资源一区| 欧美午夜欧美| 欧美69wwwcom| 免费黄色福利视频| 精品综合免费视频观看| 五月天丁香社区| 国产亚洲精品bt天堂精选| 搜索黄色一级片| 精品久久在线播放| 中文文字幕一区二区三三| 精品少妇一区二区| 懂色一区二区三区| 午夜精品久久久99热福利| 成人免费av电影| 国产精品成人一区二区三区| 国产va免费精品观看精品视频| www.99riav| 视频一区视频二区中文字幕| 日日干夜夜操s8| 99久久精品国产导航| 99自拍偷拍视频| 午夜精品福利一区二区三区av| 中文字幕人妻一区二区三区视频| 精品国产在天天线2019| 在线激情网站| 热久久这里只有精品| 麻豆国产精品| 亚洲精品9999| 久久不射中文字幕| 亚洲成a人无码| 亚洲欧美偷拍三级| 日本中文字幕在线观看视频| 欧美videos中文字幕| 四虎久久免费| 国产精品久久久久久亚洲调教 | 日本成人片在线| 国产日韩久久| 午夜精品视频| 亚洲美女性囗交| 国产日韩欧美不卡| 日韩 欧美 中文| 精品国产髙清在线看国产毛片| 看黄色一级大片| 国产精品一区二区三区乱码| 久久精品国产亚洲av麻豆| 亚洲综合清纯丝袜自拍| 综合国产精品久久久| 黄页在线观看免费| 国产在线精品一区免费香蕉| 日韩欧美中文字幕视频| 四虎国产精品免费久久| 久久精品视频免费| 国产一区视频观看| 日韩欧美二区| 宅男噜噜99国产精品观看免费| 日韩激情电影免费看| 97伦理在线四区| 亚洲无中文字幕| 中文字幕 欧美日韩| 国产精品乱人伦一区二区| 成人午夜精品视频| 国产一区二区三区高清在线观看| 福利小视频在线观看| 午夜精品福利在线| а√中文在线资源库| 免费97视频在线精品国自产拍| 色综合视频一区二区三区44| 色之综合天天综合色天天棕色| 久久综合中文| 一级特黄曰皮片视频| 欧美性猛交xxxxxxxx| 在线国产情侣| 91免费版网站入口| 亚洲精品a级片| 性色av浪潮av| 亚洲午夜影视影院在线观看| 丰满岳乱妇国产精品一区| 久久久久久久久久久久av| 国产成人aa在线观看网站站| 大陆极品少妇内射aaaaa| 久久久久久久久久久久久久久99| 亚洲乱码国产乱码精品| 中文字幕欧美日韩va免费视频| 成人黄页网站视频| 波多野结衣三级在线| 国产成人精品免费| 精品在线播放视频| 国产午夜精品全部视频在线播放| 亚洲精品一区三区三区在线观看| 亚洲一区二区在线观| 国产盗摄一区二区三区| 欧美精品亚洲精品日韩精品| 亚洲欧美制服综合另类| 四虎精品一区二区免费| 亚洲色成人www永久在线观看| 久久综合九色综合欧美就去吻| 最近中文字幕在线免费观看 | 国产精品视频中文字幕91| 你懂的视频一区二区| 久久久久久久久免费看无码| 欧美这里有精品| 激情av在线播放| 日韩精品伦理第一区| 国产精品一区二区在线播放| 国产情侣自拍av| 精品国产一区av| 日本一道高清一区二区三区| 一起操在线视频| 黄网站色欧美视频| 日本精品一区二区三区在线播放| 国产精品久久久久久久小唯西川| 久久精品网址| 妺妺窝人体色www聚色窝仙踪 | 亚洲综合二区| 婷婷伊人五月天| 一本色道久久综合狠狠躁篇的优点 | 日韩欧美亚洲国产一区| 欧美激情二区|