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

Webpack 實戰(zhàn)系列一:正確使用 Sourcemap

開發(fā) 前端
Sourcemap 協(xié)議最初由 Google 設(shè)計并率先在 Closure Inspector 實現(xiàn),它能夠?qū)⒔?jīng)過壓縮、混淆、合并的代碼還原回未打包狀態(tài),幫助開發(fā)者在生產(chǎn)環(huán)境中精確定位問題發(fā)生的行列位置。

[[440484]]

一、什么是 Sourcemap

Sourcemap 協(xié)議最初由 Google 設(shè)計并率先在 Closure Inspector 實現(xiàn),它能夠?qū)⒔?jīng)過壓縮、混淆、合并的代碼還原回未打包狀態(tài),幫助開發(fā)者在生產(chǎn)環(huán)境中精確定位問題發(fā)生的行列位置。

發(fā)展至今,Sourcemap 已廣泛受 Webpack、Rollup、Babel、Less、Typescript、Chrome、Safari、VS Code 等工具支持。

參考:https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k

實現(xiàn)上,Sourcemap 由三部分組成:

  • 開發(fā)者編寫的原始代碼
  • 經(jīng)過 Webpack、Rollup 等工程化工具壓縮、轉(zhuǎn)化、合并后的產(chǎn)物,且產(chǎn)物中必須包含指向 Sourcemap 文件地址的 //# sourceMappingURL=https://xxxx/bundle.js.map 指令
  • 記錄原始代碼與經(jīng)過工程化處理代碼之間位置映射關(guān)系 Map 文件

頁面初始運行時只會加載編譯構(gòu)建產(chǎn)物,直到特定事件發(fā)生 —— 例如在 Chrome 打開 Devtool 面板時,才會根據(jù) //# sourceMappingURL 內(nèi)容自動加載 Map 文件,并按 Sourcemap 協(xié)議約定的映射規(guī)則將代碼重構(gòu)還原回原始形態(tài),這既能保證終端用戶的性能體驗,又能幫助開發(fā)者快速還原現(xiàn)場,提升線上問題的定位與調(diào)試效率。

1.1 示例

以 Webpack 為例,設(shè)置 devtool = 'source-map' 即可同時打包出代碼產(chǎn)物 xxx.js 文件與同名 xxx.js.map 文件,Map 文件通常為 JSON 格式,內(nèi)容如:

  1.     "version": 3, 
  2.     "sources": [ 
  3.         "webpack:///./src/index.js" 
  4.     ], 
  5.     "names": ["name""console""log"], 
  6.     "mappings"";;;;;AAAA,IAAMA,IAAI,GAAG,QAAb;AAEAC,OAAO,CAACC,GAAR,CAAYF,IAAZ,E"
  7.     "file""main.js"
  8.     "sourcesContent": [ 
  9.         "const name = 'tecvan';\n\nconsole.log(name)" 
  10.     ], 
  11.     "sourceRoot""" 

各字段含義分別為:

  • version:指代 sourcemap 版本,目前最新版本為 3names:字符串?dāng)?shù)組,記錄原始代碼中出現(xiàn)的變量名
  • file:字符串,該 Sourcemap 文件對應(yīng)的編譯產(chǎn)物文件名
  • sourcesContent:字符串?dāng)?shù)組,原始代碼的內(nèi)容
  • sourceRoot:字符串,源文件根目錄
  • sources:字符串?dāng)?shù)組,原始文件路徑名,與 sourcesContent 內(nèi)容一一對應(yīng)
  • mappings:字符串?dāng)?shù)組,記錄打包產(chǎn)物與原始代碼的位置映射關(guān)系

使用時,瀏覽器會按照 mappings 記錄的數(shù)值關(guān)系,將產(chǎn)物代碼映射回 sourcesContent 數(shù)組所記錄的原始代碼文件、行、列位置,這里面最復(fù)雜難懂的點就在于 mappings 字段的規(guī)則。

1.2 源碼映射與 VLQ

Sourcemap 最初版本生成的 .map 文件非常大,體積大概為編譯產(chǎn)物的 10 倍;V2 引入 base64 編碼等算法將之減少 20% ~ 30%;而最新版本 V3 又在 V2 基礎(chǔ)上引入 VLQ 等算法,體積進(jìn)一步壓縮了 50%。這一系列進(jìn)化造就了一個效率極高的 Sourcemap 體系,但伴隨而來的則是較為復(fù)雜的 mappings 編碼規(guī)則。

1.2.1 mappings 編碼規(guī)則

舉個例子,對于下面的代碼:

