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

Webpack4編譯階段的性能優化和踩坑

開發 前端
由于優化都是在 Webpack 4 上做的,當時 Webpack 5 還未穩定,現在使用 Webpack 5 時可能有些優化方案不再需要或方案不一致,這里主要介紹優化思路,僅作為參考。

Hello,大家好,我是松寶寫代碼,寫寶寫的不止是代碼。接下來給大家帶來的是關于Webpack4的性能優化的系列,今天帶來的是編譯階段的性能優化。

由于優化都是在 Webpack 4 上做的,當時 Webpack 5 還未穩定,現在使用 Webpack 5 時可能有些優化方案不再需要或方案不一致,這里主要介紹優化思路,僅作為參考。

背景

在接觸一些大型項目構建速度慢的很離譜,有些項目在 編譯構建上30分鐘超時,有些構建到一半內存溢出。但當時一些通用的 Webpack 構建優化方案要么已經接入,要么場景不適用:

  • 已接入的方案效果有限。比如 cache-loader、thread-loader,能優化編譯階段的速度,但對于依賴解析、代碼壓縮、SourceMap 生成等環節無能為力
  • 作為前端基建方案,業務依賴差異極大,難以針對特定依賴優化,如 DllPlugin 方案
  • 作為移動端打包方案,追求極致的首屏加載速度,難以接受頻繁的異步資源請求,如 Module Federation、Common Chunk 方案
  • 存在一碼多產物場景,需要單倉庫多模式構建(1.0/2.0 * 主包/分包)下緩存復用,難以接受耦合度高的緩存方案,如 Persistent Caching

在這種情況下,只好另辟蹊徑去尋找更多優化方案,這篇文章主要就是介紹這些“非主流”的優化方案,以及引發的思考。

分析

簡化Webpack 的構建流程后,Webpack 的構建流程大體上分為如下幾個階段:

圖片


  • 模塊編譯:需要運行如 babel、postcss 等 loader 對模塊進行代碼編譯
  • 依賴解析:需要使用 acorn 把代碼生成 AST 并遍歷查找下游依賴
  • 代碼壓縮:需要生成 AST 并大量修改替換
  • SourceMap:需要將構建流程代碼操作產生的位置映射計算、合并

而在盡可能不改變處理邏輯的情況下,常見的優化思路就是“并行”和“緩存”:

  • 并行:如 thread-loader
  • 緩存:如 cache-loader/Persistent Caching

但目前“并行”和“緩存”僅覆蓋模塊編譯階段,能否把“并行”和“緩存”的方案擴展到整個構建流程呢?

準備

為了讓“并行”+“緩存”能夠覆蓋整個構建流程,需要做如下準備工作:

  1. 引用透明改造:保證各個耗時較高的構建階段無副作用
  2. 緩存池:統一管理各階段生成的緩存
  3. 并行調度池:統一管理子進程/子線程的調度

引用透明改造

引用透明改造包括如下幾個部分:

  • 以 module 的 request 作為整個生命周期中的唯一標識,模塊級粒度的構建控制參數都放到 request 的 query 中。
  • 需要并行任務的配置、參數、結果都能夠序列化/反序列化。
  • 函數執行不依賴全局變量,相同的參數一定能得到相同的結果。

緩存池

緩存池的核心功能:

  • 讀寫時機控制:Webpack 按照 module 維度拆分緩存,而由于 node_modules 黑洞導致 module 數量巨大,因此讀寫本地文件系統開銷也較大,避免在主進程繁忙時讀寫緩存。
  • 按需讀寫:通常模塊并不一定會全量重新構建,因此按需的讀取/寫入能大幅度減少文件的操作次數。
  • 整體/分體緩存:不同的場景可能導致緩存的切分粒度不同,比如分體緩存能夠更好的處理按需讀寫,而整體緩存能在 faas 讀取 nas 場景下獲得較好的性能。

并行調度池

并行調度池類似于數據庫連接池,主要功能:

  1. 任務隊列:將處理任務放在隊列中,同時向并行調度器發送處理請求。
  2. 并行調度器:收到處理請求時,若有空閑并行實例優先調度,若沒有則按照最大并行數量新建。
  1. 子進程:使用 child_process 創建子進程,通過 IPC message 傳輸數據。
  2. 子線程:使用 worker_threads 創建子線程,通過 ArrayBuffer 傳輸數據(注意 nodejs 版本)。
  1. 并行實例:不處理實際邏輯,負責跨進程/線程通信,處理數據序列化反序列化,按需加載構建任務。
  2. 構建任務:執行具體的處理邏輯:
  3. 編譯任務:使用 loader-runner 編譯模塊代碼。

  4. 壓縮任務:使用 terser/esbuild 壓縮模塊代碼。

  5. SourceMap 任務:生成序列化 SourceNode。

