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

午夜精品一区二区三区在线观看| 91精品国产色综合| 久久综合在线观看| 国产盗摄精品一区二区酒店| 成人激情午夜影院| 欧美亚洲日本黄色| 999精品久久久| 成人免费在线电影网| 色视频一区二区| 老司机午夜免费福利视频| 亚洲 美腿 欧美 偷拍| 日韩激情在线观看| 九九热r在线视频精品| 97伦伦午夜电影理伦片| 国产aa精品| 欧美性猛交xxxx免费看| 国产美女视频免费| 日韩资源在线| 奇米影视7777精品一区二区| 久久久在线视频| 久久视频一区二区三区| 国内精品偷拍| 制服丝袜亚洲精品中文字幕| 国产一区二区片| 1024国产在线| 成年人午夜久久久| 亚洲综合第一页| 黄色网址中文字幕| 亚洲激情精品| 久久久久www| 实拍女处破www免费看| 日韩欧美一级| 欧美挠脚心视频网站| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 精品香蕉一区二区三区| 日本一二三区在线| 国产一区高清| 一本大道综合伊人精品热热| 精品无码一区二区三区爱欲| 国产黄a三级三级三级av在线看| 久久久久久久久久久黄色| 成人综合色站| 亚洲精品一区二区三区四区 | 午夜激情一区二区| 成人在线免费高清视频| 2019中文字幕在线视频| 国产欧美一二三区| 欧美一区二区三区电影在线观看| 蜜桃久久一区二区三区| 国产99精品视频| 亚洲一区亚洲二区| 一级片视频网站| 免费精品视频在线| 国产精品久久久久久久久久三级| 精品免费囯产一区二区三区| 国产精品综合| 欧美做受高潮1| 精品国产一区二区三区四| 一本久道久久久| 欧美洲成人男女午夜视频| 美日韩一二三区| 校园激情久久| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲欧美在线视频免费| 99精品99| 秋霞av国产精品一区| 天堂а√在线中文在线新版 | 精品视频免费| 中文字幕国产精品| 最新日韩免费视频| 先锋资源久久| 欧美巨大黑人极品精男| 久久久一二三区| 伊人久久成人| 日本一本a高清免费不卡| 免费观看日批视频| 免费欧美在线视频| 91久久久久久久久| 亚洲爱情岛论坛永久| av在线免费不卡| 欧美日韩综合久久| 国内外激情在线| 亚洲成a人v欧美综合天堂| 黄色国产一级视频| 欧洲精品一区二区三区| 欧美人伦禁忌dvd放荡欲情| 国产91在线免费观看| 成人另类视频| 国产一区二区三区毛片| 国产第一页浮力| 亚洲福利国产| 国产精品视频一| 亚洲乱码在线观看| 91在线观看地址| 性欧美videosex高清少妇| 91一区二区三区在线| 午夜国产精品影院在线观看| 蜜臀av免费观看| 777久久精品| 国产一区二区久久精品| 激情小说中文字幕| 视频一区二区国产| 97神马电影| 久久国产精品高清一区二区三区| ●精品国产综合乱码久久久久| 轻点好疼好大好爽视频| 国产精品高清乱码在线观看| 6080yy午夜一二三区久久| 中文在线永久免费观看| 国产精品99久久久久久动医院| 韩国精品久久久999| 中文字幕 亚洲视频| 成人午夜电影小说| 中文字幕一区二区三区精彩视频| 九色porny自拍视频在线播放| 欧美精品三级在线观看| 又黄又爽的网站| 欧美在线三级| 国产精品久久一区主播| 欧美一区二区公司| 亚洲欧美欧美一区二区三区| 别急慢慢来1978如如2| 精品福利一区| 欧美成人午夜视频| 中文字幕在线2019| 久久蜜桃一区二区| 青青草国产精品视频| 精品国产18久久久久久二百| 中文字幕亚洲无线码a| 国内精品福利视频| 高清av一区二区| 九九久久九九久久| 亚洲三级电影| 色狠狠av一区二区三区香蕉蜜桃| 麻豆精品久久久久久久99蜜桃| 成人亚洲精品久久久久软件| 熟女视频一区二区三区| 国产激情欧美| 一区二区欧美激情| 无码人妻av一区二区三区波多野 | 亚洲一区国产| 国产综合 伊人色| 免费在线观看的电影网站| 在线成人高清不卡| 女同久久另类69精品国产| 青草国产精品久久久久久| 欧美综合激情| 欧美日韩免费观看视频| 亚洲欧洲一区二区三区久久| 在线能看的av| 久久久美女毛片| 日韩亚洲在线视频| 精品久久91| 国产精品久久久av久久久| 国产在线播放av| 欧美性感一类影片在线播放| 国产毛片欧美毛片久久久| 日韩成人免费在线| 亚洲国产精品123| 99久久久国产精品免费调教网站| 色偷偷亚洲男人天堂| 一级特黄aaa| 亚洲天堂久久久久久久| 香蕉视频色在线观看| 欧美激情1区| 国产一级二级三级精品| 中文字幕色婷婷在线视频| 精品一区精品二区| 波多野结衣高清在线| 中文字幕av一区 二区| 亚洲一区精品视频在线观看| 亚洲成人三区| 精品乱色一区二区中文字幕| 伊人久久在线| 久久精品电影网| 丰满熟女一区二区三区| 疯狂做受xxxx高潮欧美日本| 日本一级免费视频| 久久99精品视频| 久久亚洲国产成人精品无码区 | 国产在线视视频有精品| 成人在线播放网址| 国产精品三级| 国产中文欧美精品| 丁香花电影在线观看完整版| 日韩毛片中文字幕| 一区二区三区免费在线视频| 夜夜精品视频一区二区| 国产精品探花一区二区在线观看| 免费视频一区二区| 国产精品www在线观看| 国产精品免费大片| 91原创国产| 日韩免费小视频| 欧美男插女视频| 日本国产在线| 日韩亚洲欧美高清| 久久青青草视频| 自拍偷自拍亚洲精品播放| 性农村xxxxx小树林| 日韩高清不卡一区二区| 欧美极品少妇无套实战| 精品国产一区二区三区四区| 成人动漫在线视频| 成人在线免费av| 668精品在线视频| 羞羞视频在线免费国产| 亚洲人午夜色婷婷| 亚洲欧美另类一区| 欧美在线观看18| 国产在线视频你懂的| 中文成人av在线| 黄色a一级视频| 国产一区二区在线观看免费| 日韩手机在线观看视频| 激情自拍一区| 国产高清精品软男同| 亚洲图片久久| 国产视频99| 一区中文字幕| 国产日本欧美在线观看| 国产乱码午夜在线视频| 久久精品视频va| 北岛玲一区二区三区| 亚洲精品天天看| 色哟哟中文字幕| 日韩欧美一二区| 国产精品毛片一区二区在线看舒淇 | 亚洲成人精品视频| 国产精品欧美综合亚洲| 在线看不卡av| 久久精品视频1| 亚洲成av人片一区二区三区| 天天看片中文字幕| 亚洲欧洲av色图| 美女av免费看| 国产精品乱人伦中文| 欧美精品日韩在线| 国产精品午夜免费| 国产精品av久久久久久无| 久久免费电影网| 男人天堂av电影| 久久无码av三级| 泷泽萝拉在线播放| 26uuu欧美| aaaaaav| 久久影院视频免费| 日韩人妻一区二区三区| 久久久久久久久久久99999| v8888av| 久久精品视频免费观看| 一道本在线观看| 欧美激情一区二区三区全黄| 日韩精品电影一区二区三区| 国产精品免费av| 少妇高潮一区二区三区喷水| 亚洲丝袜另类动漫二区| 欧美精品成人久久| 亚洲18色成人| 久久夜色精品国产噜噜亚洲av| 高跟丝袜一区二区三区| 国产精品21p| 欧美视频在线一区| 国产三区在线播放| 精品国产露脸精彩对白| 天天干天天爽天天操| 日韩电影免费观看中文字幕| 国产精品天堂| 久久精品视频在线| 麻豆av在线播放| 97视频网站入口| 成人在线网站| 91在线视频免费| 国产一区在线电影| 欧美日韩在线精品一区二区三区| 久久免费大视频| 日本黄色片一级片| 久久激情中文| 亚洲怡红院在线| 国产xxx精品视频大全| 熟妇人妻久久中文字幕| 国产无遮挡一区二区三区毛片日本| 手机在线中文字幕| 一区二区不卡在线播放 | 欧美日韩一区高清| 精品国产av 无码一区二区三区| 亚洲成人亚洲激情| jizz在线观看| 欧美韩国理论所午夜片917电影| 中文在线最新版地址| 成人黄色在线观看| 欧美午夜寂寞| 国产91av视频在线观看| 日韩午夜在线电影| 青青草久久伊人| 91亚洲精品久久久蜜桃网站 | 黄色av网址在线免费观看| 久久伊人精品天天| 在线看片国产福利你懂的| 成人免费xxxxx在线观看| 天天躁日日躁成人字幕aⅴ| 国产一二三四五| 日日夜夜免费精品| 国产精品一区二区在线免费观看| 国产欧美精品一区二区色综合| 免费无遮挡无码永久在线观看视频| 一本久道久久综合中文字幕| 国产成人三级在线播放 | 日韩av成人高清| zjzjzjzjzj亚洲女人| 国产精品伦理在线| 亚洲 欧美 中文字幕| 欧美mv日韩mv国产网站| 在线毛片网站| 国产精品91在线| 日韩极品在线| 女人帮男人橹视频播放| 国内外成人在线| xxxx日本黄色| 欧美日韩在线免费| 蜜桃在线一区二区| 欧美另类69精品久久久久9999| 久久麻豆视频| 日本午夜精品一区二区| 亚洲一区成人| 艳妇乳肉亭妇荡乳av| 亚洲资源中文字幕| 国产av无码专区亚洲av| 色老头一区二区三区| 成人国产精品| 日韩欧美在线一区二区| 嫩草成人www欧美| 中文乱码人妻一区二区三区视频| 一区二区三区欧美| 精品久久久无码中文字幕| 久久久国产精品亚洲一区| 成人在线观看免费播放| 色噜噜色狠狠狠狠狠综合色一 | 亚洲免费资源在线播放| 伊人久久成人网| 中文国产亚洲喷潮| 国产精品毛片久久久久久久久久99999999 | 欧美片一区二区三区| 国产精品一区二区美女视频免费看| 一区二区三区四区不卡| 久久精品国内一区二区三区| 日韩福利在线视频| 欧美性受xxxx| 午夜免费播放观看在线视频| 国产精品爽黄69天堂a| 欧美xxxx中国| 青娱乐国产精品视频| 亚洲精品国产成人久久av盗摄| 性欧美videos另类hd| 欧美黑人又粗大| 日本在线中文字幕一区| 日韩一级免费在线观看| 亚洲国产高清在线观看视频| 中文字幕永久在线观看| 久久综合电影一区| 中文字幕av一区二区三区四区| 国内少妇毛片视频| aaa欧美色吧激情视频| 国产无套丰满白嫩对白| 在线精品高清中文字幕| 亚洲香蕉久久| 无颜之月在线看| 97se亚洲国产综合自在线观| 一级特黄免费视频| 久久精品最新地址| 亚洲一级大片| 欧美v在线观看| 国产精品国产自产拍高清av| 99热这里是精品| 97香蕉超级碰碰久久免费软件 | 国产精品日韩三级| 91丝袜国产在线播放| 亚洲精品一区二三区| 久久综合伊人77777蜜臀| 看全色黄大色大片免费久久久| 免费av网址在线| 日韩毛片在线免费观看| 手机看片1024日韩| 国产精品视频区1| 国语精品一区| 黄色片网站免费| 欧美tk丨vk视频| 婷婷激情一区| 国产免费内射又粗又爽密桃视频| 久久色在线观看| 国产女人18毛片水真多| 欧美一级高清免费| 在线精品国产| 亚洲人成人无码网www国产| 欧美一区二区久久久| 欧美xxxhd| 看全色黄大色大片| 久久久久99精品一区| 亚洲精品喷潮一区二区三区| 国产精品日韩久久久久|