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

帶你了解前端模塊化的今生

開發(fā) 前端
眾所周知,早期 JavaScript 原生并不支持模塊化,直到 2015 年,TC39 發(fā)布 ES6,其中有一個(gè)規(guī)范就是 ES modules(為了方便表述,后面統(tǒng)一簡稱 ESM)。

背景

眾所周知,早期 JavaScript 原生并不支持模塊化,直到 2015 年,TC39 發(fā)布 ES6,其中有一個(gè)規(guī)范就是 ES modules(為了方便表述,后面統(tǒng)一簡稱 ESM)。但是在 ES6 規(guī)范提出前,就已經(jīng)存在了一些模塊化方案,比如 CommonJS(in Node.js)、AMD。ESM 與這些規(guī)范的共同點(diǎn)就是都支持導(dǎo)入(import)和導(dǎo)出(export)語法,只是其行為的關(guān)鍵詞也一些差異。

CommonJS 

  1. // add.js  
  2. const add = (a, b) => a + b  
  3. module.exports = add  
  4. // index.js  
  5. const add = require('./add')  
  6. add(1, 5) 

AMD 

  1. // add.js  
  2. define(function() {  
  3.   const add = (a, b) => a + b  
  4.   return add  
  5. })  
  6. // index.js  
  7. require(['./add'], function (add) {  
  8.   add(1, 5)  
  9. }) 

ESM 

  1. // add.js  
  2. const add = (a, b) => a + b  
  3. export default add  
  4. //index.js  
  5. import add from './add'  
  6. add(1, 5) 

關(guān)于 JavaScript 模塊化出現(xiàn)的背景在上一章(《前端模塊化的前世》))已經(jīng)有所介紹,這里不再贅述。但是 ESM 的出現(xiàn)不同于其他的規(guī)范,因?yàn)檫@是 JavaScript 官方推出的模塊化方案,相比于 CommonJS 和 AMD 方案,ESM采用了完全靜態(tài)化的方式進(jìn)行模塊的加載。

ESM規(guī)范

模塊導(dǎo)出

模塊導(dǎo)出只有一個(gè)關(guān)鍵詞:export,最簡單的方法就是在聲明的變量前面直接加上 export 關(guān)鍵詞。 

  1. export const name = 'Shenfq' 

