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

Webpack4的SourceMap階段的性能優化和踩坑

開發 前端
SourceMap生成流程 SourceMap 生成過程中,由于項目過大導致需要計算處理的映射節點(SourceNode)特別多(遇到過10^6數量級的項目),這也導致 SourceMap 生成過程中內存飆升頻繁 GC,構建十分緩慢甚至 OOM。

Hello,大家好,我是松寶寫代碼,寫寶寫的不止是代碼。

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

背景

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

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

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

今天帶來的是webapck4sourceMap階段。

SourceMap階段

SourceMap生成流程 SourceMap 生成過程中,由于項目過大導致需要計算處理的映射節點(SourceNode)特別多(遇到過10^6數量級的項目),這也導致 SourceMap 生成過程中內存飆升頻繁 GC,構建十分緩慢甚至 OOM。

Webpack 內部有大量的代碼拼接工作,而每一次代碼拼接都涉及到 SourceMap 的處理,因此 Webpack 內封裝了 webpack-sources,其中 SourceMapSource 用于保存 SourceMap,ConcatSource 用于代碼拼接, SourceMap 操作使用 source-map 和 source-list-map 庫來處理。

而其內部實際上是在運行 sourceAndMap()/map() 方法時才進行計算:

// webpack-sources/SourceMapSource
class SourceMapSource extends Source {
  // ...
  node(options) {
    // 此處進行真正的計算
    var sourceMap = this._sourceMap;
    var node = SourceNode.fromStringWithSourceMap(this._value, new SourceMapConsumer(sourceMap));
    node.setSourceContent(this._name, this._originalSource);
    var innerSourceMap = this._innerSourceMap;
    if(innerSourceMap) {
      node = applySourceMap(node, new SourceMapConsumer(innerSourceMap), this._name, this._removeOriginalSource);
    }
    return node;
  }
  // ...
}
// webpack-sources/SourceAndMapMixin
proto.sourceAndMap = function (options) {
  options = options || {};
  if (options.columns === false) {
    return this.listMap(options).toStringWithSourceMap({
      file: "x",
    });
  }

  var res = this.node(options).toStringWithSourceMap({
    file: "x",
  });
  return {
    source: res.code,
    map: res.map.toJSON(),
  };
};

SourceMap 優化方案

很顯然,如果把所有模塊的 SourceMap 都放到最后一起來計算,對主進程長時間占用導致 SourceMap 生成緩慢。可以通過如下方法進行優化:

  1. 使用行映射 SourceMap
  2. SourceMap 并行化
  3. SourceNode 內存優化

行映射 SourceMap

SourceMap 的本質就是大量的 SourceNode 組成,每一個 SourceNode 存儲了產物的位置到源碼位置的映射關系。通常映射關系是行號+列號,但我們排查bug時候一般只看哪一行,具體哪一列看的不多。如果忽略列號則可以大幅度減少 SourceNode 的數量。

SourceMapDevToolPlugin 中的 columns 設為 true 時就是行映射 SourceMap。但這個插件處理的邏輯已經是在最后產物生成階段,而在整個 Webpack 構建流程中流轉的 SourceMap 依然是行列映射。因此可以直接代理掉 SourceMapSource 的 map 方法,寫死 columns 為 true。

SourceMap 并行化

SourceMap 最后一起堆積在主進程中生成是非常緩慢的,因此可以考慮在模塊級壓縮的時候,手動模擬 node() 方法,觸發一下 applySourceMap 方法提前生成 SourceNode,并將 SourceNode 序列化傳遞回主進程,當主進程需要使用時直接獲取即可。

SourceNode 內存優化

當字符串被 split 時,行為與 substr 不太一樣,split 會生成字符串的拷貝,占用額外的內存(chrome memory profile 中為string),而 substr 會生成引用,字符串不會拷貝占用額外內存(chrome memory profile 中為 sliced string),但與此同時也意味著父字符串無法被 GC 回收。

const bigstring = '00000\n'.repeat(50000);
console.log(bigstring); // 觸發生成
const array = bigstring.split('\n');

