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

无码国产伦一区二区三区视频 | 91tv亚洲精品香蕉国产一区| 久久精品视频免费| 成人福利在线观看| 日韩成人高清视频| 欧美在线色图| 日韩三级在线免费观看| 欧美日韩国产精品激情在线播放| av女优在线| 不卡欧美aaaaa| 国产精品视频一区国模私拍 | 欧美理论在线| 亚洲系列中文字幕| 国产原创剧情av| 四虎国产精品成人免费影视| 精品国产电影一区| 国产av第一区| 国产人成在线视频| 国产99精品视频| 国产欧美最新羞羞视频在线观看| 日韩av综合在线| 午夜久久免费观看| 亚洲一区二区福利| 国产吞精囗交久久久| 亚洲国产欧美国产第一区| 欧美怡红院视频| 5月婷婷6月丁香| 在线h片观看| 国产精品色呦呦| 欧美日韩国产一二| 色呦呦免费观看| 国产精品1区2区| 国产中文字幕日韩| 久久久久精彩视频| 免费在线亚洲欧美| 97免费视频在线| 国产第一页第二页| 国产真实久久| 欧美国产日韩一区二区| 免费人成视频在线| 一区二区影院| 欧美成年人在线观看| 一本色道久久88| 日韩国产一区二区| 综合网中文字幕| 欧美丰满美乳xxⅹ高潮www| 日韩超碰人人爽人人做人人添| 精品久久久久久久人人人人传媒 | 久久99久久99精品免观看粉嫩 | 亚洲成av人片一区二区三区| 四虎4hu永久免费入口| 免费a级在线播放| 国产精品美女久久久久久久久 | 瑟瑟视频在线观看| 日本一道高清一区二区三区| 精品噜噜噜噜久久久久久久久试看| 国产大片一区二区三区| 国产精品视频一区二区三区综合| 欧美日韩电影在线播放| 手机在线视频一区| 日韩精品视频一区二区三区| 欧美刺激午夜性久久久久久久| 欧美一区二区三区影院| 91精品尤物| 亚洲国产精品高清久久久| 大尺度做爰床戏呻吟舒畅| 日本欧美韩国国产| 中文字幕在线日韩| 欧美成人777| 国产精品成人一区二区网站软件| 97精品一区二区三区| 999这里只有精品| 久久久久久夜| 国产日韩亚洲欧美| 性色av蜜臀av| 91免费精品国自产拍在线不卡| 欧美日韩国产免费一区二区三区 | 羞羞色国产精品网站| 亚洲男人天堂2023| 黄色片网站在线播放| 在线一区免费| 98精品在线视频| 欧美性受xxx黑人xyx性爽| 极品少妇xxxx偷拍精品少妇| 痴汉一区二区三区| 你懂的在线看| 亚洲视频一区二区在线| 丰满少妇久久久| 国产精品99| 精品国产乱码久久久久久久| 成人免费无遮挡无码黄漫视频| 欧美黄色大片在线观看| 久久久久久美女| 制服丝袜在线一区| 懂色av一区二区三区免费观看| 欧美亚洲另类久久综合| 国产福利视频在线观看| 欧美三级免费观看| 日韩av影视大全| 禁果av一区二区三区| 欧美日韩爱爱视频| 五月天中文字幕| av成人免费在线观看| 99精品视频网站| 欧美电影h版| 精品国产一区二区三区四区四| 一二三四国产精品| 国产精品嫩草99av在线| 成人在线播放av| 国产中文在线视频| 亚洲成人资源网| 在线观看免费av网址| 丝袜美腿一区二区三区动态图| 久久久999国产| 波多野结衣黄色| av午夜精品一区二区三区| 91社在线播放| 激情久久99| 亚洲视频日韩精品| 亚洲日本韩国在线| 国产99久久久国产精品潘金| 免费成人深夜夜行网站视频| 欧美国产日韩电影| 亚洲天堂av高清| 99久在线精品99re8热| 国产69精品久久久久777| 亚洲一区影院| 韩日精品一区| 国产亚洲综合久久| 中文字幕69页| 91啪九色porn原创视频在线观看| 国产传媒久久久| 精品国产亚洲一区二区在线观看| 日韩在线观看免费网站| 潘金莲一级淫片aaaaaa播放| 91亚洲午夜精品久久久久久| 人妻少妇精品久久| 成人高潮视频| 久久久久久久久久婷婷| 亚洲av无码片一区二区三区| 亚洲视频1区2区| av噜噜在线观看| 小说区亚洲自拍另类图片专区| 国产在线拍偷自揄拍精品| 免费av在线| 日韩免费在线观看| 精品处破女学生| www.日韩精品| 日日橹狠狠爱欧美超碰| 亚州精品视频| 国产成人精品999| 国产精品免费播放| 欧美日韩精品福利| 最新一区二区三区| 国产精品一区免费在线观看| 国产精品69久久久| 久久悠悠精品综合网| 91av在线影院| 国产黄在线播放| 欧美久久久影院| 一区二区在线观看免费视频| 成人免费毛片嘿嘿连载视频| 日本在线xxx| 国产欧美日韩免费观看| 国产在线精品一区免费香蕉| 日本伦理一区二区| 日韩av在线不卡| 亚洲免费视频二区| 亚洲日本在线天堂| 成人手机在线免费视频| 久久只有精品| 精品日韩在线播放| 日韩精品福利一区二区三区| 国产精品亚洲一区二区三区| 成人短视频在线观看| 亚洲国产毛片完整版| 艳妇乳肉豪妇荡乳av无码福利| 亚洲欧洲日韩女同| av av在线| 美女国产一区二区三区| 亚洲熟妇无码av在线播放| 欧美女优在线视频| 91精品久久久久久久久久久| 爱看av在线| 在线观看视频99| 国产91免费在线观看| 日本精品一区二区三区四区的功能| 欧美a级片免费看| 99视频一区二区| 欧美视频国产视频| 国产一区二区三区久久| 7777在线视频| 蜜桃国内精品久久久久软件9| 91精品久久久久久久久久久| 欧美男男tv网站在线播放| 北条麻妃一区二区三区中文字幕| 欧美视频久久久| 欧美日韩成人激情| 国产精品视频免费播放| 亚洲欧美日韩国产另类专区| 性欧美丰满熟妇xxxx性仙踪林| 精品亚洲成av人在线观看| 中文字幕无码精品亚洲35| 亚洲不卡av不卡一区二区| 美脚丝袜一区二区三区在线观看| 清纯唯美激情亚洲| 国产精品吹潮在线观看| 草草在线观看| 久久福利网址导航| 3d成人动漫在线| 亚洲老板91色精品久久| 成人av手机在线| 欧美欧美午夜aⅴ在线观看| 欧美亚洲精品天堂| 亚洲国产日日夜夜| 男人操女人的视频网站| 国产精品午夜春色av| 亚洲第一成人网站| www.欧美.com| 亚洲香蕉中文网| 国产精品一二三四区| 手机免费av片| 日本不卡123| av免费网站观看| 亚洲影院在线| av免费观看网| 亚洲黑丝一区二区| av在线观看地址| 国产精品theporn| 国产毛片久久久久久国产毛片| 91不卡在线观看| 伊人av成人| 91久久电影| 特级黄色录像片| 亚洲国产精品综合久久久| 中文字幕一区综合| 99久久久久| 400部精品国偷自产在线观看| 欧美xxxxx视频| 一本久道久久综合| 日韩欧美二区| 亚洲午夜精品久久| 99精品综合| 在线视频不卡一区二区三区| 99精品电影| 日本丰满大乳奶| 欧美日韩国产亚洲一区| 欧美高清中文字幕| 一区二区三区国产盗摄| 大肉大捧一进一出好爽视频| 国产精品一级| 国产成人亚洲精品无码h在线| 模特精品在线| 亚洲欧美国产日韩综合| 九色综合国产一区二区三区| 国产精品久久久久久9999| 国产专区欧美精品| 亚洲一区二区三区四区精品| 国产成人精品免费一区二区| 人妻体内射精一区二区三区| 99re视频精品| 熟女少妇内射日韩亚洲| 国产精品视频一二三区| 欧美国产日韩在线观看成人| 亚洲综合成人网| 男人日女人网站| 欧美视频一区在线观看| 国产高清视频免费| 亚洲韩国日本中文字幕| 国产51人人成人人人人爽色哟哟| 日韩亚洲精品电影| sm在线观看| 国产黑人绿帽在线第一区| 欧美日韩破处视频| 高清国产在线一区| 免费短视频成人日韩| 在线亚洲美日韩| 在线成人欧美| 免费看污黄网站| 国产成人自拍网| 国产熟妇久久777777| 自拍偷在线精品自拍偷无码专区| 精品在线视频观看| 91搞黄在线观看| 亚洲av永久无码国产精品久久| 亚洲精品短视频| 免费网站成人| 欧亚精品中文字幕| 免费一级欧美在线大片| 欧美日韩最好看的视频| 欧美在线网址| 91av俱乐部| 成人性视频网站| 日韩av片在线免费观看| 精品欧美aⅴ在线网站| 97视频免费在线| 亚洲美女性视频| 亚洲精品天堂| 国产精品女人久久久久久| 嗯用力啊快一点好舒服小柔久久| 亚洲精品乱码视频| 国产精品一区毛片| 无码人妻一区二区三区精品视频| 国产午夜精品一区二区三区嫩草| 久久精品免费av| 51久久夜色精品国产麻豆| 你懂的在线观看| 海角国产乱辈乱精品视频| 亚洲欧美一级| 天天久久人人| 亚洲欧美日韩国产一区二区| 国产chinesehd精品露脸| 国产精品久久久久一区二区三区 | 久久亚洲午夜电影| 欧美日韩亚洲一区| 三年中文在线观看免费大全中国| 久久久精品日韩欧美| 国产精选第一页| 日韩欧美国产成人一区二区| 日韩精品成人av| 国产精品美女www爽爽爽视频| 日韩av中文字幕一区| 黄色一级片国产| 国产一区二区免费在线| 永久免费看片直接| 欧美肥妇毛茸茸| 在线观看h片| 国产精品久久久久久久久久99| 免费毛片在线不卡| 免费无码国产v片在线观看| 成人黄色在线视频| 国产精选第一页| 亚洲娇小xxxx欧美娇小| 2018av在线| 国产一区二区久久久| 亚洲日本久久| 日本一区二区在线免费观看| 亚洲国产另类精品专区| 亚洲AV无码乱码国产精品牛牛| 精品少妇一区二区30p| 国产精品美女久久久久人| 中文字幕一区二区三区四区五区六区 | 国产欧美一区二区三区在线老狼| 久久久黄色大片| 亚洲人成五月天| 精品日韩视频| 亚洲免费精品视频| 久久国产精品99久久人人澡| 日韩在线一卡二卡| 欧美一区二区三区影视| 神马午夜伦理不卡 | 香蕉人妻av久久久久天天| 97国产一区二区精品久久呦| 日本韩国欧美超级黄在线观看| 国内自拍在线观看| 久久久久久**毛片大全| 中文字幕在线观看你懂的| xxxx性欧美| aaa国产精品| 欧美三级一级片| 国产日韩高清在线| 国产精品亚洲lv粉色| 欧美激情aaaa| 日韩高清一级| 日日干夜夜操s8| 亚洲激情网站免费观看| 无码国产精品高潮久久99| 国产精品视频永久免费播放| 伊人久久大香线| 蜜桃精品成人影片| 欧美三级电影网站| 羞羞视频在线观看不卡| 久久精品国产精品青草色艺| 日韩专区一卡二卡| 999精品在线视频| 亚洲成人网在线观看| 日韩成人亚洲| 97久久国产亚洲精品超碰热| xnxx国产精品| 国产精品综合在线| 98视频在线噜噜噜国产| 奇米影视亚洲| 美女扒开腿免费视频| 在线免费观看日本一区| 亚洲精品天堂| 日本视频精品一区| 国产成人精品1024| 无码日韩精品一区二区| 欧美乱大交xxxxx| 综合伊思人在钱三区| 午夜诱惑痒痒网| 色婷婷国产精品久久包臀| 黄网页免费在线观看| 久久久久高清| 国产呦精品一区二区三区网站| 男人的天堂一区二区| 久久久精品中文字幕| 免费成人高清在线视频theav| 粗大的内捧猛烈进出视频| 91高清在线观看|