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

「Node.js系列」深入淺出Node模塊化開發——CommonJS規范

開發 前端
本文將為大家透徹的介紹關于Node的模塊化——CommonJS的一切。

[[351111]]

前言

 本文將為大家透徹的介紹關于Node的模塊化——CommonJS的一切。

看完本文可以掌握,以下幾個方面:

  • 什么是模塊化,以及沒有模塊化會帶來哪些問題,是如何解決的;
  • JavaScript的設計缺陷;
  • CommonJS規范;
  • 它的規范特性;
  • 如何配合Node完成模塊化開發;
  • exports如何導出的;
  • module.exports是如何導出變量的,值類型和引用類型導出間的差異;
  • 從內存角度深度分析module.exports和exports又有怎樣的區別和聯系;
  • require的細節,以及模塊的加載執行順序;
  • CommonJS的加載過程;
  • CommonJS規范的本質;

一.什么是模塊化?

在很多開發的情況下,我們都知道要使用模塊化開發,那為什么要使用它呢?

而事實上,模塊化開發最終的目的是將程序劃分成一個個小的結構;

  • 在這個結構中編寫屬于自己的邏輯代碼,有自己的作用域,不會影響到其他的結構;
  • 這個結構可以將自己希望暴露的變量、函數、對象等導出給其結構使用;
  • 也可以通過某種方式,導入另外結構中的變量、函數、對象等;

上面說提到的結構,就是模塊;

按照這種結構劃分開發程序的過程,就是模塊化開發的過程;

二.JavaScript設計缺陷

在網頁開發的早期,由于JavaScript僅僅作為一種腳本語言,只能做一些簡單的表單驗證或動畫實現等,它還是具有很多的缺陷問題的,比如:

  • var定義的變量作用域問題;
  • JavaScript的面向對象并不能像常規面向對象語言一樣使用class;
  • 在早期JavaScript并沒有模塊化的問題,所以也就沒有對應的模塊化解決方案;

但隨著前端和JavaScript的快速發展,JavaScript代碼變得越來越復雜了;

  • ajax的出現,前后端開發分離,意味著后端返回數據后,我們需要通過JavaScript進行前端頁面的渲染;
  • SPA的出現,前端頁面變得更加復雜:包括前端路由、狀態管理等等一系列復雜的需求需要通過JavaScript來實現;
  • 包括Node的實現,JavaScript編寫復雜的后端程序,沒有模塊化是致命的硬傷;

所以,模塊化已經是JavaScript一個非常迫切的需求:

  • 但是JavaScript本身,直到ES6(2015)才推出了自己的模塊化方案;
  • 在此之前,為了讓JavaScript支持模塊化,涌現出了很多不同的模塊化規范:AMD、CMD、CommonJS等;

到此,我們明白了為什么要用模塊化開發?

那如果沒有模塊化會帶來什么問題呢?

三.沒有模塊化的問題

當我們在公司面對一個大型的前端項目時,通常是多人開發的,會把不同的業務邏輯分步在多個文件夾當中。

2.1 沒有模塊化給項目帶來的弊端

假設有兩個人,分別是小豪和小紅在開發一個項目

項目的目錄結構是這樣的

小豪開發的bar.js文件

  1. var name = "小豪"
  2.  
  3. console.log("bar.js----"name); 

小豪開發的baz.js文件

  1. console.log("baz.js----"name); 

小紅開發的foo.js文件

  1. var name = "小紅"
  2.  
  3. console.log("foo.js----"name); 

引用路徑如下:

  1. <body> 
  2.   <script src="./bar.js"></script> 
  3.   <script src="./foo.js"></script> 
  4.   <script src="./baz.js"></script> 
  5. </body> 

最后當我去執行的時候,卻發現執行結果:

當我們看到這個結果,有的小伙伴可能就會驚訝,baz.js文件不是小豪寫的么?為什么會輸出小紅的名字呢?

究其原因,我們才發現,其實JavaScript是沒有模塊化的概念(至少到現在為止還沒有用到ES6規范),換句話說就是每個.js文件并不是一個獨立的模塊,沒有自己的作用域,所以在.js文件中定義的變量,都是可以被其他的地方共享的,所以小豪開發的baz.js里面的name,其實訪問的是小紅重新聲明的。