圖片

const bigstring = '00000\n'.repeat(500000);
console.log(bigstring)
const array = [];
for (let i = 0; i < 100000;i++) {
  array.push(bigstring.substr(i*5,i*5+5));
}

圖片


而看 source-map 中 SourceNode 的代碼可以發現:

  • SourceNode 會將完整代碼根據換行符 split 切分(生成大量 string 內存占用)。
  • 根據 mapping 對代碼求子串并保存(此時意味著這些 string 無法被釋放)。
// source-map/SourceNode
SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(
  aGeneratedCode,
  aSourceMapConsumer,
  aRelativePath
) {
  // ...
  // 此處進行了代碼切分
  var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
  // ...

  aSourceMapConsumer.eachMapping(function (mapping) {
    if (lastMapping !== null) {
      if (lastGeneratedLine < mapping.generatedLine) {
        // ...
      } else {
        var nextLine = remainingLines[remainingLinesIndex] || '';
        // 此處獲取子串并長久保存
        var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn);
        // ...
        addMappingWithCode(lastMapping, code);
        // No more remaining code, continue
        lastMapping = mapping;
        return;
      }
    }
    //...
  }, this);
  // ...
};

那么這個昂貴的 "code" 字段干什么用的呢?實際上只有如下兩個功能:

  1. 每一個 code 都會生成一個子 SourceNode,而最終遞歸生成的子 SourceNode 在 walk 階段又會拼接回產物代碼。
  2. 如果包含了換行符,則會用來做映射位置的偏移計算。
// source-map/SourceNode
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
  // ...
  this.walk(function (chunk, original) {
    generated.code += chunk;
    //...
    for (var idx = 0, length = chunk.length; idx < length; idx++) {
      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
        generated.line++;
        generated.column = 0;
        // Mappings end at eol
        // ...
      } else {
        generated.column++;
      }
    }
  });
  this.walkSourceContents(function (sourceFile, sourceContent) {
    map.setSourceContent(sourceFile, sourceContent);
  });

  return { code: generated.code, map: map };
};

那么問題來了,產物代碼有很多其他渠道能夠獲取不需要在這里計算。而僅僅為了換行計算浪費如此大量的內存顯然是不合理的。因此可以在一開始就把換行符的位置計算出來,保留在 SourceNode 內部,然后讓切分出來的字符被 GC 回收,等到 walk 的時候直接拿這些換行符記錄進行計算即可。

衍生的應用場景

思路

前面構建生成了緩存,我們希望緩存是可移植、可拼接、預生成的:

  1. 可移植:中間產物不依賴特定環境,放到其他場景下依然能夠使用。
  2. 可拼接:對于每一個項目都有自己的中間產物,而當一個聚合的項目使用這些項目時,也可以通過聚合生成自己的中間產物。
  3. 預生成:中間產物可以提前生成,存放到云端,在任何有需要的場景下載使用。

通過預生成,按需下發,動態拼接的方式,就能真正做到“絕不構建第二次”。

可移植緩存

緩存與環境解耦是可以讓緩存跨機器使用,遺憾的是 Webpack 在其模塊的 request 中包含絕對路徑(要找到對應的文件),導致與其相關的 AST 解析、模塊 ID 生成等等都受到影響。因此要做到可移植緩存,需要如下改造:

  1. 統一的緩存管理:不受控的緩存難以做后續的環境解耦。
  2. 路徑替換&復原:對于寫入緩存的所有內容,一旦出現了本地路徑,都需要替換成占位符。讀取時則需要將占位符恢復成新環境的路徑。
  3. AST 偏移矯正:由于路徑替換過程中,路徑長度發生變化,從而導致上述依賴解析階段的 AST 位置信息緩存失效,因此需要根據路徑長度差異對 AST 位置進行矯正。
  4. Hash 代理:由于構建流程中有大量的 Hash 生成場景,而一旦包含了本地路徑字符串加入到 Hash 生成中,則必然導致 Hash 在新環境下無法被匹配。