可以在 const、let、var 前直接加上 export,也可以在 function 或者 class 前面直接加上 export。 

  1. export function getName() {  
  2.   return name  
  3.  
  4. export class Logger {  
  5.     log(...args) {  
  6.     console.log(...args)  
  7.   }  

上面的導(dǎo)出方法也可以使用大括號的方式進(jìn)行簡寫。 

  1. const name = 'Shenfq'  
  2. function getName() {  
  3.   return name  
  4.  
  5. class Logger {  
  6.     log(...args) {  
  7.     console.log(...args)  
  8.   }  
  9.  
  10. export { name, getName, Logger } 

最后一種語法,也是我們經(jīng)常使用的,導(dǎo)出默認(rèn)模塊。 

  1. const name = 'Shenfq'  
  2. export default name 

模塊導(dǎo)入

模塊的導(dǎo)入使用import,并配合 from 關(guān)鍵詞。 

  1. // main.js  
  2. import name from './module.js'  
  3. // module.js  
  4. const name = 'Shenfq'  
  5. export default name 

這樣直接導(dǎo)入的方式,module.js 中必須使用 export default,也就是說 import 語法,默認(rèn)導(dǎo)入的是default模塊。如果想要導(dǎo)入其他模塊,就必須使用對象展開的語法。 

  1. // main.js  
  2. import { name, getName } from './module.js'  
  3. // module.js  
  4. export const name = 'Shenfq'  
  5. export const getName = () => name 

如果模塊文件同時(shí)導(dǎo)出了默認(rèn)模塊,和其他模塊,在導(dǎo)入時(shí),也可以同時(shí)將兩者導(dǎo)入。 

  1. // main.js  
  2. import name, { getName } from './module.js'  
  3. //module.js  
  4. const name = 'Shenfq'  
  5. export const getName = () => name  
  6. export default name 

當(dāng)然,ESM 也提供了重命名的語法,將導(dǎo)入的模塊進(jìn)行重新命名。 

  1. // main.js  
  2. import * as mod from './module.js'  
  3. let name = ''  
  4. name = mod.name  
  5. name = mod.getName()  
  6. // module.js  
  7. export const name = 'Shenfq'  
  8. export const getName = () => name 

上述寫法就相當(dāng)于于將模塊導(dǎo)出的對象進(jìn)行重新賦值: 

  1. // main.js  
  2. import { name, getName } from './module.js'  
  3. const mod = { name, getName } 

同時(shí)也可以對單獨(dú)的變量進(jìn)行重命名: 

  1. // main.js  
  2. import { name, getName as getModName } 

導(dǎo)入同時(shí)進(jìn)行導(dǎo)出

如果有兩個(gè)模塊 a 和 b ,同時(shí)引入了模塊 c,但是這兩個(gè)模塊還需要導(dǎo)入模塊 d,如果模塊 a、b 在導(dǎo)入 c 之后,再導(dǎo)入 d 也是可以的,但是有些繁瑣,我們可以直接在模塊 c 里面導(dǎo)入模塊 d,再把模塊 d 暴露出去。

 

  1. // module_c.js  
  2. import { name, getName } from './module_d.js'  
  3. export { name, getName } 

這么寫看起來還是有些麻煩,這里 ESM 提供了一種將 import 和 export 進(jìn)行結(jié)合的語法。 

  1. export { name, getName } from './module_d.js' 

上面是 ESM 規(guī)范的一些基本語法,如果想了解更多,可以翻閱阮老師的 《ES6 入門》。

ESM 與 CommonJS 的差異

首先肯定是語法上的差異,前面也已經(jīng)簡單介紹過了,一個(gè)使用 import/export 語法,一個(gè)使用 require/module 語法。

另一個(gè) ESM 與 CommonJS 顯著的差異在于,ESM 導(dǎo)入模塊的變量都是強(qiáng)綁定,導(dǎo)出模塊的變量一旦發(fā)生變化,對應(yīng)導(dǎo)入模塊的變量也會跟隨變化,而 CommonJS 中導(dǎo)入的模塊都是值傳遞與引用傳遞,類似于函數(shù)傳參(基本類型進(jìn)行值傳遞,相當(dāng)于拷貝變量,非基礎(chǔ)類型【對象、數(shù)組】,進(jìn)行引用傳遞)。

下面我們看下詳細(xì)的案例:

CommonJS 

  1. // a.js  
  2. const mod = require('./b')  
  3. setTimeout(() => {  
  4.   console.log(mod)  
  5. }, 1000)  
  6. // b.js  
  7. let mod = 'first value'  
  8. setTimeout(() => {  
  9.   mod = 'second value'  
  10. }, 500)  
  11. modmodule.exports = mod  
  1. $ node a.js  
  2. first value 

ESM 

  1. // a.mjs  
  2. import { mod } from './b.mjs'  
  3. setTimeout(() => {  
  4.   console.log(mod)  
  5. }, 1000)  
  6. // b.mjs  
  7. export let mod = 'first value'  
  8. setTimeout(() => {  
  9.   mod = 'second value'  
  10. }, 500)  
  1. $ node --experimental-modules a.mjs  
  2. # (node:99615) ExperimentalWarning: The ESM module loader is experimental.  
  3. second value 

另外,CommonJS 的模塊實(shí)現(xiàn),實(shí)際是給每個(gè)模塊文件做了一層函數(shù)包裹,從而使得每個(gè)模塊獲取 require/module、__filename/__dirname 變量。那上面的 a.js 來舉例,實(shí)際執(zhí)行過程中 a.js 運(yùn)行代碼如下: 

  1. // a.js  
  2. (function(exports, require, module, __filename, __dirname) {  
  3.     const mod = require('./b')  
  4.   setTimeout(() => {  
  5.     console.log(mod)  
  6.   }, 1000)  
  7. }); 

而 ESM 的模塊是通過 import/export 關(guān)鍵詞來實(shí)現(xiàn),沒有對應(yīng)的函數(shù)包裹,所以在 ESM 模塊中,需要使用 import.meta 變量來獲取 __filename/__dirname。import.meta 是 ECMAScript 實(shí)現(xiàn)的一個(gè)包含模塊元數(shù)據(jù)的特定對象,主要用于存放模塊的 url,而 node 中只支持加載本地模塊,所以 url 都是使用 file: 協(xié)議。 

  1. import url from 'url'  
  2. import path from 'path'  
  3. // import.meta: { url: file:///Users/dev/mjs/a.mjs }  
  4. const __filename = url.fileURLToPath(import.meta.url)  
  5. const __dirname = path.dirname(__filename) 

加載的原理 

步驟:

  1.  Construction(構(gòu)造):下載所有的文件并且解析為module records。
  2.  Instantiation(實(shí)例):把所有導(dǎo)出的變量入內(nèi)存指定位置(但是暫時(shí)還不求值)。然后,讓導(dǎo)出和導(dǎo)入都指向內(nèi)存指定位置。這叫做『linking(鏈接)』。
  3.  Evaluation(求值):執(zhí)行代碼,得到變量的值然后放到內(nèi)存對應(yīng)位置。

模塊記錄

所有的模塊化開發(fā),都是從一個(gè)入口文件開始,無論是 Node.js 還是瀏覽器,都會根據(jù)這個(gè)入口文件進(jìn)行檢索,一步一步找到其他所有的依賴文件。 

  1. // Node.js: main.mjs  
  2. import Log from './log.mjs'  
  1. <!-- chrome、firefox --> 
  2. <script type="module" src="./log.js"></script> 

值得注意的是,剛開始拿到入口文件,我們并不知道它依賴了哪些模塊,所以必須先通過 js 引擎靜態(tài)分析,得到一個(gè)模塊記錄,該記錄包含了該文件的依賴項(xiàng)。所以,一開始拿到的 js 文件并不會執(zhí)行,只是會將文件轉(zhuǎn)換得到一個(gè)模塊記錄(module records)。所有的 import 模塊都在模塊記錄的 importEntries 字段中記錄,更多模塊記錄相關(guān)的字段可以查閱tc39.es。

模塊構(gòu)造

得到模塊記錄后,會下載所有依賴,并再次將依賴文件轉(zhuǎn)換為模塊記錄,一直持續(xù)到?jīng)]有依賴文件為止,這個(gè)過程被稱為『構(gòu)造』(construction)。

模塊構(gòu)造包括如下三個(gè)步驟:

  1.  模塊識別(解析依賴模塊 url,找到真實(shí)的下載路徑);
  2.  文件下載(從指定的 url 進(jìn)行下載,或從文件系統(tǒng)進(jìn)行加載);
  3.  轉(zhuǎn)化為模塊記錄(module records)。

對于如何將模塊文件轉(zhuǎn)化為模塊記錄,ESM 規(guī)范有詳細(xì)的說明,但是在構(gòu)造這個(gè)步驟中,要怎么下載得到這些依賴的模塊文件,在 ESM 規(guī)范中并沒有對應(yīng)的說明。因?yàn)槿绾蜗螺d文件,在服務(wù)端和客戶端都有不同的實(shí)現(xiàn)規(guī)范。比如,在瀏覽器中,如何下載文件是屬于 HTML 規(guī)范(瀏覽器的模塊加載都是使用的 <script> 標(biāo)簽)。

雖然下載完全不屬于 ESM 的現(xiàn)有規(guī)范,但在 import 語句中還有一個(gè)引用模塊的 url 地址,關(guān)于這個(gè)地址需要如何轉(zhuǎn)化,在 Node 和瀏覽器之間有會出現(xiàn)一些差異。簡單來說,在 Node 中可以直接 import 在 node_modules 中的模塊,而在瀏覽器中并不能直接這么做,因?yàn)闉g覽器無法正確的找到服務(wù)器上的 node_modules 目錄在哪里。好在有一個(gè)叫做 import-maps 的提案,該提案主要就是用來解決瀏覽器無法直接導(dǎo)入模塊標(biāo)識符的問題。但是,在該提案未被完全實(shí)現(xiàn)之前,瀏覽器中依然只能使用 url 進(jìn)行模塊導(dǎo)入。 

  1. <script type="importmap">  
  2.  
  3.   "imports": {  
  4.       "jQuery": "/node_modules/jquery/dist/jquery.js"  
  5.   }  
  6.  
  7. </script>  
  8. <script type="module">  
  9.     import $ from 'jQuery'  
  10.   $(function () {  
  11.     $('#app').html('init')  
  12.   })  
  13. </script> 