當(dāng) devtool = 'source-map' 時,Webpack 生成的 mappings 字段為:

  1. ;;;;;AAAA,IAAMA,IAAI,GAAG,QAAb;AAEAC,OAAO,CAACC,GAAR,CAAYF,IAAZ,E 

字段內(nèi)容包含三層結(jié)構(gòu):

  • 以 ; 分割的「行映射」,每一個 ; 對應(yīng)編譯產(chǎn)物每一行到源碼的映射,上例經(jīng)過分割后:
  1.   // 產(chǎn)物第 1-5 行內(nèi)容為 Webpack 生成的 runtime,不需要記錄映射關(guān)系 
  2.   '''''''''',  
  3.   // 產(chǎn)物第 6 行的映射信息 
  4.   'AAAA,IAAMA,IAAI,GAAG,QAAb',  
  5.   // 產(chǎn)物第 7 行的映射信息 
  6.   'AAEAC,OAAO,CAACC,GAAR,CAAYF,IAAZ,E' 
  • 以 , 分割的「片段映射」,每一個 , 對應(yīng)該行中每一個代碼片段到源碼的映射,上例經(jīng)過分割后:
  1.   // 產(chǎn)物第 1-5 行內(nèi)容為 Webpack 生成的 runtime,不需要記錄映射關(guān)系 
  2.   '''''''''',  
  3.   // 產(chǎn)物第 6 行的映射信息 
  4.   [ 
  5.     // 片段 `var` 到 `const` 的映射 
  6.     'AAAA',  
  7.     // 片段 `name` 到 `name` 的映射 
  8.     'IAAMA',  
  9.     // 等等 
  10.     'IAAI''GAAG''QAAb'],  
  11.   // 產(chǎn)物第 7 行的映射信息 
  12.   ['AAEAC''OAAO''CAACC''GAAR''CAAYF''IAAZ''E'

第三層邏輯為片段映射到源碼的具體位置,以上例 IAAMA 為例:

  • 第一位 I 該代碼片段在產(chǎn)物中列數(shù)
  • 第二位 A 代表源碼文件的索引,即該片段對標(biāo)到 sources 數(shù)組的元素下標(biāo)
  • 第三位 A 代表片段在源碼文件的行數(shù)
  • 第四位 M 代表片段在源碼文件的列數(shù)
  • 第五位 A 代表該片段對應(yīng)的名稱索引,即該片段對標(biāo)到 names 數(shù)組的元素下標(biāo)

上述第1、2層邏輯比較簡單,唯一需要注意的是片段之間是一種相對偏移關(guān)系,例如對于上例第六行映射值:AAAA,IAAMA,IAAI,GAAG,QAAb,每一個片段的第一位 —— 即片段列數(shù)為 A,I,I,G,Q,分別代表:

  • A :第 A 列
  • I :第 A + I 列
  • I :第 A + I + I 列
  • G :第 A + I + I + G 列
  • Q :第 A + I + I + G + Q 列

這種相對偏移能減少 Sourcemap 產(chǎn)物的體積,提升整體性能。

而第三層的片段位置映射則用到了一種比較高效數(shù)值編碼算法 —— VLQ(Variable-length Quantity)。

1.2.2 VLQ編碼

參考:https://en.wikipedia.org/wiki/Variable-lengsth_quantity

VLQ 本質(zhì)上是一種將整數(shù)數(shù)值轉(zhuǎn)換為 Base64 的編碼算法,它先將任意大的整數(shù)轉(zhuǎn)換為一系列六位字節(jié)碼,再按 Base64 規(guī)則轉(zhuǎn)換為一串可見字符。VLQ 使用六位比特存儲一個編碼分組,例如:

數(shù)字 7 經(jīng)過 VLQ 編碼后,結(jié)果為 001110,其中:

  • 第一位為連續(xù)標(biāo)志位,標(biāo)識后續(xù)分組是否為同一數(shù)字;
  • 第六位表示該數(shù)字的正負(fù)符號,0為正整數(shù),1為負(fù)整數(shù);
  • 中間第 2-5 為實際數(shù)值。

這樣一個六位編碼分組,就可以按照 Base64 的映射規(guī)則轉(zhuǎn)換為 ABC 等可見字符,例如上述數(shù)字 7 編碼結(jié)果 001110,等于十進(jìn)制的 14,按 Base64 字碼表可映射為字母 O。

但是,分組中只有中間的 4 個字節(jié)用于表示數(shù)值,因此單個分組只能表達(dá) 「-15 ~ 15」 之間的數(shù)值范圍,對于超過這個范圍的整數(shù)需要組合多個分組共同表達(dá)同一數(shù)字,組合規(guī)則:

  • 第一個分組的最后一位為符號位,其它分組從 2-6 均為數(shù)值位
  • 取二進(jìn)制值最后四位為第一個分組值,之后從后到前,每 5 位為一個劃分為一個分組
  • 除最后一個分組外,其余分組的連續(xù)標(biāo)志位都設(shè)置為 1

例如對于十進(jìn)制 -17,其二進(jìn)制為 10001 (取 17 的二進(jìn)制) 共5位,首先從后到前拆分為兩組,后四位 0001 為第一組,連續(xù)標(biāo)志位為 1,符號位為 1,結(jié)果為 1,0001,1;剩下的 1 分配到第二個 —— 也是最后一個分組,連續(xù)標(biāo)志位為 0,結(jié)果為 0,00001。按 Base64 規(guī)則 [100011, 000001] 最終映射為 jA。

  1. 十進(jìn)制     二進(jìn)制               VLQ    Base64 
  2.   -17 => 1,0001 => 100011, 000001 =>     jA 

同樣的,對于更大的數(shù)字,例如 1200,其二進(jìn)制為 10010110000,分組為 [10, 01011, 0000],從后到前編碼,第一個分組為 1,0000,0;第二個分組為 1,01011;最后一個分組為 0,00010。按 Base64 映射為 grC。

  1. 十進(jìn)制            二進(jìn)制                     VLQ    Base64 
  2.  1200 => 10;01011;0000 => 100000,101011,000010 =>    grC 

1.2.3 解碼 mappings

結(jié)合 VLQ 編碼知識,我們再回過來頭來解讀本章開頭的例子,對于代碼:

編譯生成 mappings:

  1. ;;;;;AAAA,IAAMA,IAAI,GAAG,QAAb;AAEAC,OAAO,CAACC,GAAR,CAAYF,IAAZ,E 

按行、片段規(guī)則分割后,得出如下片段:

  1.   // 產(chǎn)物第 1-5 行內(nèi)容為 Webpack 生成的 runtime,不需要記錄映射關(guān)系 
  2.   '''''''''',  
  3.   // 產(chǎn)物第 6 行的映射信息 
  4.   ['AAAA''IAAMA''IAAI''GAAG''QAAb'],  
  5.   // 產(chǎn)物第 7 行的映射信息 
  6.   ['AAEAC''OAAO''CAACC''GAAR''CAAYF''IAAZ''E'

以第 6 行 ['AAAA', 'IAAMA', 'IAAI', 'GAAG', 'QAAb'] 為例:

  • AAAA 解碼結(jié)果為 [000000, 000000, 000000, 000000],即產(chǎn)物第 6 行「第0列」映射到 sources[0] 文件的「第0行」,「第0列」,實際對應(yīng) var 到 const 的位置映射
  • IAAMA 解碼結(jié)果為 [001000, 000000, 000000, 001100, 000000],即產(chǎn)物第 6 行第4列映射到 sources[0] 文件的「第0行」,「第6列」,實際對應(yīng)產(chǎn)物 name 到源碼 name 的位置映射

其它片段以此類推。

二、使用 Sourcemap

Webpack 提供了兩種設(shè)置 Sourcemap 的方式,一是通過 devtool 配置項設(shè)置 Sourcemap 規(guī)則短語;二是直接使用 SourceMapDevToolPlugin 或 EvalSourceMapDevToolPlugin 插件深度定制 Sourcemap 的生成邏輯。

下面我們先展開介紹比較晦澀的 devtool 配置項,理解 Webpack 所提供的各種 Sourcemap 功能規(guī)則。

2.1 使用devtooldevtool

支持 25 種字符串枚舉值,包括 eval、source-map、eval-source-map 等,分開來看都特別晦澀,但仔細(xì)觀察可發(fā)現(xiàn)這些值都是由 inline、eval、source-map、nosources、hidden、cheap、module 七種關(guān)鍵詞組合而成,這些關(guān)鍵詞各自代表一項 Sourcemap 規(guī)則。

2.1.1 eval

當(dāng) devtool 值包含 eval 時,生成的模塊代碼會被包裹進(jìn)一段 eval 函數(shù)中,且模塊的 Sourcemap 信息通過 //# sourceURL 直接掛載在模塊代碼內(nèi)。例如:

  1. eval("var foo = 'bar'\n\n\n//# sourceURL=webpack:///./src/index.ts?"

eval 模式編譯速度通常比較快,但產(chǎn)物中直接包含了 Sourcemap 信息,因此只推薦在開發(fā)環(huán)境中使用。

2.1.2 source-map

當(dāng) devtool 包含 source-map 時,Webpack 才會生成 Sourcemap 內(nèi)容。例如,對于 devtool = 'source-map',產(chǎn)物會額外生成 .map 文件,形如:

  1.     "version": 3, 
  2.     "sources": [ 
  3.         "webpack:///./src/index.ts" 
  4.     ], 
  5.     "names": [ 
  6.         "console"
  7.         "log" 
  8.     ], 
  9.     "mappings""AACAA,QAAQC,IADI"
  10.     "file""bundle.js"
  11.     "sourcesContent": [ 
  12.         "const foo = 'bar';\nconsole.log(foo);" 
  13.     ], 
  14.     "sourceRoot""" 

實際上,除 eval 之外的其它枚舉值都包含該字段。

2.1.3 cheap

當(dāng) devtool 包含 cheap 時,生成的 Sourcemap 內(nèi)容會拋棄「列」維度的信息,這就意味著瀏覽器只能映射到代碼行維度。例如 devtool = 'cheap-source-map' 時,產(chǎn)物:

  1.     "version": 3, 
  2.     "file""bundle.js"
  3.     "sources": [ 
  4.         "webpack:///bundle.js" 
  5.     ], 
  6.     "sourcesContent": [ 
  7.         "console.log(\"bar\");" 
  8.     ], 
  9.     // 帶 cheap 效果: 
  10.     "mappings""AAAA"
  11.     // 不帶 cheap 效果: 
  12.     // "mappings""AACAA,QAAQC,IADI"
  13.     "sourceRoot""" 

瀏覽器映射效果:

雖然 Sourcemap 提供的映射功能可精確定位到文件、行、列粒度,但有時在「行」級別已經(jīng)足夠幫助我們達(dá)到調(diào)試定位的目的,此時可選擇使用 cheap 關(guān)鍵字,簡化 Sourcemap 內(nèi)容,減少 Sourcemap 文件體積。

2.1.4 modulemodule

關(guān)鍵字只在 cheap 場景下生效,例如 cheap-module-source-map、eval-cheap-module-source-map。當(dāng) devtool 包含 cheap 時,Webpack 根據(jù) module 關(guān)鍵字判斷按 loader 聯(lián)調(diào)處理結(jié)果作為 source,還是按處理之前的代碼作為 source。例如:

注意觀察上例 sourcesContent 字段,左邊 devtool 帶 module 關(guān)鍵字,因此此處映射的是包含 class Person 的最原始代碼;而右邊生成的 sourcesContent 則是經(jīng)過 babel-loader 編譯處理的內(nèi)容。

2.1.5 nosources

當(dāng) devtool 包含 nosources 時,生成的 Sourcemap 內(nèi)容中不包含源碼內(nèi)容 —— 即 sourcesContent 字段。例如 devtool = 'nosources-source-map' 時,產(chǎn)物:

  1.     "version": 3, 
  2.     "sources": [ 
  3.         "webpack:///./src/index.ts" 
  4.     ], 
  5.     "names": [ 
  6.         "console"
  7.         "log" 
  8.     ], 
  9.     "mappings""AACAA,QAAQC,IADI"
  10.     "file""bundle.js"
  11.     "sourceRoot""" 

雖然沒有帶上源碼,但 .map 產(chǎn)物中還帶有文件名、 mappings 字段、變量名等信息,依然能夠幫助開發(fā)者定位到代碼對應(yīng)的原始位置,配合 sentry 等工具提供的源碼映射功能,可在異地還原諸如錯誤堆棧之類的信息。

2.1.6 inline

當(dāng) devtool 包含 inline 時,Webpack 會將 Sourcemap 內(nèi)容編碼為 Base64 DataURL,直接追加到產(chǎn)物文件中。例如對于 devtool = 'inline-source-map',產(chǎn)物:

  1. console.log("bar"); 
  2. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOlsiY29uc29sZSIsImxvZyJdLCJtYXBwaW5ncyI6IkFBQ0FBLFFBQVFDLElBREkiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZm9vID0gJ2Jhcic7XG5jb25zb2xlLmxvZyhmb28pOyJdLCJzb3VyY2VSb290IjoiIn0= 

inline 模式編譯速度較慢,且產(chǎn)物體積非常大,只適合開發(fā)環(huán)境使用。

2.1.7 hidden

通常情況下,產(chǎn)物中必須攜帶 //# sourceMappingURL= 指令,瀏覽器才能正確找到 Sourcemap 文件,

當(dāng) devtool 包含 hidden 時,編譯產(chǎn)物中不包含 //# sourceMappingURL= 指令。例如:

兩者區(qū)別僅在于編譯產(chǎn)物最后一行的 //# sourceMappingURL= 指令,當(dāng)你需要 Sourcemap 功能,又不希望瀏覽器 Devtool 工具自動加載時,可使用此選項。你也可以通過以下操作手動打開 Sourcemap:

2.1.8 小結(jié)

總結(jié)一下,Webpack 的 devtool 值都是由以上七種關(guān)鍵字的一個或多個組成,雖然提供了 27 種候選項,但邏輯上都是由上述規(guī)則疊加而成,例如:

  • cheap-source-map:代表 「不帶列映射」 的 Sourcemap
  • eval-nosources-cheap-source-map:代表 「以」 **eval** 「包裹模塊代碼」 ,且 **.map** 「映射文件中不帶源碼」 ,且 「不帶列映射」 的 Sourcemap

其它選項以此類推。最后再總結(jié)一下:

對于開發(fā)環(huán)境,適合使用:

  • eval:速度極快,但只能看到原始文件結(jié)構(gòu),看不到打包前的代碼內(nèi)容
  • cheap-eval-source-map:速度比較快,可以看到打包前的代碼內(nèi)容,但看不到 loader 處理之前的源碼
  • cheap-module-eval-source-map:速度比較快,可以看到 loader 處理之前的源碼,不過定位不到列級別
  • eval-source-map:初次編譯較慢,但定位精度最高

對于生產(chǎn)環(huán)境,則適合使用:

  • source-map:信息最完整,但安全性最低,外部用戶可輕易獲取到壓縮、混淆之前的源碼,慎重使用
  • hidden-source-map:信息較完整,安全性較低,外部用戶獲取到 .map 文件地址時依然可以拿到源碼
  • nosources-source-map:源碼信息確實,但安全性較高,需要配合 Sentry 等工具實現(xiàn)完整的 Sourcemap 映射

2.2 使用插件

上面介紹的 devtool 配置項本質(zhì)上只是一種方便記憶、使用的規(guī)則縮寫短語,Sourcemap 的底層處理邏輯實際由 SourceMapDevToolPlugin 與 EvalSourceMapDevToolPlugin 插件實現(xiàn)。

參考:https://webpack.js.org/plugins/source-map-dev-tool-plugin/

在 devtool 基礎(chǔ)上,插件還提供了更多更細(xì)粒度的配置項,用于滿足更復(fù)雜的需求場景,包括:

  • 使用 test、include、exclude 配置項設(shè)定對那些 bundle 生成 Sourcemap
  • 使用 append、filename、moduleFilenameTemplate、publicPath 配置項設(shè)定 Sourcemap 文件的文件名、URL

使用方法與其它插件無異,如:

  1. const webpack = require('webpack'); 
  2. module.exports = { 
  3.   // ... 
  4.   devtool: false
  5.   plugins: [new webpack.SourceMapDevToolPlugin({ 
  6.       exclude: ['vendor.js'
  7.   })], 
  8. }; 

插件配置規(guī)則較簡單,此處不贅述。

三、總結(jié)

至此,有關(guān) Sourcemap 的大部分內(nèi)容就講解完畢了,讀者們需要了解 Sourcemap 是一種高效位置映射算法,它將產(chǎn)物到源碼之間的位置關(guān)系表達(dá)為 mappings 分層設(shè)計與 VLQ 編碼規(guī)則,再通過 Chrome、Safari、VS Code、Sentry 等工具異地還原為接近開發(fā)狀態(tài)的源碼形式。

在 Webpack 場景下,通常只需要選擇適當(dāng)?shù)?devtool 短語即可滿足大多數(shù)場景需求,特殊情況下也可以直接使用 SourceMapDevToolPlugin 做更深度的定制化。

 

責(zé)任編輯:姜華 來源: Tecvan
相關(guān)推薦

2022-08-26 13:24:03

version源碼sources

2021-11-15 09:44:49

Webpack 前端 Scope Hois

2019-03-05 10:20:49

WebWebpack分離數(shù)據(jù)

2023-05-31 08:19:23

Webpack4Webpack 5

2023-03-27 10:46:53

SourceMap字符串代碼

2021-05-31 05:36:43

WebpackJavaScript 前端

2021-11-09 09:57:46

Webpack 前端分包優(yōu)化

2021-10-25 10:23:49

Webpack 前端Tree shakin

2021-03-16 14:45:39

Zabbix 5.2Grafana監(jiān)控

2021-12-21 14:00:25

WebpackDevServer的開發(fā)

2021-06-28 05:59:17

Webpack 前端打包與工程化

2021-09-13 09:40:35

Webpack 前端HMR 原理

2021-08-26 10:30:29

WebpackTree-Shakin前端

2025-07-30 00:00:00

2017-05-26 11:00:38

Python算法

2011-09-07 09:21:04

2021-12-16 22:02:28

webpack原理模塊化

2011-08-19 10:17:53

2020-08-31 06:54:37

注解脫敏ELK

2021-07-12 11:35:13

Go協(xié)程Goroutine
點贊
收藏

51CTO技術(shù)棧公眾號

国产性生活毛片| 久久综合给合久久狠狠色| 久久久久久久久久97| 亚洲日本一区二区三区在线| 黄色一区二区三区| 亚洲最大色综合成人av| 老牛影视av牛牛影视av| 免费观看成人av| 欧美黑人性生活视频| 白丝女仆被免费网站| 91麻豆精品| 欧美日韩综合视频| 免费观看国产视频在线| 男女av在线| 国产aⅴ综合色| 国产精品成人在线| 久久精品人妻一区二区三区| 日韩一区二区在线| 亚洲精品中文字幕av| 亚洲男人天堂2021| 成人日韩在线观看| 五月天欧美精品| 国产盗摄视频在线观看| 最近高清中文在线字幕在线观看| 不卡影院免费观看| 亚洲一区二区三区sesese| 在线免费黄色av| 亚洲一级影院| 欧美成人免费网| 九九热久久免费视频| 国产91久久精品一区二区| 精品国产乱码久久久久久久| 午夜国产福利在线观看| 日韩高清中文字幕一区二区| 午夜久久久久久久久久一区二区| 黄色录像特级片| 在线观看h片| 国产日韩欧美精品一区| 免费亚洲一区二区| 高清一区二区三区四区| 国产麻豆精品一区二区| 91精品视频免费看| 亚洲视频久久久| 日韩二区三区四区| 国产精品7m视频| 区一区二在线观看| 国产婷婷精品| 日本久久久久久久久久久| av黄色在线播放| 国产亚洲毛片| 欧美最猛性xxxx| 精品人妻一区二区色欲产成人| 国产欧美日韩一区二区三区在线| 亚州成人av在线| 日本系列第一页| 一级成人国产| 欧洲一区二区视频| 色老头一区二区| 日韩av中文字幕一区二区三区| 国产精品av网站| 青娱乐在线免费视频| 蜜桃在线一区二区三区| 国产在线一区二区三区| 国产绳艺sm调教室论坛| 国产精品一区免费在线观看| 国产中文字幕91| www.热久久| 成人黄色小视频在线观看| 国严精品久久久久久亚洲影视| 天天干视频在线| 久久精品视频在线看| 亚洲精品不卡| 直接在线观看的三级网址| 亚洲图片自拍偷拍| 爱福利视频一区二区| 成人h在线观看| 91精品国产乱| 精品国产人妻一区二区三区| 国产精品一区2区3区| 色七七影院综合| 青青草免费av| 蜜桃久久av| 91久久在线观看| 天堂av一区二区三区| 国产区在线观看成人精品| 欧美 另类 交| 国产乱码午夜在线视频| 欧美亚洲免费在线一区| 亚洲美女精品视频| 国产在线观看91一区二区三区| 久久国内精品一国内精品| 国产一级淫片免费| 日日夜夜免费精品视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 婷婷在线免费观看| 国产精品久久久久久久久久免费看| 欧美人与动牲交xxxxbbbb| 亚洲伊人av| 日韩欧美成人激情| 国产1区2区在线观看| 亚洲高清成人| 91精品久久久久久久久久| 日韩在线观看视频一区二区三区 | 国产精品扒开腿做| 精品国产免费无码久久久| 久久久久久免费网| 国产 欧美 日韩 一区| 电影亚洲一区| 日韩成人中文字幕在线观看| 国语对白在线播放| 免费av网站大全久久| 韩国一区二区三区美女美女秀| 黄色av免费在线| 在线欧美一区二区| 国产精品无码一区二区三| 欧美久久视频| 国产欧洲精品视频| 成年人在线观看| 精品久久久中文| 成人三级做爰av| 999国产精品视频| 欧美在线www| 少妇无码一区二区三区| 亚洲自拍偷拍av| 国产永久免费网站| 欧美久久精品一级c片| 91大神在线播放精品| 成人av手机在线| 亚洲人成亚洲人成在线观看图片 | 伦av综合一区| 91在线视频免费观看| 女人被男人躁得好爽免费视频| 涩涩涩久久久成人精品| 一区二区三区精品99久久| 久久精品一二区| 99精品视频中文字幕| 欧洲精品一区二区三区久久| 激情五月综合婷婷| 久久精品99无色码中文字幕| 亚洲综合五月天婷婷丁香| 国产欧美一区二区精品久导航 | 精品亚洲国产成人av制服丝袜| 少妇精品久久久久久久久久| 精品国产第一福利网站| 国产视频久久久久久久| 三级网站在线播放| 国产午夜精品一区二区三区嫩草 | 中文字幕av一区二区| 国产美女www| 欧美激情在线一区二区| 日本xxxx黄色| 99久久久久国产精品| 91精品综合久久久久久五月天| 欧美性天天影视| 日韩一区和二区| 欧美日韩三级在线观看| 国产1区2区3区精品美女| 欧洲精品在线播放| 老汉色老汉首页av亚洲| 欧洲成人免费aa| 国产youjizz在线| 在线播放/欧美激情| 日本aⅴ在线观看| 成人一区二区三区中文字幕| 黄页免费在线观看视频| 综合色就爱涩涩涩综合婷婷| 国产极品精品在线观看| 免费观看在线午夜影视| 日韩欧美www| 欧美黑人一区二区| 国产精品高潮久久久久无| 久久久久亚洲av无码网站| 国产欧美另类| 亚洲欧美丝袜| 一区二区亚洲视频| 97成人在线视频| av男人的天堂在线| 日韩欧美一区二区视频| 久久久久久久黄色片| 欧美国产成人在线| 国产chinesehd精品露脸| 亚洲女同在线| 中文字幕一区二区中文字幕| 国产suv精品一区| 国产精品99蜜臀久久不卡二区| 国产盗摄在线观看| 日韩精品在线视频美女| 一区二区三区黄| 精品国产鲁一鲁一区二区张丽| 亚洲毛片亚洲毛片亚洲毛片| 丰满放荡岳乱妇91ww| 日韩免费高清在线| 国产一区久久| 亚洲国产精品视频一区| 国产精品任我爽爆在线播放| 国产精品视频精品| 操人在线观看| 久久视频免费在线播放| 毛片在线播放网址| 欧美成人三级在线| 久久精品国产亚洲av麻豆蜜芽| 亚洲主播在线播放| 刘亦菲国产毛片bd| 99re在线视频这里只有精品| 99精品999| 奇米色一区二区三区四区| 给我免费播放片在线观看| 四虎成人精品永久免费av九九| 精品欧美一区二区三区久久久 | 免费不卡亚洲欧美| 国产午夜久久av| 国产精品扒开腿做爽爽爽男男 | 偷窥国产亚洲免费视频| 老湿机69福利| 国产精品美日韩| 久久久精品人妻无码专区| 国产成+人+日韩+欧美+亚洲| 日日干夜夜操s8| 久久九九精品| 北条麻妃在线视频观看| 红桃视频国产一区| 精品日韩在线播放| 久久网站免费观看| 日韩久久不卡| 激情五月综合| 免费一区二区三区| 亚洲精品无吗| 精品九九九九| 欧美黄色影院| 精品婷婷色一区二区三区蜜桃| 亚洲精品一区国产| 亚洲一区二区三| 秋霞一区二区三区| 成人欧美在线观看| 亚洲成a人片777777久久| 国产精品成人一区二区| av在线一区不卡| 国产精品麻豆va在线播放| 美女写真久久影院| 国产成人精品网站| 午夜欧美巨大性欧美巨大 | 久久欧美中文字幕| 国产熟女高潮一区二区三区| 成人综合婷婷国产精品久久蜜臀| 少妇极品熟妇人妻无码| 国产91精品精华液一区二区三区 | 先锋资源在线视频| 国产一区二区三区免费观看| 亚洲第一色av| 福利91精品一区二区三区| 日本少妇xxxx| 91网站在线播放| 日本成人免费视频| 中文字幕一区二区5566日韩| 国产一二三四区| 一区二区在线免费观看| 精品久久免费视频| 欧美丝袜第一区| 国产免费a视频| 欧美日韩亚洲高清一区二区| 国产美女明星三级做爰| 日韩精品在线一区二区三区| 欧美日本一区二区| 国产福利小视频| 欧美精选在线播放| 日本三级黄色网址| 极品美女销魂一区二区三区| 久久久久久久久久一区| 国产精品中文字幕日韩精品| xxxxwww一片| 99精品视频在线播放观看| 亚洲最大成人网站| 国产精品视频yy9299一区| 欧美成人777| 午夜精品影院在线观看| 精品国产乱子伦| 欧美精品在线视频| 亚洲精品国产精品乱码不卡| 精品在线小视频| 黄色视屏免费在线观看| 国产69精品99久久久久久宅男| 芒果视频成人app| 国产综合在线观看视频| 都市激情亚洲| 亚洲精品tv久久久久久久久| 黄色成人av网站| 五月婷婷狠狠操| 成人区精品一区二区| 一区二区三区高清在线观看| 精品无码久久久久久久动漫| 日韩电影二区| 91九色02白丝porn| 国产精品久久久久久免费播放| 欧美岛国在线观看| 成人在线观看黄色| 久久久久久国产免费| 最新日韩一区| 国产一区二区三区四区hd| 国产精品99视频| 国产在线观看福利| 国产乱码精品一区二区三区五月婷| 3d动漫精品啪啪一区二区下载| 亚洲欧美激情在线| 99久久久无码国产精品免费蜜柚 | 99精品久久久久久中文字幕| 精品视频在线导航| 色在线视频网| 国产日韩av在线播放| 要久久爱电视剧全集完整观看| 男人天堂新网址| 久久激情综合网| 国产男男chinese网站| 亚洲国产wwwccc36天堂| 91亚洲国产成人久久精品麻豆| 亚洲欧美激情一区| 女人18毛片一区二区三区| 亚洲香肠在线观看| 中文永久免费观看| 日韩成人黄色av| 日韩电影免费观看| 国产日韩欧美在线观看| 国产aⅴ精品一区二区三区久久| 国产精品又粗又长| 国产精品一区二区x88av| а天堂中文在线资源| 色综合色狠狠天天综合色| 天天干天天爱天天操| 色综合久综合久久综合久鬼88 | 色八戒一区二区三区| 天堂成人在线观看| 亚洲国产日韩av| 亚洲欧美日韩不卡一区二区三区| 欧美天堂亚洲电影院在线观看| 精品亚洲视频在线| 国产精品久久一卡二卡| 中文字幕一区二区三区免费看| 亚洲欧美日韩一区二区在线| 三妻四妾完整版在线观看电视剧| 国产精品国产亚洲精品看不卡15| 午夜国产精品视频| 无码人妻少妇色欲av一区二区| 亚洲日本一区二区| 国产免费不卡视频| 久久人人爽人人爽爽久久| 精品国产美女a久久9999| 亚洲高清123| 蜜乳av一区二区三区| 人与动物性xxxx| 91精品国产色综合久久久蜜香臀| 国产精品va在线观看视色| 成人欧美一区二区三区在线湿哒哒| 国产精品久久久久久久免费观看| 亚洲免费999| 亚洲乱码日产精品bd| 午夜精品久久久久久久爽| 久久久在线免费观看| 婷婷成人影院| 精品久久久噜噜噜噜久久图片 | 日韩av一二三| 午夜欧美理论片| 少妇高清精品毛片在线视频| 99re在线视频这里只有精品| 国产免费av一区二区| 亚洲精品视频在线观看视频| 性欧美1819sex性高清| 亚洲成人在线视频网站| 极品少妇xxxx精品少妇偷拍| 久久久一二三区| 亚洲精品福利在线观看| 91亚洲精品| 91麻豆天美传媒在线| 岛国一区二区在线观看| 国产精品夜夜夜一区二区三区尤| 国产高清视频在线播放| 国产精品青草久久久久福利99| 88国产精品视频一区二区三区| 亚洲精品一二三四| 午夜影视日本亚洲欧洲精品| 精品成人一区二区三区免费视频| 成人福利在线视频| 国产一区日韩欧美| 熟女少妇内射日韩亚洲| 91麻豆精品国产91久久久久| 国产福利片在线观看| 天堂精品一区二区三区| 国产成人亚洲综合a∨婷婷图片| 一区二区三区视频免费看| 中文字幕一区电影| 国产精品videossex| 日本久久久久久久久久久久| 亚洲综合一区二区精品导航| 国产天堂在线| 肥熟一91porny丨九色丨| 首页综合国产亚洲丝袜| 国产大学生自拍| 中文字幕成人精品久久不卡| 免费看成人人体视频| 亚洲日本黄色片| 欧美三级xxx| 污网站在线免费看|