圖片

圖片

做好了這些準備工作后,就可以開始進行各個階段的“并行”+“緩存”改造。

編譯階段優化

編譯階段流程

Webpack 內部的單個模塊構建流程大致如下所示:

圖片

  1. 從 entry 開始,創建模塊。
  2. 模塊經過 loader 處理后,得到編譯后代碼。
  3. 編譯后代碼經過 AST 解析后,得到模塊的下游依賴。
  4. 將下游依賴創建新的模塊,回到步驟 2 遞歸處理。
  5. 直到所有模塊都處理完成,模塊編譯流程結束。

Cache-loader

loader 運行類似于 Express/Koa 的中間件機制,每一個 Loader 分為 pitch 和 normal 兩個階段,cache-loader 利用這一點,在 pitch 階段進行緩存檢測,如果檢測到緩存可用則直接返回。無緩存或緩存不可用則繼續運行后續流程,直到 normal 階段生成緩存寫入文件系統。

thread-loader也是同理,只不過把后續的 loader 以及相關參數交給了子進程,并在子進程中模擬了 Webpack 的 loader 運行機制。

圖片

Persistent Caching

但 cache-loader 無法解決 AST Parser + 遍歷生成依賴帶來的消耗,開源界有 hard-source-webpack-plugin 嘗試解決這個問題(但問題很多)。Webpack 團隊自己也意識到了這個問題, 因此在 Webpack 5 中增加的 Persistent caching 來優化,但它的實現思路是將 Webpack 整個上下文都緩存下來,因此 Webpack 5 給幾乎每個對象都增加了序列化/反序列化的方法:

// webpack@5.9.0/lib/NormalModule.js L1068 ~ L1105

serialize(context) {
  const { write } = context;
  // deserialize
  write(this._source);
  write(this._sourceSizes);
  write(this.error);
  write(this._lastSuccessfulBuildMeta);
  write(this._forceBuild);
  super.serialize(context);
}

deserialize(context) {
  const { read } = context;
  this._source = read();
  this._sourceSizes = read();
  this.error = read();
  this._lastSuccessfulBuildMeta = read();
  this._forceBuild = read();
  super.deserialize(context);
}

但由于當時無法升級 Webpack 5,且 Persistent caching 脫離了統一的緩存控制,最終選擇自己實現緩存來保證可移植、可拼接、預生成,如果在 Webpack 5 上實現,理論上可以復用一部分模塊、依賴的序列化/反序列化能力,并橋接到緩存池上。

依賴解析緩存方案

方案設計

方案如下圖所示:

  • 緩存管理:將緩存池橋接到 Webpack 構建的生命周期 hooks 上。
  • 模塊處理器:模塊的序列化與反序列化工具。
  • 緩存匹配器:判斷模塊是否可以使用緩存中的數據。
  • Hash 生成器:全局統一的 Hash 生成器。

圖片

處理流程

  • 通過 NormalModuleFactory 干預模塊生成,并代理掉模塊自身的 build 方法。
  • 當模塊觸發構建時,先進行緩存匹配:
  • 首先需要通過模塊 Request 生成 Hash 并從上面說的緩存池中找到對應的項目。
  • 讀取緩存中的 metaHash,并將 Request 里的文件通過 fs.stat 讀取文件的元信息,將其中的文件名、文件大小、修改時間等信息生成 hash,與 metaHash 進行比對,相等則認為緩存可用。
  • 讀取緩存中的 contentHash,并讀取文件文本內容生成 Hash 比對,相等則認為緩存可用。
  • 緩存匹配時,使用模塊反序列化器將緩存恢復成模塊實例屬性,并寫入到當前模塊中,跳過構建流程直接回調。
  • 未匹配時,使用 Webpack 內置的模塊 build 方法(上面被代理的方法)進行構建,但攔截其回調函數,在外面套娃進行模塊的序列化。

圖片

模塊處理器