下載好的模塊,都會被轉(zhuǎn)化為模塊記錄然后緩存到 module map 中,遇到不同文件獲取的相同依賴,都會直接在 module map 緩存中獲取。 

  1. // log.js  
  2. const log = console.log  
  3. export default log  
  4. // file.js  
  5. export {   
  6.   readFileSync as read,  
  7.   writeFileSync as write  
  8. } from 'fs' 

模塊實(shí)例

獲取到所有依賴文件并建立好 module map 后,就會找到所有模塊記錄,并取出其中的所有導(dǎo)出的變量,然后,將所有變量一一對應(yīng)到內(nèi)存中,將對應(yīng)關(guān)系存儲到『模塊環(huán)境記錄』(module environment record)中。當(dāng)然當(dāng)前內(nèi)存中的變量并沒有值,只是初始化了對應(yīng)關(guān)系。初始化導(dǎo)出變量和內(nèi)存的對應(yīng)關(guān)系后,緊接著會設(shè)置模塊導(dǎo)入和內(nèi)存的對應(yīng)關(guān)系,確保相同變量的導(dǎo)入和導(dǎo)出都指向了同一個(gè)內(nèi)存區(qū)域,并保證所有的導(dǎo)入都能找到對應(yīng)的導(dǎo)出。

模塊連接

