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

Webpack 性能之多進程打包

開發 前端
接下來我們繼續聊聊 Webpack 中一些行之有效的并行計算方案。緩存的本質是首輪計算后將結果保存下來,下次直接復用計算結果而跳過計算過程。

[[428278]]

在上一篇《Webpack 性能系列一: 使用 Cache 提升構建性能》中,我們討論了 Webpack 語境下如何應用各種緩存措施提升構建性能,接下來我們繼續聊聊 Webpack 中一些行之有效的并行計算方案。緩存的本質是首輪計算后將結果保存下來,下次直接復用計算結果而跳過計算過程;并行的本質則是在同一時間內并發執行多個運算,提升單位時間計算效率,兩者都是計算機科學常見的提升性能優化手段。

受限于 Node.js 的單線程架構,原生 Webpack 對所有資源文件做的所有解析、轉譯、合并操作本質上都是在同一個線程內串行執行,CPU 利用率極低,因此,理所當然地社區出現了一些基于多進程方式運行 Webpack,或 Webpack 構建過程某部分工作的方案,例如:

  • HappyPack:多進程方式運行資源加載邏輯
  • Thread-loader:Webpack 官方出品,同樣以多進程方式運行資源加載邏輯
  • TerserWebpackPlugin:支持多進程方式執行代碼壓縮、uglify 功能
  • Parallel-Webpack:多進程方式運行多個 Webpack 構建實例

這些方案的核心設計都很類似:針對某種計算任務創建子進程,之后將運行所需參數通過 IPC 傳遞到子進程并啟動計算操作,計算完畢后子進程再將結果通過 IPC 傳遞回主進程,寄宿在主進程的組件實例再將結果提交給 Webpack。

下面,我將展開介紹每種方案的使用方法、原理及缺點,讀者可按需選用。

使用 HappyPack

HappyPack 是一個使用多進程方式運行文件加載器 —— Loader 序列,從而提升構建性能的 Webpack 組件庫,算得上 Webpack 社區內最先流行的并發方案,不過作者已經明確表示不會繼續維護,推薦讀者優先使用 Webpack 官方推出的相似方案:Thread-loader。

官方鏈接:https://github.com/amireh/happypack

使用方法

基本用法

使用上,首先安裝依賴:

  1. yarn add happypack 

之后,需要將原有 loader 配置替換為 happypack/loader,如:

  1. module.exports = { 
  2.     // ... 
  3.     module: { 
  4.         rules: [{ 
  5.             test: /\.js$/, 
  6.             // 使用 happypack/loader 替換原來的 Loader 配置 
  7.             use: 'happypack/loader'
  8.             // use: [ 
  9.             //  { 
  10.             //      loader: 'babel-loader'
  11.             //      options: { 
  12.             //          presets: ['@babel/preset-env'
  13.             //      } 
  14.             //  }, 
  15.             //  'eslint-loader' 
  16.             // ] 
  17.         }] 
  18.     } 
  19. }; 