模塊的序列化分為兩部分:模塊本體序列化、模塊依賴序列化。

模塊本體的序列化較為簡單:

  • 模塊的 Request,也就是模塊的唯一 ID。
  • 模塊的 source 對象,一個 Webpack Source 實例,通過 sourceAndMap 方法獲取其結果代碼和 SourceMap 并序列化。
  • 模塊的構建信息對象,包括 buildInfo、buildMeta 對象。

模塊的依賴序列化較為復雜,因為依賴由 Webpack 解析 AST 后遍歷生成,依賴內部會直接保留相關聯的 AST 節點,這些 AST 節點在后續的 chunk 產物生成的 dependency template 階段會用來生成模塊引用依賴的相關代碼。

但實際上,依賴內部并不會真正使用多少 AST 的節點,僅僅是從其中讀取少量信息用來做代碼替換的位置判斷和字符串拼接,因此序列化的過程就變成了提取 AST 上依賴使用的關鍵信息,而反序列化則是將這些關鍵信息偽造成 AST 節點即可。

不過,Webpack 內部這樣的依賴有數十個(webpack/lib/dependencies目錄下),需要一個個處理。同時,對于一些特殊的場景,比如 Block 類型的依賴(通常是異步加載的代碼)無法支持。(Webpack 5 中可以直接用這些 Dependency 上面的序列化/反序列化方法)。

圖片

'use strict';
const NullDependency = require('./NullDependency');
class HarmonyExportHeaderDependency extends NullDependency {
  constructor(range, rangeStatement) {
    super();
    this.range = range;
    this.rangeStatement = rangeStatement;
  }
  get type() {
    return 'harmony export header';
  }
}
HarmonyExportHeaderDependency.Template = class HarmonyExportDependencyTemplate {
  apply(dep, source) {
    const content = '';
    const replaceUntil = dep.range ? dep.range[0] - 1 : dep.rangeStatement[1] - 1;
    source.replace(dep.rangeStatement[0], replaceUntil, content);
  }
};
module.exports = HarmonyExportHeaderDependency;

如此這般,當緩存命中時,模塊的依賴解析流程會被完全跳過。但這個流程并行化難度較高,主要原因是 Webpack 內 Parser Hooks 的橋接較為復雜,可以說 Hooks 的存在本身就是副作用的一種體現。

其他優化

Resolver

對 Webpack 的 enhance-resolver 進行緩存,降低 Webpack 在文件系統中查找的成本。由于 Resolver 較為復雜,且不同的 node_modules 組織方式、不同的依賴版本、不同的起始路徑,都可能使得相同的 request 被解析到完全不同的文件,因此針對不同類型的 request,緩存的處理邏輯不同:

  • Loader resolver:Loader 均由構建器統一管理,可以設置持久化緩存。
  • 動態注入路徑:在構建過程中添加的依賴,而非源碼本身的依賴,受構建器統一管理,可以設置持久化緩存。
  • node_modules:在一次構建中,相同 context 下的相同 request 可以使用內存緩存,但不宜使用持久化緩存。
  • 項目源碼:不宜使用緩存。

Hash

構建器和 Webpack 的處理流程中存在大量的 Hash 計算。而使用 md5 作為 Hash 的成本較高,可以采用如 imurmurhash 等碰撞率高一些但性能更好的 Hash 方案進行替換。同時代理的 Hash 也可用來做后續的可移植緩存。

責任編輯:姜華 來源: 松寶寫代碼
相關推薦

2023-05-31 08:19:23

Webpack4Webpack 5

2020-09-19 21:26:56

webpack

2021-06-09 08:21:14

Webpack環境變量前端

2021-10-25 10:23:49

Webpack 前端Tree shakin

2019-03-15 15:00:49

Webpack構建速度前端

2021-11-09 09:57:46

Webpack 前端分包優化

2010-05-05 11:48:27

Oracle設計開發階

2022-09-23 15:23:08

webpack5改變代碼

2023-02-20 08:11:04

2016-09-21 13:17:31

LibreOfficeJava緩沖區

2019-03-26 10:02:16

WebpackJavascript前端

2019-03-05 10:20:49

WebWebpack分離數據

2024-04-10 08:39:56

BigDecimal浮點數二進制

2023-01-18 23:20:25

編程開發

2020-09-15 08:46:26

Kubernetes探針服務端

2024-04-01 08:05:27

Go開發Java