由于導(dǎo)入和導(dǎo)出指向同一內(nèi)存區(qū)域,所以導(dǎo)出值一旦發(fā)生變化,導(dǎo)入值也會變化,不同于 CommonJS,CommonJS 的所有值都是基于拷貝的。連接到導(dǎo)入導(dǎo)出變量后,我們就需要將對應(yīng)的值放入到內(nèi)存中,下面就要進(jìn)入到求值的步驟了。

模塊求值

求值步驟相對簡單,只要運(yùn)行代碼把計(jì)算出來的值填入之前記錄的內(nèi)存地址就可以了。到這里就已經(jīng)能夠愉快的使用 ESM 模塊化了。

ESM的進(jìn)展

因?yàn)?ESM 出現(xiàn)較晚,服務(wù)端已有 CommonJS 方案,客戶端又有 webpack 打包工具,所以 ESM 的推廣不得不說還是十分艱難的。

客戶端

我們先看看客戶端的支持情況,這里推薦大家到 Can I Use 直接查看,下圖是 2019/11的截圖。

目前為止,主流瀏覽器都已經(jīng)支持 ESM 了,只需在 script 標(biāo)簽傳入指定的 type="module" 即可。 

  1. <script type="module" src="./main.js"></script> 

另外,我們知道在 Node.js 中,要使用 ESM 有時(shí)候需要用到 .mjs 后綴,但是瀏覽器并不關(guān)心文件后綴,只需要 http 響應(yīng)頭的MIME類型正確即可(Content-Type: text/javascript)。同時(shí),當(dāng) type="module" 時(shí),默認(rèn)啟用 defer 來加載腳本。這里補(bǔ)充一張 defer、async 差異圖。

我們知道瀏覽器不支持 script 的時(shí)候,提供了 noscript 標(biāo)簽用于降級處理,模塊化也提供了類似的標(biāo)簽。 

  1. <script type="module" src="./main.js"></script>  
  2. <script nomodule>  
  3.   alert('當(dāng)前瀏覽器不支持 ESM !!!')  
  4. </script> 

這樣我們就能針對支持 ESM 的瀏覽器直接使用模塊化方案加載文件,不支持的瀏覽器還是使用 webpack 打包的版本。 

  1. <script type="module" src="./src/main.js"></script>  
  2. <script nomodule src="./dist/app.[hash].js"></script> 

預(yù)加載

我們知道瀏覽器的 link 標(biāo)簽可以用作資源的預(yù)加載,比如我需要預(yù)先加載 main.js 文件: 

  1. <link rel="preload" href="./main.js"></link> 

如果這個(gè) main.js 文件是一個(gè)模塊化文件,瀏覽器僅僅預(yù)先加載單獨(dú)這一個(gè)文件是沒有意義的,前面我們也說過,一個(gè)模塊化文件下載后還需要轉(zhuǎn)化得到模塊記錄,進(jìn)行模塊實(shí)例、模塊求值這些操作,所以我們得想辦法告訴瀏覽器,這個(gè)文件是一個(gè)模塊化的文件,所以瀏覽器提供了一種新的 rel 類型,專門用于模塊化文件的預(yù)加載。 

  1. <link rel="modulepreload" href="./main.js"></link> 

現(xiàn)狀

雖然主流瀏覽器都已經(jīng)支持了 ESM,但是根據(jù) chrome 的統(tǒng)計(jì),有用到 <script type="module"> 的頁面只有 1%。截圖時(shí)間為 2019/11。

服務(wù)端

