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

JavaScript引入模塊的歷史簡介

開發 前端
隨著我們的應用越來越大,我們想要將其拆分成多個文件,即所謂的“模塊(module)”。一個模塊可以包含用于特定目的的類或函數庫。

[[360060]]

 隨著我們的應用越來越大,我們想要將其拆分成多個文件,即所謂的“模塊(module)”。一個模塊可以包含用于特定目的的類或函數庫。

很長一段時間,JavaScript 都沒有語言級(language-level)的模塊語法。這不是一個問題,因為最初的腳本又小又簡單,所以沒必要將其模塊化。

但是最終腳本變得越來越復雜,因此社區發明了許多種方法來將代碼組織到模塊中,使用特殊的庫按需加載模塊。

列舉一些(出于歷史原因):

  • AMD —— 最古老的模塊系統之一,最初由 require.js 庫實現。
  • CommonJS —— 為 Node.js 服務器創建的模塊系統。
  • UMD —— 另外一個模塊系統,建議作為通用的模塊系統,它與 AMD 和 CommonJS 都兼容。

現在,它們都在慢慢成為歷史的一部分,但我們仍然可以在舊腳本中找到它們。

語言級的模塊系統在 2015 年的時候出現在了標準(ES6)中,此后逐漸發展,現在已經得到了所有主流瀏覽器和 Node.js 的支持。因此,我們將從現在開始學習現代 JavaScript 模塊(module)。

一、什么是模塊?

一個模塊(module)就是一個文件。一個腳本就是一個模塊。就這么簡單。

模塊可以相互加載,并可以使用特殊的指令 export 和 import 來交換功能,從另一個模塊調用一個模塊的函數:

export 關鍵字標記了可以從當前模塊外部訪問的變量和函數。

import 關鍵字允許從其他模塊導入功能。