圖片

增量的構建

有了可移植的緩存,就能實現增量的構建。核心思路如下:

  • 項目某個特定版本源碼作為項目基線,基線初始化構建生成基線緩存和基線文件元數據
  • 當文件發生變化時:
  • 收集變化的文件生成變更元數據。
  • 變更元數據 + 基線緩存 + 基線文件元數據,構建生成變更后產物+熱更新產物,同時產出增量補丁。
  • 增量補丁主要包含文件目錄的增量、緩存的增量。
  • 如果有前代增量補丁,可以合并。
  • 當環境發生變化時,在新環境下:
  • 增量補丁+基線緩存+基線文件元數據,通過增量消費構建,也可以再次產出構建產物。
  • 當需要提升一個特定增量補丁的版本作為基線時,將其增量變更與基線緩存、基線文件元數據合并即可。

圖片

增量構建最大的好處:解決長迭代鏈導致的緩存存儲成本爆炸問題。

舉個例子:如果要做一個類似于 codepen、jsfiddle 那樣的 playground,可以在線編輯項目代碼,迭代中的每次編輯都可以回退,同時也能隨時將一次修改派生成為一個新的迭代。

在這種場景下,顯然不能給每次代碼修改都完整復刻一套緩存。增量的構建僅需要保存一個基線和對應版本相對于基線的增量,當切換到一個特定版本時,使用基線+增量就可以編譯出最新的產物,實現版本的快速恢復。這個同理可以應用在項目自身迭代過程的構建緩存池中。

最后

一些思考

  • 函數編寫:牢記“引用透明”原則,這是緩存、并行化的基本前提。
  • 模型設計:保證可序列化/反序列化,為緩存、并行化打好基礎。
  • 緩存設計:所有緩存應當結構簡單且路徑無關,保證緩存可移植、可拼接。
  • 對象引用:盡早釋放巨大對象的引用,僅保留需要的數據。
  • 插件機制:tapable 這種 pub/sub 機制是否真的合理且靈活,也許高階函數更加合適。
  • TypeScript:非 TS 代碼閱讀難度很大,運行時的數據流不去 debug 無法理解。

一些腦洞:

圖片

責任編輯:姜華
相關推薦

2023-04-27 08:35:20

Webpack 4性能優化

2020-09-19 21:26:56

webpack

2021-06-09 08:21:14

Webpack環境變量前端

2022-08-26 13:24:03

version源碼sources

2019-03-15 15:00:49

Webpack構建速度前端

2010-05-05 11:48:27

Oracle設計開發階

2021-11-09 09:57:46

Webpack 前端分包優化

2023-02-20 08:11:04

2021-12-15 09:21:59

Webpack 前端Sourcemap

2019-03-05 10:20:49

WebWebpack分離數據

2021-12-28 08:17:41

循環 forgo

2017-07-17 15:46:20

Oracle并行機制

2024-04-10 08:39:56

BigDecimal浮點數二進制

2010-04-21 14:00:48

Oracle數據庫

2024-04-01 08:05:27

Go開發Java

2022-09-23 15:23:08

webpack5改變代碼

2016-09-21 13:17:31

LibreOfficeJava緩沖區

2019-03-26 10:02:16

WebpackJavascript前端

2024-11-26 08:20:53

程序數據歸檔庫

2018-01-10 13:40:03

數據庫MySQL表設計
點贊
收藏

51CTO技術棧公眾號

