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

我曾為配置 Webpack 感到痛不欲生,直到我遇到了這個流式配置方案

開發 架構
今天給大家介紹社區當中一個 webpack 的流式配置方案——webpack-chain,這個方案現在已經在我目前所在的團隊落地,且帶來了一些正向的收益,現在就這個方案出現的背景、核心概念及日常使用姿勢給大家展開介紹。

[[392405]]

今天給大家介紹社區當中一個 webpack 的流式配置方案——webpack-chain,這個方案現在已經在我目前所在的團隊落地,且帶來了一些正向的收益,現在就這個方案出現的背景、核心概念及日常使用姿勢給大家展開介紹。

為什么出現 webpack-chain ?

相信大家都對業界鼎鼎有名的構建工具Webpack并不陌生了,作為目前為止最穩定、生產環境應用最多的構建打包工具,它固然有著很多優勢,比如:

  • 生態豐富。在社區有大量的 loader 和 plugin,想要的基本都能找到。
  • 可插拔的插件機制。基于 Tapable 實現的可擴展架構。
  • 文檔成熟。有中文版,且一直在更新和維護。
  • 穩定性高。現在正式的前端項目生產環境下基本用 Webpack 來構建,經過這么多年業界的驗證,該踩的坑也都踩的差不多了。

但其實說了這么多優勢,大家估計還是對這個東西沒什么好感,因為還有最重要的一點不容忽視,那就是開發體驗。對于構建打包這個事情來說,本來就是工程化當中的一個細節極其復雜的環節,需要輸入大量的配置信息來保證打包結果符合預期。在Webpack當中,我們如果不用其他的方案,就只有手動地配置一個巨大的 JavaScript 對象,所有的配置信息都在這個對象當中,這樣原始的方式的確給人體驗很不好,歸納為以下幾個原因:

  1. 對象過于龐大,直觀上讓人看的眼花繚亂,盡管可以封裝一些邏輯,但還是避免不了深層的嵌套配置;
  2. 難以動態修改。舉個例子,如果通過腳本動態修改一些配置信息,比如刪除 babel-loader 的一個 plugin,那么需要從最頂層的配置對象,一步步找到到 babel-loader 的位置,然后遍歷插件列表,這個手動尋找和遍歷的過程比較繁瑣。
  3. 難以共享配置。如果你嘗試跨項目共享 webpack 配置對象,那后續的修改就會變的混亂不堪,因為你需要動態地修改原來的配置。

社區當中也有人發現了這些痛點,于是出現了針對Webpack的流式配置方案——webpack-chain。

webpack-chain 核心概念

其實真正學會 webpack-chain,我覺得首先不是去學習具體每個屬性的配置方法,而是理解webpack-chain核心的兩個對象——ChainedMap和ChainedSet。

什么是 ChainMap ?