但是共享也有一點不好就是,項目的其他協作人員也可以隨意的改變它們,顯然這不是我們想要的。

2.2 IIFE解決早期的模塊化問題

所以,隨著前端的發展,模塊化變得必不可少,那么在早期是如何解決的呢?

在早期,因為函數是有自己的作用域,所以可以采用立即函數調用表達式(IIFE),也就是自執行函數,把要供外界使用的變量作為函數的返回結果。 

小豪——bar.js

  1. var moduleBar = (function () { 
  2.   var name = "小豪"
  3.   var age = "18"
  4.  
  5.   console.log("bar.js----"name, age); 
  6.  
  7.   return { 
  8.     name
  9.     age, 
  10.   }; 
  11. })(); 

小豪——baz.js

  1. console.log("baz.js----", moduleBar.name); 
  2. console.log("baz.js----", moduleBar.age); 

小紅——foo.js

  1. (function () { 
  2.   var name = "小紅"
  3.   var age = 20; 
  4.  
  5.   console.log("foo.js----"name, age); 
  6. })(); 

來看一下,解決之后的輸出結果,原調用順序不變;

但是,這又帶來了新的問題:

  • 我必須記得每一個模塊中返回對象的命名,才能在其他模塊使用過程中正確的使用;
  • 代碼寫起來雜亂無章,每個文件中的代碼都需要包裹在一個匿名函數中來編寫;
  • 在沒有合適的規范情況下,每個人、每個公司都可能會任意命名、甚至出現模塊名稱相同的情況;

所以現在急需一個統一的規范,來解決這些缺陷問題,就此CommonJS規范問世了。

三.Node模塊化開發——CommonJS規范

3.1 CommonJS規范特性

CommonJS是一個規范,最初提出來是在瀏覽器以外的地方使用,并且當時被命名為ServerJS,后來為了體現它的廣泛性,修改為CommonJS規范。

  • Node是CommonJS在服務器端一個具有代表性的實現;
  • Browserify是CommonJS在瀏覽器中的一種實現;
  • webpack打包工具具備對CommonJS的支持和轉換;

正是因為Node中對CommonJS進行了支持和實現,所以它具備以下幾個特點;

  • 在Node中每一個js文件都是一個單獨的模塊;
  • 該模塊中,包含CommonJS規范的核心變量: exports、module.exports、require;
  • 使用核心變量,進行模塊化開發;

無疑,模塊化的核心是導出和導入,Node中對其進行了實現:

  • exports和module.exports可以負責對模塊中的內容進行導出;
  • require函數可以幫助我們導入其他模塊(自定義模塊、系統模塊、第三方庫模塊)中的內容;

3.2 CommonJS配合Node模塊化開發假設現在有兩個文件: 