色94色欧美sute亚洲线路一ni | 国产一区二区三区直播精品电影| 久在线观看视频| 日本韩国精品一区二区| 首页国产欧美久久| 久久久精品网站| www男人天堂| 国产亚洲一区二区手机在线观看| 国产精品麻豆一区二区| 成人动漫在线观看视频| 性无码专区无码| 欧美激情理论| 亚洲国产精品一区二区三区| 福利在线一区二区三区| 污污视频在线看| 久久精品一区二区三区不卡牛牛 | 日韩中文一区二区| 日韩欧美成人网| 中国老女人av| 国产一二三在线观看| 国产精品99久久久久久久女警| 欧洲亚洲在线视频| 欧美精品入口蜜桃| 欧美日韩一区二区综合| 精品三级在线观看| 亚洲欧美偷拍另类| 成人勉费视频| 亚洲国产你懂的| 在线视频福利一区| 欧美日韩伦理片| 国产精品一区二区免费不卡| 国产成人精品日本亚洲| 久久精品国产亚洲AV无码男同| 欧美色就是色| 日韩电影中文字幕av| 日本亚洲一区二区三区| a成人v在线| 日韩欧美视频一区二区三区| 亚洲精品日韩成人| 久久久pmvav| 成人高清视频在线观看| 91免费人成网站在线观看18| 国产偷人爽久久久久久老妇app | 欧美成人免费全部| 免费黄在线观看| 亚洲第一福利社区| 亚洲精品99久久久久| 中文字幕人妻无码系列第三区| 精品欧美日韩精品| 色综合中文综合网| 日韩在线视频在线观看| av资源网在线播放| 一区二区不卡在线播放| 久久av秘一区二区三区| 夜级特黄日本大片_在线| 国产日韩精品视频一区| 欧美一区二区三区四区在线观看地址| 欧美 日韩 国产 成人 在线 91| 国产成人综合自拍| 91亚洲国产成人精品性色| 一区二区美女视频| 久久国产精品99久久人人澡| 国产精自产拍久久久久久| 波多野结衣黄色| 日韩av成人高清| 日本国产欧美一区二区三区| 在线精品免费视| 国产精品久久777777毛茸茸| 91精品国产乱码久久久久久久久 | 欧美成人午夜| 欧美高跟鞋交xxxxxhd| 久草成人在线视频| 91久久中文| 热草久综合在线| 丰满人妻一区二区三区四区| 免费成人av在线| 成人国产精品色哟哟| 国产情侣激情自拍| 成人综合激情网| 九九九九九九精品| 国产资源在线观看| 成人免费在线观看入口| 轻点好疼好大好爽视频| 麻豆mv在线看| 欧美丝袜第三区| 国产5g成人5g天天爽| 亚洲精品一区国产| 国产视频精品在线| 亚洲欧美卡通动漫| 欧美日韩a区| 欧美怡红院视频一区二区三区| 久久精品视频2| 精品无码三级在线观看视频| 99电影在线观看| 亚洲欧美日韩精品永久在线| 国产欧美一区二区在线| 中文字幕在线中文字幕日亚韩一区| 亚洲精品白浆| 欧美性xxxxxxxxx| 国产乱叫456| 欧美一级三级| 久久视频免费观看| 国产小视频在线免费观看 | 免费欧美一级片| 亚洲精品亚洲人成在线观看| 久久精品人人做人人爽| 日操夜操天天操| 麻豆国产一区二区| 精品国产91亚洲一区二区三区www| 国产视频二区在线观看| 亚洲一区二区欧美日韩| 男人天堂成人在线| 超碰成人97| www日韩欧美| 亚洲第一精品在线观看| 国产真实乱偷精品视频免| 久久精品一区二区三区不卡免费视频| 日本在线免费| 欧美午夜xxx| wwwxxx色| 日韩极品一区| 欧美一区二三区| 亚洲黄色成人久久久| 老司机福利在线观看| 亚洲调教视频在线观看| 国产精品久久在线观看| 欧美自拍第一页| 中文字幕一区二区三区色视频| 国产va亚洲va在线va| 欧美日韩卡一| 亚洲一区二区久久久| 日韩激情在线播放| 国产精品亚洲第一| 亚洲永久激情精品| 三上悠亚亚洲一区| 亚洲精品720p| xxxxxx国产| 国产馆精品极品| youjizz.com亚洲| 欧美日韩亚洲国产| 日韩成人av网址| 久久精品国产亚洲AV无码麻豆| 国产又粗又猛又爽又黄91精品| 亚洲不卡1区| 涩涩视频在线播放| 精品91自产拍在线观看一区| 日本妇女毛茸茸| 精品一区二区三区在线观看国产| 日日噜噜噜噜夜夜爽亚洲精品| 婷婷电影在线观看| 亚洲精品福利视频| 国产手机在线视频| av在线播放不卡| 成人免费观看cn| 国产伦理久久久久久妇女| 欧美激情在线观看视频| www.av网站| 亚洲一区中文在线| 韩国三级视频在线观看| 狠狠色综合网| 精品国产一区二区三区四区vr| 福利在线导航136| 亚洲第一页在线| 超碰中文字幕在线| 91麻豆国产福利在线观看| 缅甸午夜性猛交xxxx| 亚洲精品无吗| 国产精品欧美日韩久久| 日韩电影免费观看中文字幕| 久久久久久不卡| 国产欧美视频一区二区三区| 999精彩视频| 久久一区91| 亚洲在线www| а√天堂中文在线资源8| 精品无人区太爽高潮在线播放 | 红桃视频成人在线观看| 久久丫精品国产亚洲av不卡| 日韩有码一区二区三区| 在线观看日本一区| 91久久偷偷做嫩草影院电| 久久久亚洲影院| 免费在线黄色影片| 欧美剧情电影在线观看完整版免费励志电影| 中文字幕乱码av| 成人性视频免费网站| 激情六月丁香婷婷| 999精品在线| 国产欧美韩日| 97成人超碰| 欧美激情极品视频| 日av在线播放| 欧美精品tushy高清| 国产精品6666| 国产欧美精品一区| 久久久久亚洲av无码网站| 久久精品女人| 特级西西444| 亚洲国产欧美日韩在线观看第一区| 国产精品女人久久久久久| 在线看一级片| 亚洲欧洲国产一区| www.污视频| 91久久免费观看| 欧美日韩在线观看免费| 久久综合九色综合97婷婷| 激情文学亚洲色图| 新67194成人永久网站| 成年人黄色在线观看| 欧美三级午夜理伦三级小说| 国产乱肥老妇国产一区二 | 午夜免费福利视频在线观看| 夜久久久久久| 椎名由奈jux491在线播放 | 国产精品综合在线视频| av动漫免费看| 欧美午夜电影在线观看| 亚洲国产一区二区三区在线播| 极品国产人妖chinesets亚洲人妖| 国产精品看片资源| 国产精品xx| 欧美激情国产日韩精品一区18| 自拍视频在线网| 日韩精品视频在线免费观看| 国产农村老头老太视频| 在线欧美小视频| 天堂网av手机版| 亚洲一区二区三区四区不卡| 亚洲国产123| 欧美国产日韩精品免费观看| 中文字幕 亚洲一区| 国产91精品欧美| www.51色.com| 久久99精品久久久久久国产越南 | 久草网视频在线观看| 国产精品久久久久影院老司| 国产精品1000部啪视频| 成人激情免费电影网址| 精品人妻一区二区乱码| 国产最新精品精品你懂的| 中文字幕在线观看第三页| 男人的天堂亚洲在线| 久久久久久久午夜| 亚洲精品孕妇| 日韩精品―中文字幕| 99国产精品视频免费观看一公开 | 精品一区久久久久久| 国产精品chinese在线观看| 国产成人精品一区二区三区福利| 欧洲大片精品免费永久看nba| 成人国产在线视频| 日本午夜免费一区二区| 国产精品男人爽免费视频1| 国产三级一区| 国产日韩欧美在线观看| 日韩精品第二页| 亚洲va电影大全| 麻豆久久一区| 成人3d动漫一区二区三区91| 豆花视频一区二区| 国产在线精品一区二区中文| 卡一精品卡二卡三网站乱码| 精品国产乱码久久久久久郑州公司| 精品国产一区二区三区成人影院| 国产一区精品视频| 亚洲激情播播| 日韩在线导航| 亚洲成人国产| 欧洲精品在线播放| 亚洲乱码视频| av网站在线观看不卡| 日本特黄久久久高潮| 天天综合网久久| 国产黄色精品视频| 中文字幕 日本| 久久久久9999亚洲精品| 少妇av片在线观看| |精品福利一区二区三区| 久久久久久久久毛片| 性感美女极品91精品| 色老头在线视频| 欧美另类高清zo欧美| 亚洲第一色视频| 日韩av在线免费看| 香蕉视频网站在线观看| 欧美大尺度激情区在线播放| 国产伦久视频在线观看| 国产精品爽爽爽| 7777精品| 日产国产精品精品a∨| 亚洲欧洲美洲一区二区三区| 成人免费观看cn| 麻豆freexxxx性91精品| 久久性爱视频网站| 欧美国产成人在线| 久久亚洲国产成人精品性色| 91高清视频在线| 精品免费久久久| 亚洲欧美色婷婷| gogo在线观看| 日韩av成人在线| 精品三级国产| 欧美日韩一区二区三区在线观看免| 欧美a级成人淫片免费看| 三上悠亚久久精品| 激情综合色综合久久| 成人无码www在线看免费| 亚洲欧洲av一区二区三区久久| 国产a∨精品一区二区三区仙踪林| 欧美日韩国产精品成人| 天堂在线视频免费| 久久亚洲精品国产亚洲老地址| 毛片无码国产| 国产精品免费一区二区三区四区| 清纯唯美亚洲综合一区| 131美女爱做视频| 国产一区视频导航| 人妻一区二区视频| 图片区日韩欧美亚洲| 国产丝袜视频在线观看| 在线观看久久久久久| 亚洲女同志freevdieo| 成人三级在线| 91精品婷婷色在线观看| 大肉大捧一进一出好爽动态图| 国产成人免费av在线| 亚洲区一区二区三| 欧美专区日韩专区| 日本亚洲一区| 2019国产精品自在线拍国产不卡| 亚洲天堂av资源在线观看| 在线免费观看一区二区三区| 日韩主播视频在线| 波多野结衣福利| 亚洲午夜国产一区99re久久| 99久久久久久久| 久久精品91久久久久久再现| 欧美日韩尤物久久| 欧美日韩在线精品| 午夜在线观看免费一区| 亚洲图片综合网| 亚洲国产cao| 蜜臀久久精品久久久久| 久久久欧美一区二区| 成人h动漫免费观看网站| 波多野结衣 作品| 国产高清不卡一区二区| 9999热视频| 日韩一级成人av| 日本在线视频中文有码| 亚洲影院色在线观看免费| 中国成人一区| 91人妻一区二区三区| 亚洲精品免费在线| www.97av| 91国语精品自产拍在线观看性色| 国产美女撒尿一区二区| 丰满少妇久久久| 91麻豆产精品久久久久久| 影音先锋在线国产| 亚洲天堂成人在线| 日本黄色一区| 日本免费在线视频观看| 国产精品一级在线| 国产精品99精品无码视| 亚洲国产女人aaa毛片在线| 中文字幕乱码在线播放| 日本一区二区三区精品视频| 久久精品国产亚洲一区二区三区| 五月综合色婷婷| 日韩欧美国产高清| 爱搞国产精品| 日本福利一区二区三区| 美女在线观看视频一区二区| 免费在线观看黄色小视频| 日韩一级视频免费观看在线| 极品在线视频| 亚洲高清123| 国产精品亚洲人在线观看| 全部毛片永久免费看| 在线激情影院一区| 精品国产亚洲一区二区三区在线| www.av蜜桃| 国产亚洲一区二区三区在线观看 | 麻豆精品新av中文字幕| 一区二区在线观看免费视频| 亚洲精品永久免费精品| 青青国产精品| 黄页免费在线观看视频| 国产精品毛片大码女人| 黄色美女一级片| 国产精品福利网| 欧美久久成人| 中国女人特级毛片| 日韩精品影音先锋| 影音成人av| www.av蜜桃| 自拍偷自拍亚洲精品播放| 午夜影院免费视频| 国产中文日韩欧美|