比如我現在配置路徑別名:

  1. config.resolve.alias 
  2.   .set(key, value) 
  3.   .set(key, value) 
  4.   .delete(key
  5.   .clear() 

那么,現在的 alis 對象就是一個ChainMap。如果一個屬性在webpack-chain當中標記為ChainMap之后,它會有一些額外的方法,并且允許這些鏈式調用(如上面的示例)。

接下來就來一個個認識這些方法:

  1. // 清空當前 Map 的所有屬性 
  2. clear() 
  3. // 通過鍵值從 Map 移除單個配置. 
  4. delete(key
  5. // Map中是否存在一個配置值的特定鍵,返回真或假 
  6. has(key
  7. // 返回 Map中已存儲的所有值的數組 
  8. values() 
  9. //  提供一個對象,這個對象的屬性和值將映射進 Map。第二個參數為一個數組,表示忽略哪些屬性 
  10. merge(obj, omit) 
  11. // handler: ChainedMap => ChainedMap 
  12. // 一個把ChainedMap實例作為單個參數的函數 
  13. batch(handler) 
  14. // condition: Boolean 
  15. // whenTruthy: ChainMap -> any, 條件為真時執行 
  16. // whenFalsy: ChainSet -> any, 條件為假時執行 
  17. when(condition, whenTruthy, whenFalsy) 
  18. // 獲取 Map 中相應鍵的值 
  19. get(key
  20. // 先調用 get,如果找不到對應的值, 就返回 fn 函數返回的結果 
  21. getOrCompute(key, fn) 
  22. // 配置鍵值對 
  23. set(key, value) 

這些方法的返回對象也都是 ChainMap,這樣可以實現鏈式調用,簡化操作。在 Webpack中,大部分的對象都是 ChainMap,具體大家可以去源碼當中看看,實現并不復雜。

ChainMap 是webpack-chain當中非常重要的一個數據結構,封裝了鏈式調用的方法,以至于后面所有 ChainMap 類型的配置都可以直接復用ChainMap本身的這些方法,非常方便。

什么是 ChainSet ?

跟 ChainMap 類似,封裝了自己的一套 API:

  1. // 末尾增加一個值 
  2. add(value) 
  3. // 在開始位置增加一個值 
  4. prepend(value) 
  5. // 清空 set 內容 
  6. clear() 
  7. // 刪除某個值 
  8. delete(value) 
  9. // 判斷是否有某個值 
  10. has(value) 
  11. // 返回值列表 
  12. values() 
  13. // 合并給定的數組到 Set 尾部。 
  14. merge(arr) 
  15. // handler: ChainSet => ChainSet 
  16. // 一個把 ChainSet 實例作為單個參數的函數 
  17. batch(handler) 
  18. // condition: Boolean 
  19. // whenTruthy: ChainSet -> any, 條件為真時執行 
  20. // whenFalsy: ChainSet -> any, 條件為假時執行 
  21. when(condition, whenTruthy, whenFalsy) 

ChainSet 的作用和ChainMap類似,也是封裝了底層鏈式調用的 API,在需要操作Webpack配置當中的數組類型的屬性時,通過調用ChainSet的方法即可完成。

速記方法

對于 ChainMap,有這樣一種簡化的寫法,官網稱之為速記寫法:

  1. devServer.hot(true); 
  2.  
  3. // 上述方法等效于: 
  4. devServer.set('hot'true); 

因此,在實際的webpack-chain配置中,可以經常看到直接 .屬性()這樣調用方式,是不是感覺很巧妙?源碼當中的實現非常簡單:

  1. extend(methods) { 
  2.   this.shorthands = methods; 
  3.   methods.forEach(method => { 
  4.     this[method] = value => this.set(method, value); 
  5.   }); 
  6.   return this; 

在ChainMap初始化的時候,會調用 extend 方法,然后把屬性列表作為 methods參數直接傳入,然后通過下面一行代碼間接調用 set 方法:

  1. this[method] = value => this.set(method, value); 

這樣的設計也是值得學習的。

配置 Webpack

首先,需要創建一個新的配置對象:

  1. const Config = require('webpack-chain'); 
  2.  
  3. const config = new Config(); 
  4.  
  5. // 一系列鏈式操作之后 
  6. // 得到最后的 webpack 對象 
  7. console.log(config.toConfig()) 

然后依次配置 resolve、entry、output、module、plugins、optimization 對象,本文關鍵還是帶大家能夠落地 webpack-chain,因此詳細介紹一下各個配置的使用方法。

entry 和 output

這里列舉一個常用的配置,由于 Webpack 在 entry 和 output 掛了太多屬性,大家參考 Webpack 官方文檔照著如下的方式去配就好了。

  1. config.entryPoints.clear() // 會把默認的入口清空 
  2. config.entry('entry1').add('./src/index1.tsx')//新增入口 
  3. config.entry('entry2').add('./src/index2.tsx')//新增入口 
  4.  
  5. config.output 
  6.       .path("dist"
  7.       .filename("[name].[chunkhash].js"
  8.       .chunkFilename("chunks/[name].[chunkhash].js"
  9.       .libraryTarget("umd"

alias

對于路徑別名的配置,也是幾乎所有項目必不可少的部分,配置方式如下:

  1. // 可以發現 resolve.alias 其實是一個 ChainMap 對象 
  2. config.resolve.alias 
  3.   .set('assets',resolve('src/assets')) 
  4.   .set('components',resolve('src/components')) 
  5.   .set('static',resolve('src/static')) 
  6.   .delete('static') // 刪掉指定的別名 

plugins

插件的配置可以說是相當重要的一個環節了,webpack-chain 當中的配置會和平時的配置有些不同,讓我們來具體看看。

1. 添加一個插件

  1. // 先指定名字(這個名字是自定義的),然后通過 use 添加插件 
  2. config 
  3.   .plugin(name
  4.   .use(WebpackPlugin, args) 

舉個例子:

  1. const ExtractTextPlugin = require('extract-text-webpack-plugin'); 
  2.  
  3. // 先指定名字(這個名字可以自定義),然后通過 use 添加插件,use 的第二個參數為插件參數,必須是一個數組,也可以不傳 
  4. config.plugin('extract'
  5.   .use(ExtractTextPlugin, [{ 
  6.     filename: 'build.min.css'
  7.     allChunks: true
  8.   }]) 

2. 移除插件

移除一個插件很簡單,還記得添加插件時我們指定了每個插件的 name 嗎?現在通過這個 name 移除即可:

  1. config.plugins.delete('extract'

3. 指定插件在 xx 插件之前/之后調用

比如,我現在需要指定 html-webpack-plugin 這個插件在剛剛寫的 extract 插件之前執行,那么這么寫就行了:

  1. const htmlWebpackPlugin = require('html-webpack-plugin'); 
  2.  
  3. config.plugin('html'
  4.   .use(htmlWebpackPlugin) 
  5.   .before('extract'

通過 before 方法,傳入另一個插件的 name 即可,表示在另一個插件之前執行。

同樣,如果需要在 extract 插件之后執行,調用 after 方法:

  1. config.plugin('html'
  2.   .use(htmlWebpackPlugin) 
  3.   .after('extract'

4. 動態修改插件參數

我們也可以用 webpack-chain 來動態修改插件的傳參,舉個例子:

  1. // 使用 tap 方法修改參數 
  2. config 
  3.   .plugin(name
  4.   .tap(args => newArgs) 

5. 修改插件初始化過程

我們也可以自定義插件的實例化的過程,比如下面這樣:

  1. // 通過 init 方法,返回一個實例,這將代替原有的實例化過程 
  2. config 
  3.   .plugin(name
  4.   .init((Plugin, args) => new Plugin(...args)); 

loader

loader 是 Webpack 中必不可少的一個配置,下面我們來看看 loader 的相關操作。

1. 添加一個 loader

  1. config.module 
  2.   .rule(name
  3.     .use(name
  4.       .loader(loader) 
  5.       .options(options) 

舉個例子:

  1. config.module 
  2.   .rule('ts'
  3.   .test(/\.tsx?/) 
  4.   .use('ts-loader'
  5.     .loader('ts-loader'
  6.     .options({ 
  7.       transpileOnly: true 
  8.     }) 
  9.     .end() 

2. 修改 loader 參數

可通過 tap 方法修改 loader 的參數:

  1. config.module 
  2.   .rule('ts'
  3.   .test(/\.tsx?/) 
  4.   .use('ts-loader'
  5.     .loader('ts-loader'
  6.     .tap(option => { 
  7.       // 一系列 
  8.       return options; 
  9.     }) 
  10.     .end() 

在所有的配置完成之后,可以通過調用config.toConfig()來拿到最后的配置對象,可以直接作為webpack的配置。

3. 移除一個 loader

  1. // 通過 uses 對象的 delete 方法,根據 loader 的 name 刪除 
  2. config.module 
  3.   .rule('ts'
  4.   .test(/\.tsx?/) 
  5.   .uses.delete('ts-loader'

optimization

Webpack 中的optimization也是一個比較龐大的對象,參照官方文檔:https://webpack.js.org/configuration/optimization/。

這里以其中的 splitChunks 和 minimizer 為例來配置一下:

  1. config.optimization.splitChunks({ 
  2.      chunks: "async"
  3.      minChunks: 1, // 最小 chunk ,默認1 
  4.      maxAsyncRequests: 5, // 最大異步請求數, 默認5 
  5.      maxInitialRequests : 3, // 最大初始化請求數,默認3 
  6.      cacheGroups:{ // 這里開始設置緩存的 chunks 
  7.          priority: 0, // 緩存組優先級 
  8.          vendor: { // key 為entry中定義的 入口名稱 
  9.              chunks: "initial", // 必須三選一: "initial" | "all" | "async"(默認就是async) 
  10.              test: /react|vue/, // 正則規則驗證,如果符合就提取 chunk 
  11.              name"vendor", // 要緩存的 分隔出來的 chunk 名稱 
  12.              minSize: 30000, 
  13.              minChunks: 1, 
  14.          } 
  15.      } 
  16. }); 
  17.  
  18. // 添加一個 minimizer 
  19. config.optimization 
  20.   .minimizer('css'
  21.   .use(OptimizeCSSAssetsPlugin, [{ cssProcessorOptions: {} }]) 
  22. // 移除 minimizer 
  23. config.optimization.minimizers.delete('css'
  24. // 修改 minimizer 插件參數 
  25. config.optimization 
  26.   .minimizer('css'
  27.   .tap(args => [...args, { cssProcessorOptions: { safe: false } }]) 

善用條件

配置之前提到過,對于ChainSet和ChainMap對象都有條件配置方法when,可以在某些很多場景下取代 if-else,保持配置的鏈式調用,讓代碼更加優雅。

  1. config.when
  2.   process.env.NODE === 'production'
  3.   config.plugin('size').use(SizeLimitPlugin) 

小結

webpack-chain作為 webpack 的流式配置方案,通過鏈式調用的方式操作配置對象,從而取代了以前手動操作 JavaScript 對象的方式,在方便復用配置的同時,也使代碼更加優雅,無論是從代碼質量,還是開發體驗,相對于之前來說都是不錯的提升,推薦大家上手使用。

 

責任編輯:姜華 來源: 前端三元同學
相關推薦

2020-08-13 10:15:34

MySQL數據庫面試

2019-07-15 16:35:43

MySQL索引阿里

2013-09-02 09:37:49

操作系統

2021-03-09 07:37:42

技術Promise測試

2019-08-13 09:29:14

Kafka運營數據

2020-03-23 10:45:32

C語言C++Web

2021-05-12 13:38:47

云計算

2014-02-28 11:10:25

產品產品經理

2025-03-03 09:05:00

架構配置私藏服務集群

2020-01-21 22:02:23

物聯網IOT物聯網應用

2022-08-26 13:24:03

version源碼sources

2013-07-26 09:16:13

SwiftOpenStackSwiftStack

2022-09-05 08:48:16

微服務Spring配置中心

2021-03-09 08:00:13

設計秒殺TPS

2009-03-02 16:57:34

LinuxUbuntu配置完全方案

2021-06-09 08:21:14

Webpack環境變量前端

2010-12-14 10:36:16

VMware View

2020-04-24 20:05:16

VueAxios前端

2021-10-26 08:22:38

消息堆積擴容RocketMQ

2009-07-16 17:42:47

WebWork配置
點贊
收藏

51CTO技術棧公眾號

精品视频亚洲| 国产成人精品一区二三区在线观看 | 成人高清一区| 亚洲午夜电影在线观看| 免费日韩av电影| 国产精品色综合| 一本色道88久久加勒比精品| 一区二区三区四区视频| 国产精品熟女一区二区不卡| 中文字幕资源网在线观看免费| 国产人久久人人人人爽| 97免费高清电视剧观看| 激情视频网站在线观看| 中文在线日韩| 伊人伊成久久人综合网站| 日本天堂在线播放| 亚洲免费看片| 欧美影片第一页| 欧美精品自拍视频| 97caopron在线视频| 久久蜜桃av一区二区天堂 | 国产精品传媒视频| 久久久综合香蕉尹人综合网| 国产视频一区二区三| 久久精品人人| 26uuu亚洲伊人春色| 欧美成人手机视频| 香蕉精品视频在线观看| 正在播放亚洲1区| 97伦伦午夜电影理伦片| 国产欧美自拍一区| 日韩欧美国产成人一区二区| 天天干天天av| 日韩黄色在线| 欧美日韩国产高清一区二区| 欧美 国产 小说 另类| av在线私库| 午夜婷婷国产麻豆精品| 国产小视频免费| av在线导航| 亚洲男女毛片无遮挡| 国产精品美女在线播放| 中文字幕在线观看日本| 欧美国产精品劲爆| 日韩国产欧美精品| 欧美视频免费一区二区三区| 99久久综合精品| 久久99精品久久久久久秒播放器| 深爱五月激情五月| 豆国产96在线|亚洲| 成人av免费看| 理论片中文字幕| 成人av在线电影| 久久99蜜桃综合影院免费观看| 国产成人手机在线| 99国产精品久| 欧美一区二区高清在线观看| 韩日在线视频| 中文字幕一区二区三区不卡在线| 中文字幕日韩一区二区三区| 免费观看在线午夜影视| 亚洲精品日韩一| 久久综合久久久久| 在线看片福利| 欧美午夜精品一区二区三区| 黄色手机在线视频| 国产精一区二区| 精品美女一区二区| 亚洲一区二区三区四区五区六区| 亚洲人和日本人hd| 伊人精品在线观看| 免费一级suv好看的国产网站| 天天做天天爱天天综合网| 欧美另类精品xxxx孕妇| a v视频在线观看| 葵司免费一区二区三区四区五区| 国产精品免费在线免费| 国产视频手机在线观看| av一区二区不卡| 五月天亚洲综合情| 午夜小视频福利在线观看| 亚洲大型综合色站| 天天碰免费视频| 免费观看亚洲天堂| 精品亚洲永久免费精品| 99热99这里只有精品| 一区福利视频| 国产日韩在线视频| 开心激情综合网| 国产欧美视频在线观看| 91网站在线观看免费| 亚洲欧美se| 欧美一区二区三区思思人| 久久久久久久无码| 天天做天天爱天天综合网| 97久久精品人人澡人人爽缅北| 中文字幕久久网| www.欧美亚洲| 永久久久久久| 中文在线免费视频| 日韩欧美不卡在线观看视频| 素人fc2av清纯18岁| 欧美国产91| 国产精品99久久99久久久二8| www.国产麻豆| 欧美国产1区2区| 久久久久免费看黄a片app| 日韩黄色三级| 国产亚洲日本欧美韩国| 日本一二三区不卡| 激情都市一区二区| 欧美一区二区三区成人久久片| 国产探花在线观看| 欧美高清你懂得| 国产一二三四五区| 亚洲精品四区| 国产传媒欧美日韩| 国产丝袜在线| 欧美视频精品在线观看| 欧美做受喷浆在线观看| 国产精品a级| 成人免费大片黄在线播放| 国产精品四虎| 欧美午夜片在线免费观看| 国产精品19p| 亚洲国产精品久久久久蝴蝶传媒| 国产精品1区2区在线观看| 五月激情婷婷综合| 亚洲国产精品天堂| 日本少妇一级片| 欧美va天堂在线| 国产日韩av在线播放| 成人资源www网在线最新版| 狠狠久久亚洲欧美专区| 日本天堂在线播放| 亚洲激情亚洲| 国产乱人伦精品一区二区| 婷婷av在线| 日韩一区二区三区四区| 国产少妇在线观看| 国产精品中文欧美| 青青草免费在线视频观看| 四虎影视精品永久在线观看| 少妇高潮 亚洲精品| 自拍偷拍福利视频| 国产精品欧美一级免费| 黄色片视频在线| 四虎成人精品永久免费av九九| 国产成一区二区| av免费观看一区二区| 欧美日韩一区二区不卡| 国产又粗又长又硬| 黄色资源网久久资源365| 小说区视频区图片区| 粉嫩一区二区三区在线观看| 久久夜色精品国产欧美乱| 国产女人高潮时对白| 一区二区高清免费观看影视大全| 俄罗斯女人裸体性做爰| 亚洲二区精品| 欧美一区观看| 日本久久二区| 九九热这里只有在线精品视| 欧美特黄一级视频| 色综合久久久网| 精品伦精品一区二区三区视频密桃| 久久精品免费观看| 成人av在线不卡| 亚欧日韩另类中文欧美| 国产精品人人做人人爽| 国产精品va在线观看视色| 精品福利一二区| 狠狠人妻久久久久久| 国产精品美女www爽爽爽| www.午夜av| 在线视频亚洲| 亚洲国产欧洲综合997久久 | 久久久久国产精品午夜一区| 亚洲欧洲三级| www.豆豆成人网.com| 日韩女优在线播放| 精品欧美色视频网站在线观看| 精品卡一卡二卡三卡四在线| av一级在线观看| 一区二区激情小说| 91视频免费在观看| 国产精品一区在线观看你懂的| 亚洲中文字幕无码专区| 欧美hentaied在线观看| 国产一区二区不卡视频在线观看| 欧美日韩在线精品一区二区三区激情综合| 欧美猛男性生活免费| 天堂中文字幕在线| 欧美一区二区啪啪| 国产性生活视频| 亚洲国产你懂的| 亚洲国产精品一区二区久久hs| 不卡av在线免费观看| 爱爱爱爱免费视频| 亚洲欧美日韩国产| 狠狠精品干练久久久无码中文字幕 | 黄页在线观看免费| 在线观看国产精品日韩av| 午夜精品久久久久久久99热黄桃| 91黄色激情网站| 久久精品国产亚洲AV无码男同| 国产精品免费久久| 性欧美成人播放77777| 国产精品一级片在线观看| 国产九九在线视频| 免费永久网站黄欧美| 国产精品igao激情视频| 日韩一区二区在线免费| 免费中文日韩| 国产区精品视频在线观看豆花| 91亚洲va在线va天堂va国| 香蕉成人av| 777777777亚洲妇女| 在线观看a级片| 久久人人爽人人爽人人片亚洲| 国产三级电影在线观看| 亚洲精品久久久一区二区三区 | 国产99久久久久久免费看| 午夜欧美大尺度福利影院在线看| 中文字幕av免费在线观看| 国产精品免费人成网站| 蜜乳av中文字幕| 91麻豆免费看| 玖草视频在线观看| 97久久精品人人做人人爽50路| 精品久久久久久无码人妻| 国产精品自在在线| 国产高清av片| 国产福利一区二区三区视频| av中文字幕网址| 六月丁香婷婷色狠狠久久| 日日噜噜噜噜久久久精品毛片| 噜噜噜91成人网| 黑鬼大战白妞高潮喷白浆| 国产毛片久久| 国产裸体舞一区二区三区 | 国产欧美精品一二三| 蜜桃av噜噜一区二区三区小说| 91av在线免费播放| 久久婷婷久久| 亚洲免费av一区二区三区| 视频一区二区三区入口| 99视频在线视频| 久久99国产精品麻豆| 羞羞的视频在线| 国产伦精品一区二区三区视频青涩| 99re6在线观看| 国产高清精品网站| 中文字幕人妻一区| 91免费在线播放| 韩国三级hd中文字幕| 国产精品国产自产拍在线| 久草视频手机在线| 亚洲综合色丁香婷婷六月图片| 久久午夜无码鲁丝片| 无码av免费一区二区三区试看| 免费看日韩毛片| 日本道精品一区二区三区| 中文字幕日韩经典| 欧美一区二区免费| 神马午夜电影一区二区三区在线观看 | 午夜国产福利在线观看| 国产寡妇亲子伦一区二区| 影音先锋资源av| 久久蜜臀中文字幕| 国产黄色小视频网站| 亚洲无线码一区二区三区| chinese国产精品| 911精品国产一区二区在线| 亚洲黄色在线观看视频| 亚洲精选在线观看| 视频免费一区| 久久久久久免费精品| 欧美大片1688| 亚洲最大av网站| 日本欧美高清| 欧美 日韩 国产 在线观看| 狠狠入ady亚洲精品| 黄色一级免费大片| 国产91精品免费| 国产一区二区三区精品在线| 一区二区三区自拍| 中文字幕69页| 精品国产一区二区亚洲人成毛片 | 精品免费国产一区二区| 国产尤物一区二区在线| 特级西西人体wwwww| 亚洲欧美自拍偷拍色图| 欧美一级视频免费观看| 欧美区在线观看| 四虎精品成人免费网站| 久热精品视频在线| 精品3atv在线视频| av一区二区在线看| 亚欧美无遮挡hd高清在线视频| 日韩av一二三四区| 国产精品自拍一区| 少妇太紧太爽又黄又硬又爽小说 | 超碰97成人| 一区二区三区四区视频在线观看| 国产精品美女久久久| 黄页网站在线看| 亚洲欧美在线视频| 成人av网站在线播放| 精品福利一区二区三区 | 91成人免费观看网站| 国产精品毛片无码| 亚洲精品国产一区| 丝袜国产日韩另类美女| 日韩精品人妻中文字幕有码| 1024亚洲合集| 亚洲性在线观看| 国产一区二区精品丝袜| 手机av在线| 国产精品xxx在线观看www| 亚洲澳门在线| 激情黄色小视频| 中文字幕久久午夜不卡| 久久久久久久久黄色| 日韩成人性视频| 1区2区3区在线| 国产精品乱码一区二区三区| 中文字幕一区二区三区乱码不卡| 久久视频在线视频| 国产福利视频在线观看| 国产精品高潮视频| 美女少妇全过程你懂的久久| 丰满的少妇愉情hd高清果冻传媒 | 日韩av在线播放网址| 亚洲午夜无码av毛片久久| 北条麻妃国产九九精品视频| 免费网站看av| 日韩美女视频一区二区在线观看| 二区三区在线观看| 亚洲a级在线播放观看| 91tv官网精品成人亚洲| 99中文字幕在线| 亚洲女人小视频在线观看| 国产欧美一级片| 欧美成人网在线| 1204国产成人精品视频| 国产欧美日韩小视频| 成+人+亚洲+综合天堂| 亚州国产精品视频| 亚洲精品午夜精品| 亚洲国产尤物| 二级片在线观看| 国产成人精品影院| 日韩福利片在线观看| 日韩精品在线观| 日韩av免费| 中文字幕欧美人与畜| 国产一区二区伦理| 国产乡下妇女做爰视频| 亚洲国产精品久久久久秋霞不卡| 色吧亚洲日本| 日韩偷拍一区二区| 狠狠色丁香久久婷婷综| 黄色一级视频免费| 日韩电影在线观看中文字幕 | 日韩av不卡播放| 精品在线亚洲视频| 欧美日韩大片在线观看| 精品一区二区三区四区| 久久久人成影片一区二区三区在哪下载| 一本色道久久综合亚洲二区三区| 国产乱码精品一区二区三区av| 欧美日韩中文视频| 国产一区二区激情| 在线一区二区三区视频| 超碰网在线观看| 亚洲欧美在线视频观看| 五月婷婷免费视频| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 视频在线观看入口黄最新永久免费国产 | 亚洲欧美韩国综合色| 天天干视频在线观看| 国产精品网址在线| 亚洲高清久久| 网站永久看片免费| 日韩精品视频免费| 懂色av色香蕉一区二区蜜桃| 欧美 丝袜 自拍 制服 另类| 国产精品色在线| 日本人妻丰满熟妇久久久久久| 国产精品v片在线观看不卡| 重囗味另类老妇506070| 在线观看福利片| 日韩欧美一区二区视频| 亚洲天堂一区二区| 国产毛片久久久久久国产毛片| 国产日韩欧美激情| 人妻精品无码一区二区| 国产在线久久久| 久久精品人人做人人爽电影蜜月|