瀏覽器能夠通過 script 標(biāo)簽指定當(dāng)前腳本是否作為模塊處理,但是在 Node.js 中沒有很明確的方式來表示是否需要使用 ESM,而且 Node.js 中本身就已經(jīng)有了 CommonJS 的標(biāo)準(zhǔn)模塊化方案。就算開啟了 ESM,又通過何種方式來判斷當(dāng)前入口文件導(dǎo)入的模塊到底是使用的 ESM 還是 CommonJS 呢?為了解決上述問題,node 社區(qū)開始出現(xiàn)了 ESM 的相關(guān)草案,具體可以在 github 上查閱。

2017年發(fā)布的 Node.js 8.5.0 開啟了 ESM 的實(shí)驗(yàn)性支持,在啟動(dòng)程序時(shí),加上 --experimental-modules 來開啟對 ESM 的支持,并將 .mjs 后綴的文件當(dāng)做 ESM 來解析。早期的期望是在 Node.js 12 達(dá)到 LTS 狀態(tài)正式發(fā)布,然后期望并沒有實(shí)現(xiàn),直到最近的 13.2.0 版本才正式支持 ESM,也就是取消了 --experimental-modules 啟動(dòng)參數(shù)。具體細(xì)節(jié)可以查看 Node.js 13.2.0 的官方文檔。

關(guān)于 .mjs 后綴社區(qū)有兩種完全不同的態(tài)度。支持的一方認(rèn)為通過文件后綴區(qū)分類型是最簡單也是最明確的方式,且社區(qū)早已有類似案例,例如,.jsx 用于 React 組件、.ts 用于 ts 文件;而支持的一方認(rèn)為,.js 作為 js 后綴已經(jīng)存在這么多年,視覺上很難接受一個(gè) .mjs 也是 js 文件,而且現(xiàn)有的很多工具都是以 .js 后綴來識別 js 文件,如果引入了 .mjs 方案,就有大批量的工具需要修改來有效的適配 ESM。

所以除了 .mjs 后綴指定 ESM 外,還可以使用 pkg.json 文件的 type 屬性。如果 type 屬性為 module,則表示當(dāng)前模塊應(yīng)使用 ESM 來解析模塊,否則使用 CommonJS 解析模塊。 

  1.  
  2.   "type": "module" // module | commonjs(default)  

當(dāng)然有些本地文件是沒有 pkg.json 的,但是你又不想使用 .mjs 后綴,這時(shí)候只需要在命令行加上一個(gè)啟動(dòng)參數(shù) --input-type=module。同時(shí) input-type 也支持 commonjs 參數(shù)來指定使用 CommonJS(-—input-type=commonjs)。

總結(jié)一下,Node.js 中,以下三種情況會啟用 ESM 的模塊加載方式:

  1.  文件后綴為.mjs;
  2.  pkg.json 中 type 字段指定為 module;
  3.  啟動(dòng)參數(shù)添加 --input-type=module。

同樣,也有三種情況會啟用 CommonJS 的模塊加載方式:

  1.  文件后綴為.cjs;
  2.  pkg.json 中 type 字段指定為 commonjs;
  3.  啟動(dòng)參數(shù)添加 --input-type=commonjs。

雖然 13.2 版本去除了 --experimental-modules 的啟動(dòng)參數(shù),但是按照文檔的說法,在 Node.js 中使用 ESM 依舊是實(shí)驗(yàn)特性。   

  1. Stability: 1 - Experimental 

不過,相信等到 Node.js 14 LTS 版本發(fā)布時(shí),ESM 的支持應(yīng)該就能進(jìn)入穩(wěn)定階段了,這里還有一個(gè) Node.js 關(guān)于 ESM 的整個(gè)計(jì)劃列表可以查閱。 

 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2020-09-18 09:02:32

前端模塊化

2022-09-05 09:01:13

前端模塊化

2020-09-17 10:30:21

前端模塊化組件

2013-08-20 15:31:18

前端模塊化

2022-03-11 13:01:27

前端模塊

2023-05-24 10:35:11

Node.jsES模塊

2014-04-27 10:16:31

QCon北京2014Andrew Bett

2021-12-15 11:52:34

GPLLinuxGNU

2019-08-28 16:18:39

JavaScriptJS前端

2016-09-23 11:08:35

前端Javascript模塊化

2013-03-19 10:50:38

2013-03-11 10:00:13

前端模塊化

2021-01-06 05:23:15

ServiceMesh網(wǎng)絡(luò)阿帕網(wǎng)