2010-04-21 14:00:48

Oracle數據庫

2017-07-17 15:46:20

Oracle并行機制

2022-08-07 21:52:05

TypeScript編譯性能優化

2021-12-28 08:17:41

循環 forgo
點贊
收藏

51CTO技術棧公眾號

精品对白一区国产伦| 国产精品国产三级国产专播品爱网| 欧美成人性色生活仑片| 少妇极品熟妇人妻无码| 免费一二一二在线视频| 亚洲国产精品精华液2区45| 91在线观看免费网站| 日本一二三区视频| 成人在线电影在线观看视频| 日韩一区二区电影在线| 国产亚洲天堂网| 米奇777四色精品人人爽| 成人国产电影网| 国产精品视频yy9099| 日本五十路女优| 国产欧美一区二区精品久久久| 91精品国产高清一区二区三区蜜臀| 人妻久久久一区二区三区| 中文日本在线观看| 久久综合久色欧美综合狠狠| 亚洲一区二区在线播放| 国产精品尤物视频| 亚洲精选国产| 欧美成人精品xxx| 纪美影视在线观看电视版使用方法| xvideos.蜜桃一区二区| 欧美日韩久久久一区| 久久精品免费一区二区| 午夜av在线播放| 国产精品久久久久久久第一福利 | 精品国产自在精品国产浪潮| 日本一卡二卡在线| 日韩欧美久久| 9191国产精品| 男人添女人下面免费视频| 三妻四妾完整版在线观看电视剧 | 国产欧美一区二区三区网站| 国产伦精品一区二区三区照片91| 国产精品免费无遮挡| 久久精品主播| 日本a级片电影一区二区| 日本熟妇色xxxxx日本免费看| 亚洲激情中文| 中文字幕亚洲无线码a| 2019男人天堂| 欧美熟乱15p| 在线中文字幕日韩| 高清国产在线观看| 国产毛片一区二区三区| 亚洲男人天堂网站| 法国伦理少妇愉情| 亚洲8888| 亚洲香蕉成视频在线观看| av黄色免费网站| 久久99影视| 国产亚洲欧洲在线| 亚洲精品91在线| 日韩国产欧美| 日韩在线视频二区| 亚洲一级二级片| 一本精品一区二区三区| 色777狠狠综合秋免鲁丝| 精品一区二区在线观看视频| 99精品电影| 久久五月情影视| 看片网站在线观看| 亚洲毛片在线| 人人爽久久涩噜噜噜网站| 欧美性猛交xxxx乱大交hd| 日韩精品福利网| 国产在线视频2019最新视频| 99在线精品视频免费观看软件| 国产成人午夜视频| 国产手机精品在线| 你懂的在线视频| 中文字幕av一区二区三区| 自拍偷拍亚洲色图欧美| 尤物视频在线看| 激情成人中文字幕| 邪恶网站在线观看| 欧美欧美在线| 日韩大片免费观看视频播放| 蜜桃久久精品成人无码av| 国产精品成人a在线观看| 久久综合网hezyo| 国产精品第9页| 青青青爽久久午夜综合久久午夜| 成人福利视频网| 国产麻豆免费观看| 99国产精品99久久久久久| 色婷婷精品国产一区二区三区| 国产一二区在线观看| 偷拍日韩校园综合在线| av五月天在线| 超碰97久久国产精品牛牛| 亚洲人成自拍网站| 婷婷在线精品视频| 久久蜜桃资源一区二区老牛| 成人免费淫片aa视频免费| 手机看片一区二区三区| 国产精品剧情在线亚洲| 99久久国产综合精品五月天喷水| 粉嫩av一区二区三区四区五区| 欧美一区二区日韩| 久久精品国产亚洲av久| 亚洲欧美伊人| 国产免费一区二区三区在线观看| 丁香六月天婷婷| 中文字幕一区日韩精品欧美| 一女被多男玩喷潮视频| 国产aa精品| 亚洲人成在线免费观看| 久久精品免费av| 久久精品国产一区二区三区免费看| 国产成人av一区二区三区| 最近高清中文在线字幕在线观看| 亚洲1区2区3区视频| 在线不卡一区二区三区| 国产一区二区三区电影在线观看 | 日韩精品极品视频| 538任你躁在线精品视频网站| 久久久久久久欧美精品| 国产伦精品一区二区三区照片 | 亚洲成在线观看| 国产永久免费网站| 国产一区国产二区国产三区| 97av在线影院| 亚洲国产999| 中文字幕一区二区三区在线播放 | 成人在线免费av| 日韩电影大片中文字幕| 精品无码人妻一区二区三区| 精品一区二区三区久久| 相泽南亚洲一区二区在线播放| 亚洲天堂av在线| 亚洲国产精品专区久久| 久久黄色免费网站| 国产高清亚洲一区| 大桥未久一区二区| 日韩伦理一区二区| 日韩中文字幕不卡视频| 波多野结衣大片| 久久精品一区二区三区不卡| 精品中文字幕av| 中文精品一区二区| 欧美怡红院视频一区二区三区| 日本高清视频www| 亚洲综合999| 国产情侣久久久久aⅴ免费| 国产精品v一区二区三区| 91黄在线观看| 91九色在线播放| 亚洲精品av在线播放| 制服.丝袜.亚洲.中文.综合懂色| www..com久久爱| 青青青在线播放| 精品成av人一区二区三区| 国产精品爱啪在线线免费观看| 男女视频在线观看| 欧美午夜片在线观看| 日韩欧美视频免费观看| 精品亚洲porn| 国产一区二区三区在线免费| 亚洲码欧美码一区二区三区| 久久人人97超碰精品888| 国产无遮挡又黄又爽又色视频| 色一情一乱一伦| 日本精品一区二区三区在线观看视频| x99av成人免费| 国产毛片毛片毛片毛片| 亚洲精品成人精品456| 国产精品嫩草69影院| 亚洲第一毛片| 欧美久久久久久| 国产精品黄色片| 免费av在线一区| 人妻精品无码一区二区| 欧美午夜性色大片在线观看| 日本高清www| 麻豆精品在线视频| 欧美乱做爰xxxⅹ久久久| 欧美电影免费网站| 国产精品久久久久久久av电影| 中国日本在线视频中文字幕| 日韩久久精品一区| 好看的av在线| 亚洲欧洲一区二区在线播放| 亚洲一区二区三区黄色| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲成色最大综合在线| 2020最新国产精品| 国产精品久久久久久久久粉嫩av | 蜜臀视频一区二区三区| 亚洲综合色网| 欧美婷婷久久| 日韩精品成人在线观看| 日韩av男人的天堂| 婷婷在线播放| 中文日韩在线视频| 手机av在线免费观看| 欧美女孩性生活视频| 欧美在线观看不卡| 亚洲人精品午夜| 91视频免费观看网站| 岛国一区二区三区| 99热这里只有精品在线播放| 日韩一级不卡| 精品一区二区成人免费视频| 亚州综合一区| 99在线观看| 亚洲免费资源| 国产精品高潮呻吟久久av野狼| 丁香花在线高清完整版视频| 日韩在线欧美在线国产在线| 暖暖视频在线免费观看| 亚洲爱爱爱爱爱| 国产成人精品免费看视频| 欧美少妇bbb| 依依成人综合网| 亚洲国产毛片aaaaa无费看| 国产又黄又粗又猛又爽的| 久久网站最新地址| 李丽珍裸体午夜理伦片| 国产精品系列在线播放| 日韩精品视频一二三| 久久蜜桃精品| 欧美视频在线播放一区| 亚洲日本激情| www.日本在线视频| 欧美精品日本| 久久视频免费在线| 中文字幕日韩一区二区不卡 | 欧美色综合影院| 亚洲欧美一二三区| 欧美日韩在线影院| 久草视频在线观| 亚洲成av人在线观看| 男女免费视频网站| 亚洲午夜一区二区| 国产亚洲精品码| 亚洲一区二区在线播放相泽| 国产又黄又爽又无遮挡| 一区二区在线免费观看| 天天操天天操天天操天天操天天操| 国产精品久久久久永久免费观看| 中文字幕网站在线观看| 国产日产欧美精品一区二区三区| 亚洲av片不卡无码久久| 97久久精品人人爽人人爽蜜臀| 日批在线观看视频| 99久久伊人精品| 黑人巨大精品欧美| 国产区在线观看成人精品| 丁香花五月婷婷| 中文字幕一区在线观看视频| 欧美大片xxxx| 亚洲影视在线播放| 日本三级理论片| 日韩欧美国产高清91| 91午夜精品亚洲一区二区三区| 色婷婷一区二区三区四区| 成年人视频免费| 在线成人免费视频| 欧美一级免费片| 亚洲免费高清视频| 在线免费av电影| 欧美精品性视频| 久草在线资源福利站| 国产aaa精品| 欧美激情三区| 国产成人精品一区二区三区福利 | 亚洲香蕉久久| 国产精品久久久久久久久久直播 | 久久久久国产精品厨房| 极品蜜桃臀肥臀-x88av| 亚洲精品免费在线播放| 免费看日韩毛片| 欧美日韩在线综合| 性中国xxx极品hd| 亚洲欧洲日本专区| www.在线视频| 欧洲亚洲妇女av| 国产一区精品二区| 久久久久久亚洲精品不卡4k岛国| 欧美亚洲国产精品久久| 青青在线视频免费观看| 视频一区视频二区在线观看| 亚洲综合20p| 久久久国产精品午夜一区ai换脸| 91嫩草丨国产丨精品| 欧美视频不卡中文| 国产精品天天操| 亚洲毛片在线看| 日韩少妇视频| 国产精品视频yy9099| 日韩精品福利一区二区三区| 一级做a爰片久久| 亚洲在线播放| 欧美性受xxxx黒人xyx性爽| 91在线观看免费视频| 波多野结衣不卡视频| 91福利在线看| 凸凹人妻人人澡人人添| 精品国模在线视频| 卡通欧美亚洲| 精品伦理一区二区三区 | 霍思燕三级露全乳照| 久草这里只有精品视频| 成人片黄网站色大片免费毛片| 一区二区三区精品视频| 国产精华7777777| 日韩国产高清视频在线| 2021国产在线| 国产精品视频一区二区高潮| 卡通动漫精品一区二区三区| 精品国产一区二区三区在线| 男女性色大片免费观看一区二区| 亚洲色图14p| 亚洲va在线va天堂| 性生活免费网站| 久久久99久久精品女同性| 久久久成人av毛片免费观看| 精品国产一区二区三区麻豆免费观看完整版 | 亚洲黄色一级大片| 久久精品男人天堂| 欧美xxxx性| 亚洲人成网站在线观看播放| 久久激情中文| 欧美成人午夜精品免费| 婷婷国产在线综合| 亚洲精品一区二区三区蜜桃 | 久久网免费视频| 欧美一级日韩一级| 国产黄a三级三级三级av在线看| 国产精品r级在线| 欧美**字幕| jizzjizzxxxx| 国产午夜精品一区二区三区四区 | 日韩成人午夜精品| 一区二区三区伦理片| 日本韩国精品一区二区在线观看| 天堂中文在线8| 日本精品久久久久影院| 美女久久久久| 91淫黄看大片| 亚洲国产精华液网站w| 在线观看免费视频a| 一本色道久久88综合亚洲精品ⅰ | 久久综合毛片| 久久婷婷影院| 中文字幕第二区| 欧美精品一级二级| 污污的网站在线看| 粉嫩精品一区二区三区在线观看| 伊人蜜桃色噜噜激情综合| 国产在线不卡av| 欧美性猛交xxxx乱大交| 久久久pmvav| 国产美女久久久| 欧美国产三级| 国产a级黄色片| 色综合亚洲欧洲| 日本在线免费| 成人欧美一区二区三区视频xxx| 伊人激情综合| 国产精品一二三区在线观看| 欧美日韩你懂得| 中文字幕在线观看网站| 国产精品青青草| 日韩精品视频网| 永久免费看片直接| 欧美精品一区二区三| 欧美男体视频| 天天成人综合网| 99久久精品一区二区| www.五月婷婷.com| 欧美超级免费视 在线| 美女福利一区| 亚洲免费黄色网| 欧美日韩国产精品一区| 97在线观看免费观看高清| 97在线电影| 日精品一区二区| 草视频在线观看| 亚洲香蕉成人av网站在线观看| 久久视频社区| 日韩av资源在线| 亚洲丝袜美腿综合| 男女视频在线观看免费| 亚洲自拍偷拍网址| 久久久亚洲一区| 久久在线视频精品| 一本一本久久a久久精品牛牛影视| 疯狂欧洲av久久成人av电影| 日韩中文字幕在线视频观看| 专区另类欧美日韩| 国产在线超碰| 国产亚洲第一区| 狠狠色丁香婷综合久久| 九一国产在线观看|