再之后,需要創建 happypack 插件實例,并將原有 loader 配置遷移到插件中,完整示例:

  1. const HappyPack = require('happypack'); 
  2.  
  3. module.exports = { 
  4.     // ... 
  5.     module: { 
  6.         rules: [{ 
  7.             test: /\.js$/, 
  8.             use: 'happypack/loader'
  9.             // use: [ 
  10.             //  { 
  11.             //      loader: 'babel-loader'
  12.             //      options: { 
  13.             //          presets: ['@babel/preset-env'
  14.             //      } 
  15.             //  }, 
  16.             //  'eslint-loader' 
  17.             // ] 
  18.         }] 
  19.     }, 
  20.     plugins: [ 
  21.         new HappyPack({ 
  22.             loaders: [ 
  23.                 { 
  24.                     loader: 'babel-loader'
  25.                     option: { 
  26.                         presets: ['@babel/preset-env'
  27.                     } 
  28.                 }, 
  29.                 'eslint-loader' 
  30.             ] 
  31.         }) 
  32.     ] 
  33. }; 

配置完畢后,再次啟動 npx webpack 命令即可使用 HappyPack 的多進程能力提升構建性能。以 Three.js 為例,該項目包含 362 份 JS 文件,合計約 3w 行代碼:

開啟 HappyPack 前,構建耗時大約為 11000ms 到 18000ms 之間,開啟后耗時降低到 5800ms 到 8000ms 之間,提升約47%。

配置多實例

上述簡單示例只能以相同的 Loader 序列處理同種文件類型,實際應用中還可以為不同的文件配置多個 相應的加載器數組,例如:

  1. const HappyPack = require('happypack'); 
  2.  
  3. module.exports = { 
  4.   // ... 
  5.   module: { 
  6.     rules: [{ 
  7.         test: /\.js?$/, 
  8.         use: 'happypack/loader?id=js' 
  9.       }, 
  10.       { 
  11.         test: /\.less$/, 
  12.         use: 'happypack/loader?id=styles' 
  13.       }, 
  14.     ] 
  15.   }, 
  16.   plugins: [ 
  17.     new HappyPack({ 
  18.       id: 'js'
  19.       loaders: ['babel-loader''eslint-loader'
  20.     }), 
  21.     new HappyPack({ 
  22.       id: 'styles'
  23.       loaders: ['style-loader''css-loader''less-loader'
  24.     }) 
  25.   ] 
  26. }; 

示例中,js、less 資源都使用 happypack/loader 作為唯一 loader,并分別賦予 id = 'js' | 'styles' 參數;其次,示例中創建了兩個 HappyPack 插件實例并分別配置了用于處理 js 與 css 的 loaders 數組,happypack/loader 與 HappyPack 實例之間通過 id 值關聯起來,以此實現多資源配置。

共享線程池

上述多實例模式更接近實際應用場景,但默認情況下,HappyPack 插件實例各自管理自身所消費的進程,導致整體需要維護一個數量龐大的進程池,反而帶來新的性能損耗。

為此,HappyPack 提供了一套簡單易用的共享進程池功能,使用上只需創建 HappyPack.ThreadPool 實例并通過 size 參數限定進程總量,之后將該實例配置到各個 HappyPack 插件的 threadPool 屬性上即可,例如:

  1. const os = require('os'
  2. const HappyPack = require('happypack'); 
  3. const happyThreadPool = HappyPack.ThreadPool({ 
  4.   size: os.cpus().length - 1 
  5. }); 
  6.  
  7. module.exports = { 
  8.   // ... 
  9.   plugins: [ 
  10.     new HappyPack({ 
  11.       id: 'js'
  12.       threadPool: happyThreadPool, 
  13.       loaders: ['babel-loader''eslint-loader'
  14.     }), 
  15.     new HappyPack({ 
  16.       id: 'styles'
  17.       threadPool: happyThreadPool, 
  18.       loaders: ['style-loader''css-loader''less-loader'
  19.     }) 
  20.   ] 
  21. }; 

使用共享進程池功能后,HappyPack 會預先創建好一組共享的 HappyThread 對象,所有插件實例的資源轉譯需求最終都會通過 HappyThread 對象轉發到空閑進程做處理,從而保證整體進程數量可控。

原理

HappyPack 的運行過程如下圖所示:

大致可劃分為:

  • happlypack/loader 接受到轉譯請求后,從 Webpack 配置中讀取出相應 HappyPack 插件實例
  • 調用插件實例的 compile 方法,創建 HappyThread 實例(或從 HappyThreadPool 取出空閑實例)
  • HappyThread 內部調用 child_process.fork 創建子進程,并執行 HappyWorkerChannel 文件
  • HappyWorkerChannel 創建 HappyWorker ,開始執行 Loader 轉譯邏輯

中間流程輾轉了幾層,最終由 HappyWorker 類重新實現了一套與 Webpack Loader 相似的轉譯邏輯,代碼復雜度較高,讀者稍作了解即可。

缺點

HappyPack 雖然確實能有效提升 Webpack 的打包構建速度,但它有一些明顯的缺點:

  • 作者已經明確表示不會繼續維護,擴展性與穩定性缺乏保障,隨著 Webpack 本身的發展迭代,可以預見總有一天 HappyPack 無法完全兼容 Webpack
  • HappyPack 底層以自己的方式重新實現了加載器邏輯,源碼與使用方法都不如 Thread-loader 清爽簡單

不支持部分 Loader,如 awesome-typescript-loader

使用 Thread-loader

Thread-loader 也是一個以多進程方式運行 loader 從而提升 Webpack 構建性能的組件,功能上與HappyPack 極為相近,兩者主要區別:

  1. Thread-loader由 Webpack 官方提供,目前還處于持續迭代維護狀態,理論上更可靠
  2. Thread-loader 只提供了一個單一的 loader 組件,用法上相對更簡單
  3. HappyPack 啟動后,會向其運行的 loader 注入 emitFile 等接口,而 Thread-loader 則不具備這一特性,因此對 loader 的要求會更高,兼容性較差

官方鏈接:https://github.com/webpack-contrib/thread-loader

使用方法

首先,需要安裝 Thread-loader 依賴:

  1. yarn add -D thread-loader 

其次,需要將 Thread-loader 配置到 loader 數組首位,確保最先運行,如:

  1. module.exports = { 
  2.   module: { 
  3.     rules: [{ 
  4.       test: /\.js$/, 
  5.       use: [ 
  6.         'thread-loader'
  7.         'babel-loader'
  8.         'eslint-loader' 
  9.       ], 
  10.     }, ], 
  11.   }, 
  12. }; 

配置完畢后,再次啟動 npx webpack 命令即可。依然以 Three.js 為例,開啟 Thread-loader 前,構建耗時大約為 11000ms 到 18000ms 之間,開啟后耗時降低到 8000ms 左右,提升約37%。

原理

Webpack 將執行 Loader 相關邏輯都抽象到 loader-runner 庫,Thread-loader 也同樣復用該庫完成 Loader 的運行邏輯,核心步驟:

  • 啟動時,以 pitch 方式攔截 Loader 執行鏈
  • 分析 Webpack 配置對象,獲取 thread-loader 后面的 Loader 列表
  • 調用 child_process.spawn 創建工作子進程,并將Loader 列表、文件路徑、上下文等參數傳遞到子進程
  • 子進程中調用 loader-runner,轉譯文件內容
  • 轉譯完畢后,將結果傳回主進程

參考:

https://github.com/webpack/loader-runner

Webpack 原理系列七:如何編寫loader

缺點

Thread-loader 是 Webpack 官方推薦的并行處理組件,實現與使用都非常簡單,但它也存在一些問題:

  • Loader 中不能調用 emitAsset 等接口,這會導致 style-loader 這一類 Loader 無法正常工作,解決方案是將這類組件放置在 thread-loader 之前,如 ['style-loader', 'thread-loader', 'css-loader']
  • Loader 中不能獲取 compilation、compiler 等實例對象,也無法獲取 Webpack 配置

這會導致一些 Loader 無法與 Thread-loader 共同使用,讀者需要仔細加以甄別、測試。

使用 Parallel-Webpack

Thread-loader、HappyPack 這類組件所提供的并行能力都僅作用于執行加載器 —— Loader 的過程,對后續 AST 解析、依賴收集、打包、優化代碼等過程均沒有影響,理論收益還是比較有限的。對此,社區還提供了另一種并行度更高,以多個獨立進程運行 Webpack 實例的方案 —— Parallel-Webpack。

官方鏈接:https://github.com/trivago/parallel-webpack

使用方法

基本用法

使用前,依然需要安裝依賴:

  1. yarn add -D parallel-webpack 

Parallel-Webpack 支持兩種用法,首先介紹的是在 webpack.config.js 配置文件中導出多個 Webpack 配置對象,如:

  1. module.exports = [{ 
  2.     entry: 'pageA.js'
  3.     output: { 
  4.         path: './dist'
  5.         filename: 'pageA.js' 
  6.     } 
  7. }, { 
  8.     entry: 'pageB.js'
  9.     output: { 
  10.         path: './dist'
  11.         filename: 'pageB.js' 
  12.     } 
  13. }]; 

之后,執行命令 npx parallel-webpack 即可完成構建,上面的示例配置會同時打包出 pageA.js 與 pageB.js 兩份產物。

組合變量

Parallel-Webpack 還提供了 createVariants 函數,用于根據給定變量組合,生成多份 Webpack 配置對象,如:

  1. const createVariants = require('parallel-webpack').createVariants 
  2. const webpack = require('webpack'
  3.  
  4.  
  5. const baseOptions = { 
  6.   entry: './index.js' 
  7.  
  8.  
  9. // 配置變量組合 
  10. // 屬性名為 webpack 配置屬性;屬性值為可選的變量 
  11. // 下述變量組合將最終產生 2*2*4 = 16 種形態的配置對象 
  12. const variants = { 
  13.   minified: [truefalse], 
  14.   debug: [truefalse], 
  15.   target: ['commonjs2''var''umd''amd'
  16.  
  17.  
  18. function createConfig (options) { 
  19.   const plugins = [ 
  20.     new webpack.DefinePlugin({ 
  21.       DEBUG: JSON.stringify(JSON.parse(options.debug)) 
  22.     }) 
  23.   ] 
  24.   return { 
  25.     output: { 
  26.       path: './dist/'
  27.       filename: 'MyLib.' + 
  28.                 options.target + 
  29.                 (options.minified ? '.min' : '') + 
  30.                 (options.debug ? '.debug' : '') + 
  31.                 '.js' 
  32.     }, 
  33.     plugins: plugins 
  34.   } 
  35.  
  36.  
  37. module.exports = createVariants(baseOptions, variants, createConfig) 

上述示例使用 createVariants 函數,根據 variants 變量搭配出 16 種不同的 minified、debug、target 組合,最終生成如下產物:

  1. [WEBPACK] Building 16 targets in parallel 
  2. [WEBPACK] Started building MyLib.umd.js 
  3. [WEBPACK] Started building MyLib.umd.min.js 
  4. [WEBPACK] Started building MyLib.umd.debug.js 
  5. [WEBPACK] Started building MyLib.umd.min.debug.js 
  6.  
  7. [WEBPACK] Started building MyLib.amd.js 
  8. [WEBPACK] Started building MyLib.amd.min.js 
  9. [WEBPACK] Started building MyLib.amd.debug.js 
  10. [WEBPACK] Started building MyLib.amd.min.debug.js 
  11.  
  12. [WEBPACK] Started building MyLib.commonjs2.js 
  13. [WEBPACK] Started building MyLib.commonjs2.min.js 
  14. [WEBPACK] Started building MyLib.commonjs2.debug.js 
  15. [WEBPACK] Started building MyLib.commonjs2.min.debug.js 
  16.  
  17. [WEBPACK] Started building MyLib.var.js 
  18. [WEBPACK] Started building MyLib.var.min.js 
  19. [WEBPACK] Started building MyLib.var.debug.js 
  20. [WEBPACK] Started building MyLib.var.min.debug.js 

原理

parallel-webpack 的實現非常簡單,基本上就是在 Webpack 上套了個殼,核心邏輯:

  • 根據傳入的配置項數量,調用 worker-farm 創建復數個工作進程
  • 工作進程內調用 Webpack 執行構建
  • 工作進程執行完畢后,調用 node-ipc 向主進程發送結束信號

到這里,所有工作就完成了。

缺點

雖然,parallel-webpack 相對于 Thread-loader、HappyPack 有更高的并行度,但進程實例與實例之間并沒有做任何形式的通訊,這可能導致相同的工作在不同進程 —— 或者說不同 CPU 核上被重復執行。例如需要對同一份代碼同時打包出壓縮和非壓縮版本時,在 parallel-webpack 方案下,前置的資源加載、依賴解析、AST 分析等操作會被重復執行,僅僅最終階段生成代碼時有所差異。

這種技術實現,對單 entry 的項目沒有任何收益,只會徒增進程創建成本;但特別適合 MPA 等多 entry 場景,或者需要同時編譯出 esm、umd、amd 等多種產物形態的類庫場景。

并行壓縮

Webpack 語境下通常使用 Uglify-js、Uglify-es、Terser 做代碼混淆壓縮,三者都不同程度上原生實現了多進程并行壓縮功能。

TerserWebpackPlugin 完整介紹:https://webpack.js.org/plugins/terser-webpack-plugin/

以 Terser 為例,插件 TerserWebpackPlugin 默認已開啟并行壓縮能力,通常情況下保持默認配置即 parallel = true 即可獲得最佳的性能收益。開發者也可以通過 parallel 參數關閉或設定具體的并行進程數量,例如:

  1. const TerserPlugin = require("terser-webpack-plugin"); 
  2.  
  3.  
  4. module.exports = { 
  5.     optimization: { 
  6.         minimize: true
  7.         minimizer: [new TerserPlugin({ 
  8.             parallel: 2 // number | boolean 
  9.         })], 
  10.     }, 
  11. }; 

上述配置即可設定最大并行進程數為2。

對于 Webpack 4 及之前的版本,代碼壓縮插件 UglifyjsWebpackPlugin 也有類似的功能與配置項,此處不再贅述。

最佳實踐

理論上,并行確實能夠提升系統運行效率,但 Node 單線程架構下,所謂的并行計算都只能依托與派生子進程執行,而創建進程這個動作本身就有不小的消耗 —— 大約 600ms,因此建議讀者按實際需求斟酌使用上述多進程方案。

對于小型項目,構建成本可能很低,但引入多進程技術反而導致整體成本增加。

對于大型項目,由于 HappyPack 官方已經明確表示不維護,所以建議盡量使用 Thread-loader 組件提升 Make 階段性能。生產環境下還可配合 terser-webpack-plugin 的并行壓縮功能,提升整體效率。

【編輯推薦】

 

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

2016-10-09 20:15:30

多線程多進程

2024-12-27 08:11:44

Python編程模式IO

2020-09-19 21:26:56

webpack

2017-06-30 10:12:46

Python多進程

2010-07-15 12:51:17

Perl多進程

2021-10-25 10:23:49

Webpack 前端Tree shakin

2020-07-10 12:06:28

WebpackBundleless瀏覽器

2023-11-01 11:20:57

2024-05-27 00:00:01

2021-09-27 08:16:38

Webpack 前端Cache

2012-08-08 09:32:26

C++多進程并發框架

2022-02-10 14:23:16

WebpackJavaScript

2016-01-11 10:29:36

Docker容器容器技術

2024-03-29 06:44:55

Python多進程模塊工具

2021-11-09 09:57:46

Webpack 前端分包優化

2024-08-26 08:39:26

PHP孤兒進程僵尸進程

2021-12-16 22:02:28

webpack原理模塊化

2019-02-26 11:15:25

進程多線程多進程

2009-04-21 09:12:45

Java多進程運行

2021-02-25 11:19:37

谷歌Android開發者
點贊
收藏

51CTO技術棧公眾號

欧美深深色噜噜狠狠yyy| 91高清免费视频| 午夜一级免费视频| 啦啦啦中文在线观看日本| 不卡一二三区首页| 国产精品精品一区二区三区午夜版| 女人十八毛片嫩草av| 久久久久久爱| 色婷婷综合久久久久中文| 宅男噜噜99国产精品观看免费| 国产成人a人亚洲精品无码| 亚洲精品免费观看| 日韩亚洲国产中文字幕| 超碰caoprom| 欧美视频免费看| 午夜精品一区在线观看| 亚洲v国产v在线观看| 亚洲国产精品久久久久爰性色| 国产精品美女久久久| yellow中文字幕久久| 一出一进一爽一粗一大视频| 四虎国产精品免费久久| 狠狠久久五月精品中文字幕| 亚洲一卡二卡| 欧美精品少妇| 国产精品996| 国产精品视频yy9099| 亚洲精品午夜久久久久久久| 99久久夜色精品国产亚洲狼| 亚洲精品国产成人| 久久久久久无码精品人妻一区二区| 成人免费无遮挡| 亚洲综合一区二区| 一级特黄录像免费播放全99| 黄色片在线免费看| av不卡免费电影| 91久久精品美女高潮| 欧美日韩在线视频播放| 亚洲自啪免费| 国内偷自视频区视频综合| 欧美成人精品欧美一| 日韩高清欧美| 国产亚洲精品一区二区| 中文字幕在线观看的网站| www.爱久久| 日韩欧美国产一区在线观看| 中文字幕第88页| 99久久伊人| 欧洲精品中文字幕| 激情内射人妻1区2区3区| caoprom在线| 亚洲国产sm捆绑调教视频| 男女h黄动漫啪啪无遮挡软件| 国产黄色在线播放| 久久精品人人做| 欧美精品在线一区| 精品无人乱码| 久久久91精品国产一区二区三区| 久久综合九色综合久99| 婷婷伊人综合中文字幕| 久久综合色婷婷| 久久精品一区二区三区不卡免费视频| 三级网站免费观看| 99国产一区二区三精品乱码| 韩国一区二区三区美女美女秀| 四虎免费在线观看| 91在线观看免费视频| 久久99精品久久久久久青青日本 | 东京热一区二区三区四区| 欧美精品免费观看二区| 色偷偷噜噜噜亚洲男人| 欧美老熟妇喷水| 林心如三级全黄裸体| 中文字幕久久精品一区二区| 日韩欧美电影在线| 免费在线观看日韩av| 日韩高清在线观看一区二区| 欧美成人性战久久| 国产熟女高潮一区二区三区| 亚洲丝袜美腿一区| 欧美精品久久一区二区三区| 日韩激情一二三区| 亚洲人成免费| 亚洲精品福利免费在线观看| 欧美色图亚洲激情| 不卡中文字幕| 久久影视电视剧免费网站清宫辞电视 | 国产尤物av一区二区三区| 日韩欧美在线番号| 久久精品网站免费观看| 在线不卡视频一区二区| 国产在线激情视频| 91天堂素人约啪| 日韩av在线免费看| 国产精品jizz| 亚洲国产精品成人| 欧美性视频精品| 中文字幕+乱码+中文字幕明步 | 免费福利视频一区| 国产一区二区三区直播精品电影 | 国产精品草莓在线免费观看| 国产v亚洲v天堂无码久久久 | 国产又粗又黄又爽的视频| 国内精品不卡在线| 精品乱色一区二区中文字幕| 99中文字幕在线观看| 午夜精品一区二区三区在线播放| www日本在线观看| 蜜桃a∨噜噜一区二区三区| 国产亚洲短视频| 日韩在线黄色| 亚洲成人av一区二区| 18岁网站在线观看| 666av成人影院在线观看| 亚洲韩日在线| 97婷婷大伊香蕉精品视频| 中文字幕在线视频第一页| 国产ts人妖一区二区| 午夜视频久久久| 极品视频在线| 69堂亚洲精品首页| 人人妻人人澡人人爽| 亚洲第一网站| 亚洲va欧美va国产综合久久| 国产午夜在线观看| 欧美日韩国产精品一区二区不卡中文| 亚洲精品免费一区亚洲精品免费精品一区 | 69xxxx国产| 成人免费视频国产在线观看| 一区二区三区在线视频111| 在线高清av| 亚洲精品一区二区三区四区高清| 亚洲xxxx3d动漫| 久久av免费看| 亚洲亚洲免费| 日韩一区二区电影| 欧美激情 一区| 亚洲影院在线| 国产精品香蕉视屏| 欧美xxxx做受欧美88bbw| 欧美人妖巨大在线| 国产亚洲精品精品精品| 欧美aaaaaaaaaaaa| 亚洲精品不卡在线观看| 国产无一区二区| h无码动漫在线观看| 亚洲精品伊人| 亚洲男帅同性gay1069| 日韩av一二三| 777奇米四色成人影色区| 国产艳妇疯狂做爰视频| 欧美一区影院| 国产老肥熟一区二区三区| 国产亚洲毛片| 欧美激情视频在线| 国产又黄又猛又爽| 成人欧美一区二区三区视频网页| 成人免费毛片播放| 欧美一区二区三| 国产精品久久二区| 国产视频精品久久| 欧美日韩激情视频一区二区三区| 99久久伊人| 日韩欧美一区二区视频| 亚洲综合网在线| 国产一区二区三区在线观看免费| 一区二区精品国产| 国产视频一区二| 欧美精品在线免费| 亚洲欧美强伦一区二区| 91精品国产乱码久久久| 精品国产999久久久免费| 老司机精品视频在线| 亚洲欧美精品| 精品国产第一国产综合精品| 久久成人精品视频| 朝桐光av在线一区二区三区| 亚洲大片在线观看| 日韩精品人妻中文字幕有码| 久久久久久久久久毛片| 日韩精品卡通动漫网站| 一区二区美女| 国产成人av在线播放| jizzjizz在线观看| 91精品国产一区二区三区蜜臀| 强乱中文字幕av一区乱码| 成人涩涩免费视频| 国产色一区二区三区| 91久久大香伊蕉在人线| 高清欧美性猛交xxxx黑人猛交| 手机看片日韩国产| 成人四虎影院| 久久电影一区二区| 视频三区在线观看| 在线播放欧美女士性生活| 久久免费视频精品| 第一福利在线| 国产黄色在线播放| 一色桃子久久精品亚洲| 97超碰免费在线观看| 夜夜嗨av一区二区三区网站四季av| 欧美一区二区视频17c| 日韩三级精品| 国产精品久久av| 6699嫩草久久久精品影院| 亚洲免费视频中文字幕| 精品高清美女精品国产区| 日本不卡久久| 国产精品一区二区精品| 青青久久av北条麻妃海外网| a篇片在线观看网站| 亚洲精品国产精品国产自| 国产精品久久久久久在线| 精品久久久久久久久久久久久久 | www.一区二区| 亚洲综合免费观看高清完整版| 777久久久精品| 久久中文精品视频| 亚洲淫片在线视频| 国产成人在线小视频| 91传媒理伦片在线观看| 欧美黄色免费看| 日韩电影免费| 午夜精品一区二区三区三上悠亚| 日韩精品久久久久久久的张开腿让| 波波电影院一区二区三区| 在线观看av网页| 久久亚洲综合| 免费看国产一级片| 欧美黄污视频| 超碰97在线看| 久久久久av| 五月天婷亚洲天综合网鲁鲁鲁| 日韩美脚连裤袜丝袜在线| 鬼打鬼之黄金道士1992林正英| 97久久精品一区二区三区的观看方式| 全球成人中文在线| 超碰一区二区| 国产成人91久久精品| 成人免费直播| 日本欧美在线视频| 久久sese| 日韩av电影免费观看高清| 亚洲私拍视频| 欧美一区二区三区图| av成人福利| 国产精品黑丝在线播放| 日韩电影在线观看一区| 亚洲一区二区三区四区五区黄| 亚洲午夜激情免费视频| 久久大片网站| 在线免费看黄色片| 亚洲免费成人网| 国产区一区二| 亚洲专区一区| 欧美日韩电影在线观看| 青青影院在线观看| 日韩视频精品在线| 日本不卡不卡| 久久激情视频久久| 国产一二三区在线观看| 久久成人人人人精品欧| 欧美伦理免费在线| 午夜精品福利电影| 日本不卡1234视频| 国产精品高潮粉嫩av| h1515四虎成人| 成人深夜直播免费观看| 日韩在线成人| 精品国产第一页| 国产精品午夜一区二区三区| 日韩亚洲视频| 91精品国产乱码久久久久久| 亚洲啊啊啊啊啊| 伊人影院久久| 人人妻人人添人人爽欧美一区| 久久九九99| 欧美视频亚洲图片| a级高清视频欧美日韩| 少妇久久久久久久久久| 中文字幕在线观看不卡视频| 精品深夜av无码一区二区老年| 激情懂色av一区av二区av| 日韩xxx视频| 欧美一级艳片视频免费观看| 日韩一级在线播放| 亚洲人成网在线播放| 成人在线观看免费网站| 国外成人在线视频| 成人mm视频在线观看| 999国产在线| 红桃成人av在线播放| 色婷婷777777仙踪林| 久久婷婷激情| 宇都宫紫苑在线播放| 久久综合九色综合97_久久久| 久久久久久久久久97| 精品人伦一区二区三区蜜桃免费| 亚洲国产无线乱码在线观看| 欧美一区二区三区在线视频| 亚洲人在线观看视频| www.日韩.com| 午夜伦理福利在线| 亚洲最大福利网| 国产精品自拍区| www.亚洲成人网| 秋霞午夜av一区二区三区| 亚洲色偷偷色噜噜狠狠99网| 国产精品传媒在线| 欧美精品一二三四区| 日韩久久精品一区| 又爽又大又黄a级毛片在线视频| 性欧美在线看片a免费观看| 日韩成人在线一区| 欧美日韩亚洲一区二区三区四区| 狠狠噜噜久久| 激情图片中文字幕| 国产婷婷精品av在线| 五月天综合在线| 欧美一区二区三区视频| www.在线播放| 日韩免费高清在线观看| 成人激情自拍| 国产精品va在线观看无码| 精品一区二区三区欧美| 欧美黄色激情视频| 欧美日韩美女在线观看| 亚洲精选一区二区三区| 久久av红桃一区二区小说| 色综合一区二区日本韩国亚洲| 日韩精品一线二线三线| 久久久久久夜| 久久久久国产精品区片区无码| 亚洲国产sm捆绑调教视频| www.午夜激情| 久久国产精品久久久久久久久久| 国产精品伦一区二区| 视频一区在线免费观看| 日欧美一区二区| 中文字幕免费看| 欧美日韩性视频在线| 五月婷婷在线观看视频| 久久久久久噜噜噜久久久精品| 午夜日韩影院| 久无码久无码av无码| 丁香桃色午夜亚洲一区二区三区| 91麻豆免费视频网站| 在线播放中文字幕一区| 黄网站免费在线播放| 91免费高清视频| 一区二区电影| 91精品人妻一区二区三区四区| 一区二区三区欧美亚洲| 超碰免费在线97| 久久久久久久999| 国产伦精品一区二区三区在线播放| 久久精品无码中文字幕| 成人精品视频一区二区三区尤物| 欧美日韩中文视频| 亚洲精品视频网上网址在线观看| 欧美羞羞视频| 亚洲春色综合另类校园电影| 久久99热狠狠色一区二区| 老湿机69福利| 日韩精品一区二区三区中文不卡| 免费在线观看的电影网站| 国产色综合一区二区三区| 欧美亚洲网站| 免费91在线观看| 日韩三级中文字幕| www.51av欧美视频| 日本日本精品二区免费| 久久机这里只有精品| 我家有个日本女人| 日韩激情视频在线| 123成人网| 久久99国产精品一区| 成人的网站免费观看| 婷婷激情五月网| 日韩中文字幕欧美| 亚洲一区二区电影| 蜜臀久久99精品久久久酒店新书| 国产精品私人影院| 亚洲国产999| 91精品国产亚洲| 欧美成人激情| 2一3sex性hd| 欧美三级一区二区| 免费在线观看av电影| 日韩wuma| 国产成a人亚洲精品| 香蕉污视频在线观看| 欧美成人激情图片网| 国产一区二区电影在线观看| 日本在线观看视频一区| 欧美日韩在线另类| 含羞草www国产在线视频| 蜜桃成人在线| 国产精品一区二区在线看| 欧美a视频在线观看|