2018-12-18 11:20:28

前端模塊化JavaScript

2016-10-09 11:03:41

Javascript模塊化Web

2019-08-05 10:08:25

軟件操作系統(tǒng)程序員

2013-03-11 10:10:03

2022-09-21 11:51:26

模塊化應(yīng)用

2015-10-10 10:01:28

前端模塊化webpack

2017-05-18 10:23:55

模塊化開發(fā)RequireJsJavascript
點(diǎn)贊
收藏

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

久久免费黄色网址| 精品人妻一区二区三区四区在线| 亚洲中文字幕在线观看| 91精品国产91久久综合| 精品久久久久久久久久久院品网 | 亚洲国产欧美91| 主播国产精品| 成人精品国产福利| 青青草原成人在线视频| 天堂av免费在线| 88久久精品| 动漫精品一区二区| 欧美日韩精品免费看| 中文字幕久久熟女蜜桃| 激情综合自拍| 亚洲视频一区二区| 日本一区二区三区在线免费观看| av岛国在线| 中文子幕无线码一区tr| 91嫩草在线| www.com国产| 永久91嫩草亚洲精品人人| 亚洲国产第一页| 色国产在线视频| 麻豆mv在线看| 亚洲嫩草精品久久| 神马影院一区二区三区| 人妻妺妺窝人体色www聚色窝| 秋霞国产午夜精品免费视频| 欧美精品免费在线| 成熟人妻av无码专区| 加勒比视频一区| 欧美精品久久天天躁| 国产l精品国产亚洲区久久| 大片免费在线观看| 国产欧美一区二区三区在线老狼 | 亚洲人成精品久久久 | 色资源在线观看| 国模大尺度一区二区三区| 日韩女优人人人人射在线视频| 麻豆91精品91久久久| 99精品在线| 一区二区av在线| 国产乱了高清露脸对白| 日韩欧美高清一区二区三区| 欧美色中文字幕| 成人av一级片| 国产网站在线| 亚洲自拍偷拍欧美| 精品国产一区二区三区在线| 午夜激情在线观看| 日本一区二区免费在线观看视频 | 污视频网址在线观看| 欧美成人a交片免费看| 图片区小说区区亚洲影院| 国产高清不卡无码视频| 黄网站在线免费| 国产精品久久久一本精品| 日韩精品一区二区三区四区五区| 日韩一区二区三区不卡| 不卡视频免费播放| 国内成+人亚洲| 午夜视频福利在线| 91偷拍与自偷拍精品| 国产一区二区在线观看免费播放| 亚洲av无码乱码国产麻豆| 国产一区在线精品| 91青青草免费观看| 刘玥91精选国产在线观看| 成人一级黄色片| 国内视频一区| 免费资源在线观看| 国产欧美日韩另类一区| 五月天国产一区| 免费av网站在线观看| 亚洲日本韩国一区| 免费人成自慰网站| 久草在线资源福利站| 色综合天天性综合| www.激情小说.com| 国产日韩在线观看视频| 欧美mv日韩mv| 中文字幕在线看高清电影| 亚洲丁香日韩| 国产一区二区三区在线看| 非洲一级黄色片| 久久亚州av| 亚洲欧美国产一本综合首页| 制服 丝袜 综合 日韩 欧美| blacked蜜桃精品一区| 亚洲最新视频在线| 性生交大片免费全黄| 国产一区亚洲| 欧美主播福利视频| 中文在线观看av| 美女视频黄免费的久久 | 亚洲一区 视频| 亚洲精品乱码久久久久久蜜桃麻豆| 久久久女人电视剧免费播放下载| 久草精品视频在线观看| 亚洲深夜福利| 国产精品久久久久久搜索 | 精品国产乱码久久久久久丨区2区| 亚洲AV无码国产精品午夜字幕| 成人性生交大片| 欧美二区三区在线| 在线免费观看黄色av| 亚洲青青青在线视频| 国产主播自拍av| 9765激情中文在线| 欧美午夜理伦三级在线观看| 色男人天堂av| 国产免费久久| 日韩网站免费观看高清| 国产真人真事毛片| 男人的天堂成人在线| 国产欧美精品一区二区三区介绍| 老牛影视av牛牛影视av| 欧美激情一区二区三区蜜桃视频| 无码人妻精品一区二区三区99v| av在线不卡免费| 欧美专区在线观看一区| 动漫av在线免费观看| 欧美男gay| 欧美刺激性大交免费视频| 日韩精品一区二区亚洲av| 日本aⅴ亚洲精品中文乱码| 国产亚洲一区二区三区在线播放| 成人在线观看免费| 亚洲国产成人tv| 欧美日韩精品区别| 亚洲精品国产setv| 欧美成人精品在线视频| 国产污视频网站| 国产成人精品一区二| 久久久久久九九| 99riav视频在线观看| 在线成人高清不卡| caopeng视频| 激情偷拍久久| 91在线观看免费高清完整版在线观看| 日本黄在线观看| 亚洲国产一二三| 欧美一级免费在线| 国产成人短视频在线观看| 久久人人爽人人爽人人片av高请| 中文字幕av久久爽| 久久久国产精品麻豆| 日本手机在线视频| 久久国际精品| 精品久久久av| 国产成人a v| 91免费视频网址| 蜜臀av.com| 成人福利免费在线观看| 欧美老女人性视频| 国产一区二区在线视频聊天| 久久精品视频一区二区三区| 妞干网在线视频观看| 无码国模国产在线观看| 日韩视频一区在线| 欧美成人精品网站| 国产精品入口麻豆原神| 天天碰免费视频| 综合伊思人在钱三区| 韩剧1988免费观看全集| 刘亦菲毛片一区二区三区| 一区二区三区在线不卡| 三级黄色片播放| 国产精品88久久久久久| 国产精品免费福利| 在线播放麻豆| 欧美日韩mp4| 久久成人小视频| 九色porny丨国产精品| 亚洲自拍偷拍二区| 久久亚洲精精品中文字幕| 麻豆成人在线看| 精品人妻一区二区三区三区四区 | 狠狠色狠狠色综合日日tαg | 久久97久久97精品免视看秋霞| 久久99久久99精品中文字幕| 成人黄色在线观看视频| 亚洲一区在线电影| 国产av一区二区三区传媒| 亚洲成人原创| 九九九九九九精品| 国产高清不卡| 中文字幕视频在线免费欧美日韩综合在线看| 91久久国产综合久久91| 国产三级精品三级| 思思久久精品视频| 欧美激情视频一区二区三区免费| 国产精品久久亚洲7777| 最新中文字幕在线播放| 亚洲视频在线观看免费| 国产一区二区三区中文字幕| 亚洲欧美一区二区三区国产精品| 岛国大片在线免费观看| 亚洲午夜电影| 亚洲美女搞黄| 亚洲热av色在线播放| 久久久亚洲国产| 成人在线免费电影| 亚洲国产成人av在线| 免费av中文字幕| 亚洲欧美视频在线观看| 美女黄色一级视频| 日韩国产精品久久久久久亚洲| 在线成人av电影| 精品视频国内| 国产精品91免费在线| 麻豆网站在线观看| 欧美精品一区二区久久婷婷| 中文字幕在线日本| 亚洲精品少妇30p| 无遮挡aaaaa大片免费看| 青青草国产精品亚洲专区无| 国产青青在线视频| 我不卡神马影院| 玛丽玛丽电影原版免费观看1977| 欧美综合社区国产| 午夜精品一区二区三区在线视| 在线观看免费网站黄| 欧美精品一区二区三区在线播放| 亚洲系列在线观看| 精品久久久久久久久久国产| 国产精品成人69xxx免费视频| 成a人片国产精品| 狠狠操狠狠干视频| 蜜桃视频一区| 日韩精品在线中文字幕| 欧美在线网站| 亚洲人成网站在线播放2019| 欧美18xxxx| 91九色极品视频| 成人午夜亚洲| 日本一本a高清免费不卡| 咪咪网在线视频| 欧美人在线视频| 亚洲乱亚洲乱妇| 亚洲免费av电影| 成人乱码一区二区三区| 8v天堂国产在线一区二区| 免费又黄又爽又色的视频| 一区二区三区视频在线看| 99热在线观看精品| 中文字幕国产精品一区二区| 三叶草欧洲码在线| 成人av免费网站| 91国内在线播放| 精品一区二区三区在线观看国产| 国产成人久久777777| 亚洲激情国产| 国产欧美精品aaaaaa片| 夜间精品视频| 在线观看一区二区三区三州| 欧美成人激情| 亚洲看片网站| 日韩在线不卡| 艳色歌舞团一区二区三区| 成人免费在线播放| 久久久久久国产精品一区| 精品在线99| 欧美日韩精品免费观看| 国产一区二区观看| 日韩中文一区二区三区| 精品久久中文| 日韩精品一区二区三区外面| 日韩欧美视频| 一区二区三区四区五区视频| 日韩欧美视频专区| 中文字幕一区二区三区四区五区| 人人狠狠综合久久亚洲婷| 狠狠色噜噜狠狠色综合久| 自拍自偷一区二区三区| 五月天亚洲综合情| 日韩av免费大片| 伊人久久大香线蕉av一区| 亚洲九九视频| 麻豆中文字幕在线观看| 亚洲国内精品| 欧美激情国产精品日韩| 日韩高清电影一区| 午夜一级免费视频| 懂色中文一区二区在线播放| 国产精品偷伦视频免费观看了| 9l国产精品久久久久麻豆| 亚洲国产果冻传媒av在线观看| 久久久777精品电影网影网| xxxx日本黄色| 亚洲欧美日韩小说| 久久久久久91亚洲精品中文字幕| 91官网在线观看| ,亚洲人成毛片在线播放| 欧美一级日韩免费不卡| 亚洲老妇色熟女老太| 亚洲区免费影片| www.亚洲资源| 欧美黄色成人网| 欧美91看片特黄aaaa| 国产精品久久久久久久久久新婚 | 国产一级片中文字幕| 国内精品视频666| 青青草成人免费视频| 国产精品萝li| 国产在线观看免费av| 色婷婷综合久色| 99国产精品久久久久99打野战| 91麻豆精品国产91久久久久久久久 | 欧美日韩亚洲一区| 亚洲 自拍 另类小说综合图区| 青青草一区二区三区| 精人妻一区二区三区| 国产女主播一区| 玖玖爱免费视频| 欧美亚洲一区二区在线观看| 人人妻人人澡人人爽久久av| 日韩中文字幕视频在线观看| 国产色婷婷在线| 国产精品久久久久久久久久免费| 日本99精品| 蜜桃成人在线| 99日韩精品| 日韩av.com| 91蝌蚪porny成人天涯| 美女三级黄色片| 色琪琪一区二区三区亚洲区| 亚洲经典一区二区三区| 深夜精品寂寞黄网站在线观看| av手机在线观看| 亚洲尤物视频网| 欧美日韩在线二区| 日本不卡在线观看视频| 国产aⅴ精品一区二区三区色成熟| 久久中文字幕精品| 狠狠久久五月精品中文字幕| www.97超碰| 久久夜色精品亚洲噜噜国产mv| 欧美成人精品一区二区男人小说| 国产精品对白一区二区三区| 91成人看片| 国产精品久久久毛片| 国产日产精品一区| 国产性猛交╳xxx乱大交| 日韩免费电影一区| 秋霞影院午夜丰满少妇在线视频| 日本一本a高清免费不卡| 澳门成人av| 欧美一级欧美一级| 国产成人在线视频网站| www深夜成人a√在线| 欧美日韩在线免费视频| 8888四色奇米在线观看| 国产福利精品视频| 一道在线中文一区二区三区| 成年人午夜视频在线观看| 国产99久久久久久免费看农村| 精品在线免费观看视频| 亚洲精品在线观看视频| 污污网站在线看| 91香蕉视频在线下载| 欧美88av| 影音先锋资源av| 亚洲自拍偷拍综合| 亚洲高清视频网站| 久久久久久久国产精品| 婷婷综合国产| 无码人妻丰满熟妇区96| 97se亚洲国产综合自在线不卡| 日韩xxx高潮hd| 日韩精品极品在线观看| 激情都市亚洲| 亚洲不卡一卡2卡三卡4卡5卡精品| 久久国产直播| 一级在线观看视频| 欧美久久久久久久久| 调教视频免费在线观看| 91精品中文在线| 欧美午夜免费影院| 一边摸一边做爽的视频17国产| 亚洲精品国产精华液| 午夜视频在线播放| 国产mv免费观看入口亚洲| 精品久久电影| 亚洲免费黄色录像| 午夜天堂影视香蕉久久| 免费福利在线观看| 国产精品稀缺呦系列在线| 亚洲精品极品少妇16p| 性生活一级大片| 色综合天天视频在线观看| 成年人视频网站在线| 成人精品一区二区三区| 国产精品激情电影| 青娱乐国产视频| 欧美一级xxx| 亚洲十八**毛片| 神马影院午夜我不卡| 麻豆成人av在线|