例如,我們有一個 sayHi.js 文件導出了一個函數:

  1. //  sayHi.js 
  2. export function sayHi(user) { 
  3.   alert(`Hello, ${user}!`); 

 ……然后另一個文件可能導入并使用了這個函數: 

  1. //  main.js 
  2. import {sayHi} from './sayHi.js'
  3.  
  4. alert(sayHi); // function... 
  5. sayHi('John'); // Hello, John! 

 import 指令通過相對于當前文件的路徑 ./sayHi.js 加載模塊,并將導入的函數 sayHi 分配(assign)給相應的變量。

讓我們在瀏覽器中運行一下這個示例。

由于模塊支持特殊的關鍵字和功能,因此我們必須通過使用<script type="module"> 特性(attribute)來告訴瀏覽器,此腳本應該被當作模塊(module)來對待。

像這樣:

  1. <!doctype html> 
  2. <script type="module"
  3.   import {sayHi} from './say.js'
  4.  
  5.   document.body.innerHTML = sayHi('John'); 
  6. </script> 

瀏覽器會自動獲取并解析(evaluate)導入的模塊(如果需要,還可以分析該模塊的導入),然后運行該腳本。

模塊只通過 HTTP(s) 工作,在本地文件則不行

如果你嘗試通過 file:// 協議在本地打開一個網頁,你會發現 import/export 指令不起作用。你可以使用本地 Web 服務器,例如 static-server,或者使用編輯器的“實時服務器”功能,例如 VS Code 的 Live Server Extension 來測試模塊。

二、模塊核心功能

與“常規”腳本相比,模塊有什么不同呢?

下面是一些核心的功能,對瀏覽器和服務端的 JavaScript 來說都有效。

三、始終使用 “use strict”

模塊始終默認使用 use strict,例如,對一個未聲明的變量賦值將產生錯誤(譯注:在瀏覽器控制臺可以看到 error 信息)。

  1. <script type="module"
  2.   a = 5; // error 
  3. </script> 

 四、模塊級作用域

每個模塊都有自己的頂級作用域(top-level scope)。換句話說,一個模塊中的頂級作用域變量和函數在其他腳本中是不可見的。

在下面這個例子中,我們導入了兩個腳本,hello.js 嘗試使用在 user.js 中聲明的變量 user,失敗了:

  1. <!doctype html> 
  2. <script type="module" src="user.js"></script> 
  3. <script type="module" src="hello.js"></script> 

 模塊期望 export 它們想要被外部訪問的內容,并 import 它們所需要的內容。

所以,我們應該將 user.js 導入到 hello.js 中,并從中獲取所需的功能,而不要依賴于全局變量。

這是正確的變體:

  1. import {userfrom './user.js'
  2.  
  3. document.body.innerHTML = user; // John 

 在瀏覽器中,每個 <script type="module"> 也存在獨立的頂級作用域(譯注:在瀏覽器控制臺可以看到 error 信息)。

  1. <script type="module"
  2.   // 變量僅在這個 module script 內可見 
  3.   let user = "John"
  4. </script> 
  5.  
  6. <script type="module"
  7.   alert(user); // Error: user is not defined 
  8. </script> 

 如果我們真的需要創建一個 window-level 的全局變量,我們可以將其明確地賦值給 window,并以 window.user 來訪問它。但是這需要你有足夠充分的理由,否則就不要這樣做。

五、模塊代碼僅在第一次導入時被解析

如果同一個模塊被導入到多個其他位置,那么它的代碼僅會在第一次導入時執行,然后將導出(export)的內容提供給所有的導入(importer)。

這有很重要的影響。讓我們通過示例來看一下:

首先,如果執行一個模塊中的代碼會帶來副作用(side-effect),例如顯示一條消息,那么多次導入它只會觸發一次顯示 —— 即第一次:

  1. //  alert.js 
  2. alert("Module is evaluated!"); 

  1. // 在不同的文件中導入相同的模塊 
  2.  
  3. //  1.js 
  4. import `./alert.js`; // Module is evaluated! 
  5.  
  6. //  2.js 
  7. import `./alert.js`; // (什么都不顯示) 

 在實際開發中,頂級模塊代碼主要用于初始化,內部數據結構的創建,并且如果我們希望某些東西可以重用 — 請導出它。

下面是一個高級點的例子。

我們假設一個模塊導出了一個對象:

  1. //  admin.js 
  2. export let admin = { 
  3.   name"John" 
  4. }; 

 如果這個模塊被導入到多個文件中,模塊僅在第一次被導入時被解析,并創建 admin 對象,然后將其傳入到所有的導入。

所有的導入都只獲得了一個唯一的 admin 對象:

  1. //  1.js 
  2. import {admin} from './admin.js'
  3. admin.name = "Pete"
  4.  
  5. //  2.js 
  6. import {admin} from './admin.js'
  7. alert(admin.name); // Pete 
  8.  
  9. // 1.js 和 2.js 導入的是同一個對象 
  10. // 在 1.js 中對對象做的更改,在 2.js 中也是可見的 

 所以,讓我們重申一下 —— 模塊只被執行一次。生成導出,然后它被分享給所有對其的導入,所以如果某個地方修改了 admin 對象,其他的模塊也能看到這個修改。

這種行為讓我們可以在首次導入時 設置 模塊。我們只需要設置其屬性一次,然后在進一步的導入中就都可以直接使用了。

例如,下面的 admin.js 模塊可能提供了特定的功能,但是希望憑證(credential)從外部進入 admin 對象:

  1. //  admin.js 
  2. export let admin = { }; 
  3.  
  4. export function sayHi() { 
  5.   alert(`Ready to serve, ${admin.name}!`); 

 在 init.js 中 —— 我們 APP 的第一個腳本,設置了 admin.name。現在每個位置都能看到它,包括在 admin.js 內部的調用。

  1. //  init.js 
  2. import {admin} from './admin.js'
  3. admin.name = "Pete"

 另一個模塊也可以看到 admin.name:

  1. //  other.js 
  2. import {admin, sayHi} from './admin.js'
  3.  
  4. alert(admin.name); // Pete 
  5.  
  6. sayHi(); // Ready to serve, Pete! 

 六、import.meta

import.meta 對象包含關于當前模塊的信息。

它的內容取決于其所在的環境。在瀏覽器環境中,它包含當前腳本的 URL,或者如果它是在 HTML 中的話,則包含當前頁面的 URL。

  1. <script type="module"
  2.   alert(import.meta.url); // 腳本的 URL(對于內嵌腳本來說,則是當前 HTML 頁面的 URL) 
  3. </script> 

 七、在一個模塊中,“this” 是 undefined

這是一個小功能,但為了完整性,我們應該提到它。

在一個模塊中,頂級 this 是 undefined。

將其與非模塊腳本進行比較會發現,非模塊腳本的頂級 this 是全局對象:

  1. <script> 
  2.   alert(this); // window 
  3. </script> 
  4.  
  5. <script type="module"
  6.   alert(this); // undefined 
  7. </script> 

 八、瀏覽器特定功能

與常規腳本相比,擁有 type="module" 標識的腳本有一些特定于瀏覽器的差異。

如果你是第一次閱讀或者你不打算在瀏覽器中使用 JavaScript,那么你可以跳過本節內容。

九、模塊腳本是延遲的

模塊腳本 總是 被延遲的,與 defer 特性(在 腳本:async,defer 一章中描述的)對外部腳本和內聯腳本(inline script)的影響相同。

也就是說:

  • 下載外部模塊腳本 <script type="module" src="..."> 不會阻塞 HTML 的處理,它們會與其他資源并行加載。
  • 模塊腳本會等到 HTML 文檔完全準備就緒(即使它們很小并且比 HTML 加載速度更快),然后才會運行。
  • 保持腳本的相對順序:在文檔中排在前面的腳本先執行。

它的一個副作用是,模塊腳本總是會“看到”已完全加載的 HTML 頁面,包括在它們下方的 HTML 元素。

例如:

  1. <script type="module"
  2.   alert(typeof button); // object:腳本可以“看見”下面的 button 
  3.   // 因為模塊是被延遲的(deferred,所以模塊腳本會在整個頁面加載完成后才運行 
  4. </script> 
  5.  
  6. 相較于下面這個常規腳本: 
  7.  
  8. <script> 
  9.   alert(typeof button); // button 為 undefined,腳本看不到下面的元素 
  10.   // 常規腳本會立即運行,常規腳本的運行是在在處理頁面的其余部分之前進行的 
  11. </script> 
  12.  
  13. <button id="button">Button</button> 

請注意:上面的第二個腳本實際上要先于前一個腳本運行!所以我們會先看到 undefined,然后才是 object。

這是因為模塊腳本是被延遲的,所以要等到 HTML 文檔被處理完成才會執行它。而常規腳本則會立即運行,所以我們會先看到常規腳本的輸出。

當使用模塊腳本時,我們應該知道 HTML 頁面在加載時就會顯示出來,在 HTML 頁面加載完成后才會執行 JavaScript 模塊,因此用戶可能會在 JavaScript 應用程序準備好之前看到該頁面。某些功能那時可能還無法正使用。我們應該放置“加載指示器(loading indicator)”,否則,請確保不會使用戶感到困惑。

十、Async 適用于內聯腳本(inline script)

對于非模塊腳本,async 特性(attribute)僅適用于外部腳本。異步腳本會在準備好后立即運行,獨立于其他腳本或 HTML 文檔。

對于模塊腳本,它也適用于內聯腳本。

例如,下面的內聯腳本具有 async 特性,因此它不會等待任何東西。

它執行導入(fetch ./analytics.js),并在準備導入完成時運行,即使 HTML 文檔還未完成,或者其他腳本仍在等待處理中。

這對于不依賴任何其他東西的功能來說是非常棒的,例如計數器,廣告,文檔級事件監聽器。

  1. <!-- 所有依賴都獲取完成(analytics.js)然后腳本開始運行 --> 
  2. <!-- 不會等待 HTML 文檔或者其他 <script> 標簽 --> 
  3. <script async type="module"
  4.   import {counter} from './analytics.js'
  5.  
  6.   counter.count(); 
  7. </script> 

 十一、外部腳本

具有 type="module" 的外部腳本(external script)在兩個方面有所不同:

  1. 具有相同 src 的外部腳本僅運行一次:<!-- 腳本 my.js 被加載完成(fetched)并只被運行一次 --> <script type="module" src="my.js"></script> <script type="module" src="my.js"></script>
  2. 從另一個源(例如另一個網站)獲取的外部腳本需要 CORS header,如我們在 Fetch:跨源請求 一章中所講的那樣。換句話說,如果一個模塊腳本是從另一個源獲取的,則遠程服務器必須提供表示允許獲取的 header Access-Control-Allow-Origin。<!-- another-site.com 必須提供 Access-Control-Allow-Origin --> <!-- 否則,腳本將無法執行 --> <script type="module" src="http://another-site.com/their.js"></script>默認這樣做可以確保更好的安全性。

 十二、不允許裸模塊(“bare” module)

在瀏覽器中,import 必須給出相對或絕對的 URL 路徑。沒有任何路徑的模塊被稱為“裸(bare)”模塊。在 import 中不允許這種模塊。

例如,下面這個 import 是無效的:

  1. import {sayHi} from 'sayHi'; // Error,“裸”模塊 
  2. // 模塊必須有一個路徑,例如 './sayHi.js' 或者其他任何路徑 

 某些環境,像 Node.js 或者打包工具(bundle tool)允許沒有任何路徑的裸模塊,因為它們有自己的查找模塊的方法和鉤子(hook)來對它們進行微調。但是瀏覽器尚不支持裸模塊。

十三、兼容性,“nomodule”

舊時的瀏覽器不理解 type="module"。未知類型的腳本會被忽略。對此,我們可以使用 nomodule 特性來提供一個后備:

  1. <script type="module"
  2.   alert("Runs in modern browsers"); 
  3. </script> 
  4.  
  5. <script nomodule> 
  6.   alert("Modern browsers know both type=module and nomodule, so skip this"
  7.   alert("Old browsers ignore script with unknown type=module, but execute this."); 
  8. </script> 

 十四、構建工具

在實際開發中,瀏覽器模塊很少被以“原始”形式進行使用。通常,我們會使用一些特殊工具,例如 Webpack,將它們打包在一起,然后部署到生產環境的服務器。

使用打包工具的一個好處是 —— 它們可以更好地控制模塊的解析方式,允許我們使用裸模塊和更多的功能,例如 CSS/HTML 模塊等。

構建工具做以下這些事兒:

  1. 從一個打算放在 HTML 中的 <script type="module"> “主”模塊開始。
  2. 分析它的依賴:它的導入,以及它的導入的導入等。
  3. 使用所有模塊構建一個文件(或者多個文件,這是可調的),并用打包函數(bundler function)替代原生的 import 調用,以使其正常工作。還支持像 HTML/CSS 模塊等“特殊”的模塊類型。
  4. 在處理過程中,可能會應用其他轉換和優化:刪除無法訪問的代碼。刪除未使用的導出(“tree-shaking”)。刪除特定于開發的像 console 和 debugger 這樣的語句。可以使用 Babel 將前沿的現代的 JavaScript 語法轉換為具有類似功能的舊的 JavaScript 語法。壓縮生成的文件(刪除空格,用短的名字替換變量等)。

如果我們使用打包工具,那么腳本會被打包進一個單一文件(或者幾個文件),在這些腳本中的 import/export 語句會被替換成特殊的打包函數(bundler function)。因此,最終打包好的腳本中不包含任何 import/export,它也不需要 type="module",我們可以將其放入常規的 <script>:

  1. <!-- 假設我們從諸如 Webpack 這類的打包工具中獲得了 "bundle.js" 腳本 --> 
  2. <script src="bundle.js"></script> 

也就是說,原生模塊也是可以使用的。所以,我們在這兒將不會使用 Webpack:你可以稍后再配置它。

十五、總結

下面總結一下模塊的核心概念:

  1. 一個模塊就是一個文件。瀏覽器需要使用 <script type="module"> 以使 import/export 可以工作。模塊(譯注:相較于常規腳本)有幾點差別:默認是延遲解析的(deferred)。Async 可用于內聯腳本。要從另一個源(域/協議/端口)加載外部腳本,需要 CORS header。重復的外部腳本會被忽略
  2. 模塊具有自己的本地頂級作用域,并可以通過 import/export 交換功能。
  3. 模塊始終使用 use strict。
  4. 模塊代碼只執行一次。導出僅創建一次,然后會在導入之間共享。

當我們使用模塊時,每個模塊都會實現特定功能并將其導出。然后我們使用 import 將其直接導入到需要的地方即可。瀏覽器會自動加載并解析腳本。

在生產環境中,出于性能和其他原因,開發者經常使用諸如 Webpack 之類的打包工具將模塊打包到一起。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-08-12 10:25:39

JavaScript開發技術

2010-03-12 10:48:22

Python編程語言

2021-04-08 10:01:40

Python模塊的引入調用

2010-03-12 17:29:16

Python模塊

2011-06-27 14:56:31

JavaScript

2021-11-22 22:14:46

JavaScript開發模塊

2022-12-02 08:00:00

JavaScriptAstro前端

2024-05-28 00:00:10

Python模塊開發

2013-03-11 10:10:03

2020-12-02 08:28:58

JavaScript API 服務器

2020-07-20 07:56:28

JavaScript開發技術

2010-09-13 09:18:22

JavaScript模塊模式

2020-07-09 08:01:48

JavaScriptES模塊

2023-10-07 08:00:00

JavaScriptHTMX

2009-06-23 16:20:47

Jigsaw項目Java 7Project Jig

2020-12-23 14:18:43

JavaScript模塊導出

2012-08-29 09:58:34

JavaScriptJavaScript模

2023-06-20 19:39:40

JavaScriptHTML

2021-02-16 16:44:40

RustJavaScript開發

2012-10-29 13:25:54

JavaScriptJSjQuery
點贊
收藏

51CTO技術棧公眾號

欧美日本国产在线| 在线观看欧美精品| 久久久亚洲综合网站| 亚洲 日本 欧美 中文幕| 日韩理论在线| 精品美女一区二区| 免费在线观看毛片网站| 黄网站app在线观看| 国产成人精品免费网站| 国产999精品久久久| 九九九免费视频| 欧美人妖在线| 欧美v日韩v国产v| 狠狠热免费视频| 国产啊啊啊视频在线观看| 久久精子c满五个校花| 99久久精品免费看国产一区二区三区 | 久久精品视频免费观看| 成人在线观看视频网站| 6080午夜伦理| 亚洲国产高清一区| 日日骚久久av| 中文字幕国产专区| 国产厕拍一区| 3d动漫精品啪啪一区二区竹菊| 欧美色图另类小说| 羞羞的视频在线观看| 欧美激情一区二区| 欧美黄色直播| 天堂在线一二区| 成人免费毛片嘿嘿连载视频| 91亚洲精品久久久久久久久久久久 | 一区二区三区四区在线观看国产日韩 | 日韩av高清在线| 国产91对白在线观看九色| 国产欧亚日韩视频| 国产成人麻豆免费观看| 亚洲伊人观看| 97国产在线观看| 久久免费少妇高潮99精品| 外国成人激情视频| 日韩亚洲国产中文字幕| wwwww黄色| 欧美日韩在线观看视频小说| 日韩精品久久久久久福利| 国产a√精品区二区三区四区| 99热这里有精品| 欧美顶级少妇做爰| 欧美美女性视频| 欧美高清xxx| 欧美日韩色一区| 亚洲性图一区二区| 精品亚洲a∨| 51精品国自产在线| 国内av免费观看| 欧美国产亚洲精品| 日韩精品专区在线影院重磅| 久草福利在线观看| 综合久久成人| 亚洲国产精品资源| 成人在线视频免费播放| 日韩av三区| 亚洲人成电影在线| 91资源在线播放| 欧美成人直播| 欧美成人免费网| 日本三级片在线观看| 国产精品久久久久久模特| 奇门遁甲1982国语版免费观看高清 | 亚洲美女少妇无套啪啪呻吟| 66m—66摸成人免费视频| 九九九在线观看| 日本女优在线视频一区二区 | 91国内精品| 亚洲成人中文字幕| 无码一区二区三区在线| 手机在线电影一区| 欧美黄色三级网站| 国产伦精品一区二区三区视频网站| 日日摸夜夜添夜夜添国产精品| 国产精品香蕉国产| 国产色视频在线| av高清不卡在线| 五月天亚洲综合情| 怡红院红怡院欧美aⅴ怡春院| 五月综合激情网| 日韩毛片在线免费看| 亚洲综合视频| 日韩风俗一区 二区| 久久一级免费视频| 亚洲成人资源| 国产色视频一区| 日批视频在线播放| 中文字幕不卡一区| 成人免费播放器| 色猫猫成人app| 精品国产乱子伦一区| 91成人在线免费视频| 女人天堂亚洲aⅴ在线观看| 4444欧美成人kkkk| 99国产精品久久久久99打野战| 99久久精品免费观看| 亚洲一区二区三区精品在线观看 | 午夜精品爽啪视频| 91香蕉视频导航| 另类春色校园亚洲| 最近2019年中文视频免费在线观看| 国产亚洲精品av| 久久国内精品视频| 久久综合入口| 超级碰碰不卡在线视频| 欧美日韩一区成人| 天天插天天射天天干| 欧美在线资源| 国产欧美日韩中文字幕| 少妇激情av一区二区| 国产精品免费视频观看| 日韩av在线综合| 久久久免费毛片| 久色乳综合思思在线视频| 无码久久精品国产亚洲av影片| www..com久久爱| 黄色小视频大全| 欧美激情三区| 亚洲人成电影在线观看天堂色| 国产一级片久久| 国模娜娜一区二区三区| 亚洲一区三区视频在线观看| 国产精品高清乱码在线观看| 亚洲第一区第一页| 黄色在线观看免费| 国产乱码字幕精品高清av| 亚洲欧洲三级| 国产精品麻豆成人av电影艾秋| 国产午夜精品理论片a级探花| 国产一级久久久| 福利一区在线观看| 日韩国产小视频| 亚洲午夜精品| 精品中文字幕在线观看| 国产乱色精品成人免费视频| 亚洲日本一区二区| 99九九精品视频| 亚洲国产一区二区在线观看| 成人性生交大片免费看视频直播| av国产在线观看| 欧美日韩一区不卡| 伊人久久久久久久久久久久久久| 久久成人羞羞网站| 亚洲高清视频一区| 99综合99| 久久久久久美女| 天堂av一区二区三区| 激情懂色av一区av二区av| 大乳护士喂奶hd| 校园激情久久| 色姑娘综合网| 成人在线视频区| 久久成人精品视频| www.天堂在线| 午夜激情久久久| 亚洲成人精品一区二区| 高清中文字幕mv的电影| 91久久亚洲| 免费看成人av| 欧美成人高清视频在线观看| 久久夜色撩人精品| 亚洲欧美另类视频| 午夜在线成人av| 国产精品815.cc红桃| 日本不卡123| 91精品国产综合久久精品| 欧美一区二区三区粗大| 久久99最新地址| 久久这里只有精品18| 日本亚洲不卡| 国产自产女人91一区在线观看| yellow91字幕网在线| 亚洲精品国产精品自产a区红杏吧| 久热这里只有精品6| 日本一区二区成人在线| 四虎国产精品免费| 国产农村妇女毛片精品久久莱园子 | www.五月激情| 在线观看亚洲成人| 少妇aaaaa| 久久综合中文字幕| 天堂av2020| 午夜综合激情| 樱空桃在线播放| 竹菊久久久久久久| 亚洲综合成人婷婷小说| 亚洲黄色免费av| 久久精品中文字幕免费mv| 日本免费一区视频| 欧美日韩高清一区| 日本一级片免费看| 亚洲天堂网中文字| 国产精品毛片一区二区| 国产乱码精品一区二区三区av| 欧美牲交a欧美牲交| 色97色成人| 欧美激情一区二区三区在线视频| 激情不卡一区二区三区视频在线| 欧美怡红院视频一区二区三区| 成人影院在线观看| 亚洲天堂视频在线观看| 可以免费看毛片的网站| 欧美另类久久久品| 综合激情网五月| 亚洲一区在线视频| 欧美a级片免费看| 久久精品在这里| 国产老熟女伦老熟妇露脸| 国产一区二区免费在线| 中文字幕在线导航| 国产精品呻吟| 成人性免费视频| 综合在线视频| 亚洲三区在线| 日韩成人影院| 天堂av一区二区| 亚洲精品推荐| 精品一区二区三区自拍图片区| 1204国产成人精品视频| 成人在线国产精品| 国产91亚洲精品久久久| 情事1991在线| 桃色av一区二区| 久久久日本电影| 日本性爱视频在线观看| 久久国产精品网站| а√中文在线8| 久久影院免费观看| 黄网页免费在线观看| 中文字幕欧美在线| 福利视频在线看| 亚洲天堂av在线免费观看| 日色在线视频| 亚洲男人天堂古典| 午夜在线视频观看| 亚洲精品久久久久久下一站| 欧美一级淫片aaaaaa| 精品国产乱码久久久久久蜜臀| jizz中国少妇| 日韩精品中文字幕在线一区| 99精品久久久久久中文字幕| 91精品国产麻豆国产自产在线| 国产一区二区网站| 欧美色倩网站大全免费| 中文字字幕在线观看| 欧美日韩国产首页| 国产精品久久777777换脸| 在线成人午夜影院| 国产手机视频在线| 欧美一区二区三区四区视频| 国产草草影院ccyycom| 欧美变态凌虐bdsm| 丰满岳乱妇国产精品一区| 亚洲国产黄色片| 男女污视频在线观看| 国产亚洲美女久久| 日本不卡不卡| 色综合天天狠天天透天天伊人| 美女精品视频| 538国产精品一区二区在线| 亚洲成人看片| 成人国产在线视频| 一区二区日韩| 蜜桃成人在线| 色狮一区二区三区四区视频| 经典三级在线视频| 亚洲毛片视频| 日韩一区二区三区不卡视频| 国产伦精品一区二区三区视频青涩 | 异国色恋浪漫潭| 激情综合中文娱乐网| 精品少妇无遮挡毛片| 国产精品影视网| 欧美黑人欧美精品刺激| 国产精品免费久久| 欧美成人三级在线观看| 高跟丝袜一区二区三区| 在线视频播放大全| 欧美变态tickle挠乳网站| 日本不卡视频一区二区| 久久精品视频在线播放| 激情黄产视频在线免费观看| 国产精品欧美激情在线播放| 88久久精品| 五月天久久综合网| 亚洲国产电影| 天堂av手机在线| 久久久精品综合| 欧美精品99久久久| 在线精品视频免费观看| a级片在线播放| 国产亚洲一级高清| 后进极品白嫩翘臀在线播放| 国产精品高潮呻吟视频| julia中文字幕一区二区99在线| 日本黄网免费一区二区精品| 欧美日韩亚洲一区三区| 成年人在线观看视频免费| 成人免费视频一区二区| 男女全黄做爰文章| 高跟丝袜欧美一区| 亚洲国产精品久久久久久久| 中文字幕亚洲精品| 一区二区三区短视频| 国产精品制服诱惑| 国产精品7m凸凹视频分类| 中国丰满人妻videoshd| 国产精品88888| 操她视频在线观看| 欧洲一区在线电影| 无码国产精品一区二区免费16| 乱亲女秽乱长久久久| 国产精品原创视频| 免费在线成人av| 亚洲深夜影院| 国产伦精品一区二区三区精品| 一区二区三区四区乱视频| 中文字幕欧美色图| 亚洲香蕉av在线一区二区三区| 国产福利电影在线播放| 国产高清在线精品一区二区三区| 91精品国产成人观看| 中文字幕第88页| 日本一区二区在线不卡| 蜜臀av性久久久久蜜臀av麻豆| 免费的av在线| 久久国产生活片100| 亚洲精品成人无码| 欧美日韩国产精品一区| 免费国产精品视频| 欧美黑人性视频| 亚洲国产高清在线观看| 亚洲啊啊啊啊啊| 国产综合成人久久大片91| 乱老熟女一区二区三区| 欧美日韩一区二区不卡| 自拍视频在线网| 国产欧洲精品视频| 国产精品99久久精品| 五月花丁香婷婷| 亚洲欧美另类久久久精品| 亚洲中文一区二区三区| 精品国产一区二区三区久久狼黑人 | 欧美中文在线观看| 欧美日韩一区二区三区四区不卡| 日韩精品―中文字幕| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲另类欧美日韩| 亚洲欧美日韩高清| 91亚洲视频| 制服诱惑一区| 国产精品亚洲第一区在线暖暖韩国| 免费一级肉体全黄毛片| 欧美videofree性高清杂交| 1区2区3区在线| 欧美一区二区三区精美影视| 免费不卡在线观看| 日韩精品123区| 精品国产制服丝袜高跟| 日本不卡1234视频| 热re99久久精品国99热蜜月| 麻豆精品国产91久久久久久| wwwav国产| 亚洲精品福利资源站| 日本中文字幕一区二区| 天堂av免费看| 不卡区在线中文字幕| 天天干天天操天天操| 久久精品国产电影| 国产精品毛片av| 日韩欧美xxxx| 亚洲黄网站在线观看| 欧美日韩激情视频一区二区三区| 国产精品羞羞答答| 亚洲天堂偷拍| 欧美丰满美乳xxⅹ高潮www| 91麻豆精品国产91| а√天堂中文资源在线bt| 视频一区二区精品| 国产福利视频一区二区三区| 国产精品21p| 久久精品人人做人人爽| 欧美三级午夜理伦三级小说| 91国内在线播放| 精品动漫一区二区| 欧美激情午夜| 久久久一本精品99久久精品| 国产一区二区三区国产| 无码人妻久久一区二区三区| 九九久久精品一区| 精品少妇av| 日本黄色动态图| 制服.丝袜.亚洲.中文.综合| 欧美少妇精品|