bar.js

  1. const name = "時光屋小豪"
  2. const age = 18; 
  3.  
  4. function sayHello(name) { 
  5.   console.log("hello" + name); 

main.js

  1. console.log(name); 
  2. console.log(age); 

執行node main.js之后,會看到

這是因為在當前main.js模塊內,沒有發現name這個變量;

這點與我們前面看到的明顯不同,因為Node中每個js文件都是一個單獨的模塊。

那么如果要在別的文件內訪問bar.js變量

  • bar.js需要導出自己想要暴露的變量、函數、對象等等;
  • main.js從bar.js引入想用的變量、函數、對象等等;

3.3 exports導出

exports是一個對象,我們可以在這個對象中添加很多個屬性,添加的屬性會導出。 

bar.js文件導出:

  1. const name = "時光屋小豪"
  2. const age = 18; 
  3.  
  4. function sayHello(name) { 
  5.   console.log("hello" + name); 
  6.  
  7. exports.name = name
  8. exports.age = age; 
  9. exports.sayHello = sayHello; 

main.js文件導入:

  1. const bar = require('./bar'); 
  2.  
  3. console.log(bar.name);  // 時光屋小豪 
  4. console.log(bar.age);   // 18 

其中要注意的點:

 main.js中的bar變量等于exports對象;

  1. bar = exports 
  • 所以我們通過bar.xxx來使用導出文件內的變量,比如name,age;
  • require其實是一個函數,返回值是一個對象,值為“導出文件”的exports對象;

3.4 從內存角度分析bar和exports是同一個對象

在Node中,有一個特殊的全局對象,其實exports就是其中之一。

如果在文件內,不再使用exports.xxx的形式導出某個變量的話,其實exports就是一個空對象。

模塊之間的引用關系

  • 當我們在main.js中require導入的時候,它會去自動查找特殊的全局對象exports,并且把require函數的執行結果賦值給bar;
  • bar和exports指向同一個引用(引用地址相同);
  • 如果發現exports上有變量,則會放到bar對象上,正因為這樣我們才能從bar上讀取想用的變量;

為了進一步論證,bar和exports是同一個對象: 

我們加入定時器看看

所以綜上所述,Node中實現CommonJS規范的本質就是對象的引用賦值(淺拷貝本質)。

把exports對象的引用賦值bar對象上。

  • CommonJS規范的本質就是對象的引用賦值

3.5 module.exports又是什么?

但是Node中我們經常使用module.exports導出東西,也會遇到這樣的面試題:

module.exports和exports有什么關系或者區別呢?

3.6 require細節

require本質就是一個函數,可以幫助我們引入一個文件(模塊)中導入的對象。

require的查找規則https://nodejs.org/dist/latest-v14.x/docs/api/modules.html#modules_all_together

3.7 require模塊的加載順序

結論一: 模塊在被第一次引入時,模塊中的js代碼會被運行一次

  1. // aaa.js 
  2. const name = 'coderwhy'
  3.  
  4. console.log("Hello aaa"); 
  5.  
  6. setTimeout(() => { 
  7.   console.log("setTimeout"); 
  8. }, 1000); 
  1. // main.js 
  2. const aaa = require('./aaa'); 

aaa.js中的代碼在引入時會被運行一次

結論二:模塊被多次引入時,會緩存,最終只加載(運行)一次

  1. // main.js 
  2. const aaa = require('./aaa'); 
  3. const bbb = require('./bbb'); 
  1. /// aaa.js 
  2. const ccc = require("./ccc"); 
  1. // bbb.js 
  2. const ccc = require("./ccc"); 
  1. // ccc.js 
  2. console.log('ccc被加載'); 

ccc中的代碼只會運行一次。

為什么只會加載運行一次呢?

  • 每個模塊對象module都有一個屬性:loaded;
  • 為false表示還沒有加載;
  • 為true表示已經加載;

結論三:如果有循環引入,那么加載順序是什么?

如果出現下面模塊的引用關系,那么加載順序是什么呢? 

  • 這個其實是一種數據結構:圖結構;
  • 圖結構在遍歷的過程中,有深度優先搜索(DFS, depth first search)和廣度優先搜索(BFS, breadth first search);
  • Node采用的是深度優先算法:main -> aaa -> ccc -> ddd -> eee ->bbb;

多個模塊的引入關系

四.module.exports

4.1 真正導出的是module.exports

以下是通過維基百科對CommonJS規范的解析:

  • CommonJS中是沒有module.exports的概念的;
  • 但是為了實現模塊的導出,Node中使用的是Module的類,每一個模塊都是Module的一個實例module;
  • 所以在Node中真正用于導出的其實根本不是exports,而是module.exports;
  • exports只是module上的一個對象

但是,為什么exports也可以導出呢?

  • 這是因為module對象的exports屬性是exports對象的一個引用;
  • 等價于module.exports = exports = main中的bar(CommonJS內部封裝);

4.2 module.exports和exports有什么關系或者區別呢?

聯系:module.exports = exports

進一步論證module.exports = exports

  1. // bar.js 
  2. const name = "時光屋小豪"
  3.  
  4. exports.name = name
  5.  
  6. setTimeout(() => { 
  7.   module.exports.name = "哈哈哈"
  8.   console.log("bar.js中1s之后", exports.name); 
  9. }, 1000); 
  1. // main.js 
  2. const bar = require("./bar"); 
  3.  
  4. console.log("main.js", bar.name); 
  5.  
  6. setTimeout((_) => { 
  7.   console.log("main.js中1s之后", bar.name); 
  8. }, 2000); 

在上面代碼中,只要在bar.js中修改exports對象里的屬性,導出的結果都會變,因為即使真正導出的是 module.exports,而module.exports和exports是都是相同的引用地址,改變了其中一個的屬性,另一個也會跟著改變。

注意:真正導出的模塊內容的核心其實是module.exports,只是為了實現CommonJS的規范,剛好module.exports對exports對象使用的是同一個引用而已

區別:有以下兩點

那么如果,代碼這樣修改了:

  • module.exports 也就和 exports沒有任何關系了;
  • 無論exports怎么改,都不會影響最終的導出結果;
  • 因為module.exports = { xxx }這樣的形式,會在堆內存中新開辟出一塊內存空間,會生成一個新的對象,用它取代之前的exports對象的導出
  • 那么也就意味著require導入的對象是新的對象;

圖解module.exports和exports的區別

講完它們兩個的區別,來看下面這兩個例子,看看自己是否真正掌握了module.exports的用法

4.3 關于module.exports的練習題

練習1:導出的變量為值類型

  1. // bar.js 
  2. let name = "時光屋小豪"
  3.  
  4. setTimeout(() => { 
  5.   name = "123123"
  6. }, 1000); 
  7.  
  8. module.exports = { 
  9.   namename
  10.   age: "20"
  11.   sayHello: function (name) { 
  12.     console.log("你好" + name); 
  13.   }, 
  14. }; 
  1. // main.js 
  2. const bar = require("./bar"); 
  3.  
  4. console.log("main.js", bar.name); // main.js 時光屋小豪 
  5.  
  6. setTimeout(() => { 
  7.   console.log("main.js中2s后", bar.name); // main.js中2s后 時光屋小豪 
  8. }, 2000); 

練習2:導出的變量為引用類型

  1. // bar.js 
  2. let info = { 
  3.   name"時光屋小豪"
  4. }; 
  5.  
  6. setTimeout(() => { 
  7.   info.name = "123123"
  8. }, 1000); 
  9.  
  10. module.exports = { 
  11.   info: info, 
  12.   age: "20"
  13.   sayHello: function (name) { 
  14.     console.log("你好" + name); 
  15.   }, 
  16. }; 
  1. // main.js 
  2. const bar = require("./bar"); 
  3.  
  4. console.log("main.js", bar.info.name); // main.js 時光屋小豪 
  5.  
  6. setTimeout(() => { 
  7.   console.log("main.js中2s后", bar.info.name); // main.js中2s后 123123 
  8. }, 2000); 

從main.js輸出結果來看,定時器修改的name變量的結果,并沒有影響main.js中導入的結果。

  • 因為name為值類型,基本類型,一旦定義之后,就把其屬性值,放到了module.exports的內存里(練1)
  • 因為info為引用類型,所以module.exports里存放的是info的引用地址,所以由定時器更改的變量,會影響main.js導入的結果(練2)

五.CommonJS的加載過程

CommonJS模塊加載js文件的過程是運行時加載的,并且是同步的: 

  • 運行時加載意味著是js引擎在執行js代碼的過程中加載模塊;
  • 同步的就意味著一個文件沒有加載結束之前,后面的代碼都不會執行;
  1. const flag = true
  2.  
  3. if (flag) { 
  4.   const foo = require('./foo'); 
  5.   console.log("等require函數執行完畢后,再輸出這句代碼"); 

CommonJS通過module.exports導出的是一個對象:

  • 導出的是一個對象意味著可以將這個對象的引用在其他模塊中賦值給其他變量;
  • 但是最終他們指向的都是同一個對象,那么一個變量修改了對象的屬性,所有的地方都會被修改;

六.CommonJS規范的本質

CommonJS規范的本質就是對象的引用賦值

后續文章

《JavaScript模塊化——ES Module》

在下一篇文章中,

  • 會重點講解ES Module規范的一切;
  • 及CommonJS和ES Module是如何交互的;
  • 類比CommonJS和ES Module優缺點,如何完美的回答這道面試題;

 【編輯推薦】

 

責任編輯:姜華 來源: 前端時光屋
相關推薦

2020-11-06 09:24:09

node

2020-10-12 14:59:31

V8引擎如何執行Jav

2021-08-11 07:54:47

Commonjs

2023-12-07 08:07:47

Node流程代碼

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2010-07-26 12:57:12

OPhone游戲開發

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2015-07-16 09:59:55

PHP Node.js討論

2013-03-11 10:10:03

2019-12-17 11:40:44

Node.js模塊前端

2020-08-31 15:00:17

Node.jsrequire前端

2021-09-26 05:06:04

Node.js模塊機制

2010-07-26 13:55:10

OPhone游戲開發

2020-12-30 11:22:11

Node.js前端模塊

2021-10-16 05:00:32

.js Buffer模塊

2021-08-05 05:46:06

Node.jsInspector工具

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構調度器

2021-07-20 15:20:02

FlatBuffers阿里云Java
點贊
收藏

51CTO技術棧公眾號

精品无码久久久久久久久| 人妻有码中文字幕| 亚洲精品18p| 亚洲九九精品| 色悠悠久久88| 中文字幕乱视频| 日韩不卡视频在线观看| 亚洲欧美日韩久久精品| 久久艹中文字幕| 在线免费a视频| 亚洲精品三级| 久久久精品电影| a级在线观看视频| 国产美女亚洲精品7777| 日韩欧美大尺度| 欧美xxxx吸乳| 国产大片在线免费观看| 岛国精品一区二区| 国产精品主播视频| 国产成人精品a视频一区| 日韩啪啪电影网| 亚洲精品日韩久久久| 青青草原播放器| 唐人社导航福利精品| 亚洲尤物在线视频观看| 亚洲欧美国产一区二区| 三级视频在线播放| 国产91精品欧美| 久久福利资源站| 日韩视频在线永久播放| 日韩精品一区二区三区不卡 | 亚洲精品视频一二三| 国产77777| 国产精品综合一区二区三区| 国产成人精品av在线| 精品一区免费观看| 亚洲国产精品久久久久蝴蝶传媒| 亚洲毛片一区二区| www.啪啪.com| 91精品国产乱码久久久竹菊| 欧美日韩aaaaa| 国产精品igao| 国产综合色在线观看| 精品久久久精品| 免费观看国产精品视频| a视频在线观看免费| 国产精品萝li| 亚洲精品第一区二区三区| 你懂的在线网址| 久久综合狠狠综合| 蜜桃av久久久亚洲精品| 污污视频在线免费看| 成人午夜看片网址| 高清av免费一区中文字幕| av一区二区三| 成人天堂资源www在线| 亚洲精品日韩av| aa视频在线免费观看| 国产激情偷乱视频一区二区三区| 亚洲自拍偷拍福利| 国内精品久久久久久久久久| 国产精品99精品久久免费| 97超碰人人看人人 | 亚洲国产欧美一区二区三区同亚洲| 女人扒开腿免费视频app| 精品国产一区二区三区2021| 欧美一区二区高清| 美女流白浆视频| 国产精品白浆| 日韩高清a**址| 成人午夜剧场视频网站| 欧美艳星介绍134位艳星| 国产亚洲精品久久久| 免费福利视频网站| 国产精品99视频| 欧美高清视频在线播放| 国产无遮无挡120秒| 久久av在线| 国产精品极品美女在线观看免费| 中文字幕一区二区在线视频 | 亚洲bt天天射| 天堂中文在线观看视频| 久久久99久久精品欧美| 中文字幕免费在线不卡| 草美女在线观看| 色婷婷综合久久久中文一区二区 | 免费观看中文字幕| 第四色日韩影片| 色悠悠亚洲一区二区| 午夜福利123| 国产一区福利| 亚洲欧美国产高清va在线播| 中文字幕求饶的少妇| 精品动漫一区| 国产精品亚洲аv天堂网| 国产高清视频免费观看| 97精品久久久久中文字幕 | 在线观看免费网站黄| 亚洲精品国产品国语在线app| 久久精品国产精品亚洲色婷婷| 国产成人77亚洲精品www| 精品久久久久久久久久久院品网| 欧美图片一区二区| 亚洲女同另类| 国产成人av在线| 亚洲av永久无码国产精品久久| 久久久久成人黄色影片| 国产在线观看欧美| 国产精品久久久久久妇女| 精品久久一二三区| gv天堂gv无码男同在线观看| 激情六月综合| 成人精品在线观看| 免费在线看v| 亚洲一二三四在线| 欧美成人手机在线视频| 欧美美乳视频| 91精品国产91久久久久久吃药| 亚洲一区二区天堂| 国产亚洲1区2区3区| 91精品国产91久久久久麻豆 主演| 巨胸喷奶水www久久久免费动漫| 亚洲激情视频在线播放| 欧美日韩在线视频免费| 麻豆一区二区99久久久久| 精品国产乱码一区二区三区四区 | 久久97视频| 国内精品久久久久久久久| 国产精品久久久久毛片| 国产偷国产偷精品高清尤物| 久久久一本二本三本| 日韩精品视频中文字幕| 中文字幕久久精品| 国产精品男女视频| 成人综合在线网站| 日韩不卡视频一区二区| 色8久久久久| 一本一道久久a久久精品逆3p | 日韩欧美一级片| 午夜国产小视频| 久久精品国产网站| 亚洲 日韩 国产第一区| 成人免费毛片嘿嘿连载视频…| 精品一区二区亚洲| 久久久国产高清| 99久久久久久| 自拍日韩亚洲一区在线| 精品国产18久久久久久洗澡| 国模视频一区二区三区| 天堂av在线免费| 欧美日韩人人澡狠狠躁视频| 人妻av一区二区| 日韩一级精品| 九色综合日本| 亚洲成人激情社区| 中文字幕日韩欧美| 在线视频 中文字幕| 国产精品伦一区| 久久精品一二三四| 欧美日一区二区在线观看 | 一个色在线综合| 91九色蝌蚪porny| 日韩一级欧洲| 日韩中文字幕av在线| 国产成人精选| 美女少妇精品视频| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 午夜在线成人av| 国产 欧美 在线| 美腿丝袜亚洲三区| 老司机午夜网站| 国产 日韩 欧美 综合 一区| 45www国产精品网站| 国产裸舞福利在线视频合集| 欧美男生操女生| 久久网一区二区| 在线观看免费高清完整| 99热精品国产| 久久婷婷国产91天堂综合精品| 天天综合亚洲| 国产美女精品在线观看| 亚洲午夜天堂| 神马久久桃色视频| 精品国产伦一区二区三| 精品动漫一区二区| 无码人中文字幕| 国产a视频精品免费观看| 日韩av一二三四区| 99久久综合| 激情小说综合区| 在线不卡一区| 98精品国产高清在线xxxx天堂| 搞黄视频在线观看| 精品不卡在线视频| 波多野结衣mp4| 亚洲一区二区中文在线| 久久精品无码一区| 国产成人免费视频精品含羞草妖精| 国产成人无码精品久久久性色| 99九九热只有国产精品| 精品国产日本| 精品国产亚洲一区二区三区在线 | 9.1麻豆精品| 国产91精品久久久| a视频在线免费看| 亚洲人精品午夜在线观看| 国产哺乳奶水91在线播放| 一道本成人在线| 久久久久亚洲av无码专区| 国产欧美一区二区精品性色 | 欧美精品中文| 91日本在线视频| 色老太综合网| 97视频免费在线看| 中文字幕在线三区| 中文字幕在线看视频国产欧美在线看完整 | 国产日韩专区| 欧美这里只有精品| 偷拍欧美精品| 亚洲图片都市激情| 国产一区二区区别| 国产在线一区二| 91成人一区二区三区| 久久人人88| 欧美性大战久久久久| 高潮久久久久久久久久久久久久 | 六月丁香综合网| 91精品国产色综合久久久蜜香臀| 日韩乱码一区二区三区| 精品日韩中文字幕| 日本三级片在线观看| 亚洲黄色av一区| 丝袜 亚洲 另类 欧美 重口| 国产精品初高中害羞小美女文| 公肉吊粗大爽色翁浪妇视频| 久久精品人人做人人综合| 国产网站无遮挡| 99国产精品国产精品毛片| 亚洲女则毛耸耸bbw| 国产成人无遮挡在线视频| 精品日韩久久久| 男女激情视频一区| 污网站免费在线| 日韩成人午夜精品| 99热手机在线| 青椒成人免费视频| 亚洲天堂网一区| 久久精品久久精品| 粉色视频免费看| 久久国产精品区| 激情在线观看视频| 国产精品99久久久久久久女警 | 欧美激情综合在线| 色欲狠狠躁天天躁无码中文字幕| 久久精品网站免费观看| 国产真实乱人偷精品人妻| 久久久精品国产免大香伊| 精品人妻无码一区| 国产精品理论在线观看| 九九这里只有精品视频| 亚洲欧美日韩国产综合| 午夜69成人做爰视频| 亚洲一区二区视频| 日韩久久精品视频| 色老汉一区二区三区| 最近中文字幕免费观看| 欧美精品第1页| 亚洲AV无码精品国产| 亚洲国产成人精品久久久国产成人一区 | 天然素人一区二区视频| 国产日韩欧美在线看| 精品国产乱码一区二区三区| 国产日韩三区| 亚洲成人黄色av| 精品一区二区三区免费| 欧美熟妇精品一区二区| 91免费在线看| 亚洲 欧美 国产 另类| 亚洲午夜激情av| 久久亚洲精品石原莉奈| 911精品产国品一二三产区| 精品人妻一区二区三区三区四区 | ririsao久久精品一区| 欧美专区福利在线| 亚洲欧美一级| 久久精品magnetxturnbtih| 日韩精品久久久久久久电影99爱| 中文字幕色呦呦| 香蕉久久国产| 日本黄色的视频| 99国内精品久久| 国产美女久久久久久| 天天色天天操综合| 一区二区三区午夜| 日韩av在线天堂网| 精品自拍一区| 欧美一级在线亚洲天堂| 国产精品美女久久久久人| 久久手机视频| 91精品国产视频| 无遮挡又爽又刺激的视频| 国产成人综合视频| 99久久久无码国产精品不卡| 亚洲va欧美va人人爽| 一区二区日韩在线观看| 亚洲精品有码在线| 久久不射影院| 成人国产精品色哟哟| 亚洲丝袜啪啪| r级无码视频在线观看| 韩国精品久久久| xxxx日本黄色| 欧美视频中文字幕在线| a网站在线观看| 日韩中文在线观看| 色老太综合网| 久久综合伊人77777麻豆| 欧美日韩亚洲一区在线观看| 天天看片天天操| 日本一区二区三区dvd视频在线| 中文字幕日韩一级| 日韩美女主播在线视频一区二区三区| 一本一道波多野毛片中文在线 | 日韩有码在线播放| 国产成人免费9x9x人网站视频 | 国产噜噜噜噜噜久久久久久久久 | 亚洲性生活视频| 成人福利av| 中文字幕一区免费在线观看| 一级特级黄色片| 亚洲一区自拍偷拍| 国产富婆一级全黄大片| 久久久精品一区| 自拍偷拍亚洲图片| 在线观看成人一级片| 老司机精品视频导航| 亚洲AV无码成人精品区明星换面 | 欧美激情区在线播放| 精品一区二区三区四区五区| 在线观看成人一级片| 久久99国产精品尤物| jizzjizzjizz国产| 欧美日韩中字一区| www在线播放| 国产精品美女久久久久av超清| 精品久久网站| 超碰在线97免费| 国产精品看片你懂得| 伊人久久一区二区| 久久精品国产亚洲精品| 成人噜噜噜噜| 青青在线视频免费观看| 成人短视频下载| 在线观看亚洲欧美| 亚洲欧美中文另类| 丁香久久综合| 热这里只有精品| 懂色av一区二区在线播放| 国产乡下妇女做爰| 精品亚洲一区二区| 日韩一区二区三区在线免费观看| 清纯唯美一区二区三区| 麻豆免费精品视频| 日韩在线观看视频一区二区| 欧美v国产在线一区二区三区| 99热99re6国产在线播放| 欧美日韩一区二区三区在线视频 | 国产精品久久久久福利| 爽成人777777婷婷| 国产精品嫩草69影院| 精品露脸国产偷人在视频| 国产日韩精品在线看| 成人性生交xxxxx网站| 激情视频一区二区三区| 黑人巨大精品欧美| 欧美性xxxxxx少妇| 四虎影院观看视频在线观看 | 久久精品视频免费看| 国产精品初高中精品久久| 欧美在线综合| 波多野结衣喷潮| 亚洲国产高潮在线观看| 蜜桃精品在线| 9色porny| 欧美国产一区二区| 性一交一乱一色一视频麻豆| 日韩美女视频免费看| 重囗味另类老妇506070| 亚洲国产第一区| 91精品欧美一区二区三区综合在| 岛国av在线网站| 欧美日韩视频免费在线观看| aaa亚洲精品一二三区| 一级特黄色大片| 热99在线视频| 在线网址91| 欧美xxxx老人做受| 欧美理论影院| 996这里只有精品| 国产精品美日韩|