国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

【JS】797- 手寫CommonJS 中的 require函數(shù)

共 2056字,需瀏覽 5分鐘

 ·

2020-12-08 05:57

前言

來自于圣松大佬的文章《手寫CommonJS 中的 require函數(shù)》

什么是 CommonJS ?

node.js 的應(yīng)用采用的commonjs模塊規(guī)范。

每一個(gè)文件就是一個(gè)模塊,擁有自己獨(dú)立的作用域,變量,以及方法等,對其他的模塊都不可見。CommonJS規(guī)范規(guī)定:每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊。這個(gè)變量是一個(gè)對象,它的exports屬性(即module.exports)是對外的接口。加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports屬性。require方法用于加載模塊。

CommonJS模塊的特點(diǎn):

所有代碼都運(yùn)行在模塊作用域,不會(huì)污染全局作用域。

  • 模塊可以多次加載,但是只會(huì)在第一次加載時(shí)運(yùn)行一次,然后運(yùn)行結(jié)果就被緩存了,以后再加載,就直接讀取緩存結(jié)果。要想讓模塊再次運(yùn)行,必須清除緩存。

  • 模塊加載的順序,按照其在代碼中出現(xiàn)的順序。

如何使用?

假設(shè)我們現(xiàn)在有個(gè)a.js文件,我們要在main.js 中使用a.js的一些方法和變量,運(yùn)行環(huán)境是nodejs。這樣我們就可以使用CommonJS規(guī)范,讓a文件導(dǎo)出方法/變量。然后使用require函數(shù)引入變量/函數(shù)。

示例:

//?a.js
module.exports?=?'這是a.js的變量';?//?導(dǎo)出一個(gè)變量/方法/對象都可以
//?main.js

let?str?=?require('./a');?//?這里如果導(dǎo)入a.js,那么他會(huì)自動(dòng)按照預(yù)定順序幫你添加后綴
console.log(str);?//?輸出:'這是a.js的變量'

手寫一個(gè)require函數(shù)

前言

我們現(xiàn)在就開始手寫一個(gè) 精簡版的 require函數(shù),這個(gè)require函數(shù)支持以下功能:

導(dǎo)入一個(gè)符合CommonJS規(guī)范的JS文件。支持自動(dòng)添加文件后綴(暫時(shí)支持JS和JSON文件) 現(xiàn)在就開始吧!

1. 定義一個(gè)req方法

我們先自定義一個(gè)req方法,和全局的require函數(shù)隔離開。這個(gè)req方法,接受一個(gè)名為ID的參數(shù),也就是要加載的文件路徑。

//?main.js

function?req(id){}

let?a?=?req('./a')
console.log(a)

2. 新建一個(gè)Module 類

新建一個(gè)module類,這個(gè)module將會(huì)處理文件加載的全過程。

function?Module(id)?{
????this.id?=?id;?//?當(dāng)前模塊的文件路徑
????this.exports?=?{}?//?當(dāng)前模塊導(dǎo)出的結(jié)果,默認(rèn)為空
}

3. 獲取文件絕對路徑

剛才我們介紹到,require 函數(shù)支持傳入一個(gè)路徑。這個(gè)路徑可以是相對路徑,也可以是絕對路徑,也可以不寫文件后綴名。

我們在Module類上添加一個(gè)叫做“_resolveFilename”的方法,用于解析用戶傳進(jìn)去的文件路徑,獲取一個(gè)絕對路徑。

//?將一個(gè)相對路徑?轉(zhuǎn)化成絕對路徑
Module._resolveFilename?=?function?(id)?{}

繼續(xù)添加一個(gè) “extennsions” 的屬性,這個(gè)屬性是一個(gè)對象。key是文件擴(kuò)展名,value就是擴(kuò)展名對應(yīng)的不同文件的處理方法。

我們通過debugger nodejs require源碼看到,原生的require函數(shù)支持四種類型文件:

js文件
json文件
node文件
mjs文件

由于篇幅,這里我們就只支持兩個(gè)擴(kuò)展名:.js 和.json。

我們分別在extensions對象上,添加兩個(gè)屬性,兩個(gè)屬性的值分別都是一個(gè)函數(shù)。方便不同文件類型分類處理。

//?main.js?
Module.extensions['.js']?=?function?(module)?{}
Module.extensions['.json']?=?function?(module)?{}

接著,我們導(dǎo)入nodejs原生的“path”模塊和“fs”模塊,方便我們獲取文件絕對路徑和文件操作。

我們處理一下 Module._resolveFilename 這個(gè)方法,讓他可以正常工作。

Module._resolveFilename?=?function?(id)?{
????//?將相對路徑轉(zhuǎn)化成絕對路徑
????let?absPath?=?path.resolve(id);

????//??先判斷文件是否存在如果存在了就不要增加了?
????if(fs.existsSync(absPath)){
????????return?absPath;
????}
????//?去嘗試添加文件后綴?.js?.json?
????let?extenisons?=?Object.keys(Module.extensions);
????for?(let?i?=?0;?i?????????let?ext?=?extenisons[i];
????????//?判斷路徑是否存在
????????let?currentPath?=?absPath?+?ext;?//?獲取拼接后的路徑
????????let?exits?=?fs.existsSync(currentPath);?//?判斷是否存在
????????if(exits){
????????????return?currentPath
????????}
????}
????throw?new?Error('文件不存在')
}

在這里,我們支持接受一個(gè)名id的參數(shù),這個(gè)參數(shù)將是用戶傳來的路徑。

首先我們先使用 path.resolve()獲取到文件絕對路徑。接著用 fs.existsSync 判斷文件是否存在。如果沒有存在,我們就嘗試添加文件后綴。

我們會(huì)去遍歷現(xiàn)在支持的文件擴(kuò)展對象,嘗試拼接路徑。如果拼接后文件存在,返回文件路徑。不存在拋出異常。

這樣我們在req方法內(nèi),就可以獲取到完整的文件路徑:

function?req(id){
????//?通過相對路徑獲取絕對路徑
????let?filename?=?Module._resolveFilename(id);
}

4. 加載模塊 —— JS的實(shí)現(xiàn)

這里就是我們的重頭戲,加載common.js模塊。

首先 new 一個(gè)Module實(shí)例。傳入一個(gè)文件路徑,然后返回一個(gè)新的module實(shí)例。

接著定義一個(gè) tryModuleLoad 函數(shù),傳入我們新建立的module實(shí)例。

function?tryModuleLoad(module)?{?//?嘗試加載模塊
???let?ext?=?path.extname(module.id);
???Module.extensions[ext](module)
}
function?req(id){
????//?通過相對路徑獲取絕對路徑
????let?filename?=?Module._resolveFilename(id);
????let?module?=?new?Module(filename);?//?new?一個(gè)新模塊
????tryModuleLoad(module);?
}

tryModuleLoad 函數(shù) 獲取到module后,會(huì)使用 path.extname 函數(shù)獲取文件擴(kuò)展名,接著按照不同擴(kuò)展名交給不同的函數(shù)分別處理。

處理js文件加載.

第一步,傳入一個(gè)module對象實(shí)例。

使用module對象中的id屬性,獲取文件絕對路徑。拿到文件絕對路徑后,使用fs模塊讀取文件內(nèi)容。讀取編碼是utf8。

Module.extensions['.js'] = function (module) { // 1) 讀取 let script = fs.readFileSync(module.id, 'utf8'); }

第二步,偽造一個(gè)自執(zhí)行函數(shù)。

這里先新建一個(gè)wrapper 數(shù)組。數(shù)組的第0項(xiàng)是自執(zhí)行函數(shù)開頭,最后一項(xiàng)是結(jié)尾。

let?wrapper?=?[
????'(function?(exports,?require,?module,?__dirname,?__filename)?{\r\n',
????'\r\n})'
];

這個(gè)自執(zhí)行函數(shù)需要傳入5個(gè)參數(shù):exports對象,require函數(shù),module對象,dirname路徑,fileame文件名。

我們將獲取到的要加載文件的內(nèi)容,和自執(zhí)行函數(shù)模版拼接,組裝成一個(gè)完整的可執(zhí)行js文本:

Module.extensions['.js']?=?function?(module)?{
????//?1)?讀取
????let?script?=?fs.readFileSync(module.id,?'utf8');
????//?2)?內(nèi)容拼接
????let?content?=?wrapper[0]?+?script?+?wrapper[1];
}

第三步:創(chuàng)建沙箱執(zhí)行環(huán)境

這里我們就要用到nodejs中的 “vm” 模塊了。這個(gè)模塊可以創(chuàng)建一個(gè)nodejs的虛擬機(jī),提供一個(gè)獨(dú)立的沙箱運(yùn)行環(huán)境。

具體介紹可以看:vm模塊的官方介紹

我們使用vm模塊的 runInThisContext函數(shù),他可以建立一個(gè)有全局global屬性的沙盒。用法是傳入一個(gè)js文本內(nèi)容。我們將剛才拼接的文本內(nèi)容傳入,返回一個(gè)fn函數(shù):

const?vm?=?require('vm');

Module.extensions['.js']?=?function?(module)?{
????//?1)?讀取
????let?script?=?fs.readFileSync(module.id,?'utf8');
????//?2)?內(nèi)容拼接
????let?content?=?wrapper[0]?+?script?+?wrapper[1];
????//?3)創(chuàng)建沙盒環(huán)境,返回js函數(shù)
????let?fn?=?vm.runInThisContext(content);?
}

第四步:執(zhí)行沙箱環(huán)境,獲得導(dǎo)出對象。

因?yàn)槲覀兩厦嬗行枰募夸浡窂剑晕覀兿全@取一下目錄路徑。這里使用path模塊的dirname 方法。

接著我們使用call方法,傳入?yún)?shù),立即執(zhí)行。

call 方法的第一個(gè)參數(shù)是函數(shù)內(nèi)部的this對象,其余參數(shù)都是函數(shù)所需要的參數(shù)。

Module.extensions['.js']?=?function?(module)?{
????//?1)?讀取
????let?script?=?fs.readFileSync(module.id,?'utf8');
????//?2)?增加函數(shù)?還是一個(gè)字符串
????let?content?=?wrapper[0]?+?script?+?wrapper[1];
????//?3)?讓這個(gè)字符串函數(shù)執(zhí)行?(node里api)
????let?fn?=?vm.runInThisContext(content);?//?這里就會(huì)返回一個(gè)js函數(shù)
????let?__dirname?=?path.dirname(module.id);
????//?讓函數(shù)執(zhí)行
????fn.call(module.exports,?module.exports,?req,?module,?__dirname,?module.id)
}

這樣,我們傳入module對象,接著內(nèi)部會(huì)將要導(dǎo)出的值掛在到module的export屬性上。

第五步:返回導(dǎo)出值

由于我們的處理函數(shù)是非純函數(shù),所以直接返回module實(shí)例的export對象就ok。

function?req(id){?//?沒有異步的api方法
????//?通過相對路徑獲取絕對路徑
????let?filename?=?Module._resolveFilename(id);
????tryModuleLoad(module);?//?module.exports?=?{}
????return?module.exports;
}

這樣,我們就實(shí)現(xiàn)了一個(gè)簡單的require函數(shù)。

let?str?=?req('./a');
//?str?=?req('./a');
console.log(str);
//?a.js
module.exports?=?"這是a.js文件"

5. 加載模塊 —— JSON文件的實(shí)現(xiàn)

json文件的實(shí)現(xiàn)就比較簡單了。使用fs讀取json文件內(nèi)容,然后用JSON.parse轉(zhuǎn)為js對象就ok。

Module.extensions['.json']?=?function?(module)?{
????let?script?=?fs.readFileSync(module.id,?'utf8');
????module.exports?=?JSON.parse(script)
}

6. 優(yōu)化

文章初,我們有寫:commonjs會(huì)將我們要加載的模塊緩存。等我們再次讀取時(shí),就去緩存中讀取我們的模塊,而不是再次調(diào)用fs和vm模塊獲得導(dǎo)出內(nèi)容。

我們在Module對象上新建一個(gè)_cache屬性。這個(gè)屬性是一個(gè)對象,key是文件名,value是文件導(dǎo)出的內(nèi)容緩存。

在我們加載模塊時(shí),首先先去_cache屬性上找有沒有緩存過。如果有,直接返回緩存內(nèi)容。如果沒有,嘗試獲取導(dǎo)出內(nèi)容,并掛在到緩存對象上。

Module._cache?=?{}

function?req(id){
????//?通過相對路徑獲取絕對路徑
????let?filename?=?Module._resolveFilename(id);
????let?cache?=?Module._cache[filename];

????if(cache){?//?如果有緩存,直接將模塊的結(jié)果返回
????????return?cache.exports
????}
????let?module?=?new?Module(filename);?//?創(chuàng)建了一個(gè)模塊實(shí)例
????Module._cache[filename]?=?module?//?輸入進(jìn)緩存對象內(nèi)

????//?加載相關(guān)模塊?(就是給這個(gè)模塊的exports賦值)
????tryModuleLoad(module);?//?module.exports?=?{}
????return?module.exports;
}

完整實(shí)現(xiàn)

const?path?=?require('path');
const?fs?=?require('fs');
const?vm?=?require('vm');

function?Module(id)?{
????this.id?=?id;?//?當(dāng)前模塊的id名
????this.exports?=?{};?//?默認(rèn)是空對象?導(dǎo)出的結(jié)果
}
Module.extensions =?{};

//?如果文件是js?的話?后期用這個(gè)函數(shù)來處理
Module.extensions['.js']?=?function?(module)?{
????//?1)?讀取
????let?script?=?fs.readFileSync(module.id,?'utf8');
????//?2)?增加函數(shù)?還是一個(gè)字符串
????let?content?=?wrapper[0]?+?script?+?wrapper[1];
????//?3)?讓這個(gè)字符串函數(shù)執(zhí)行?(node里api)
????let?fn?=?vm.runInThisContext(content);?//?這里就會(huì)返回一個(gè)js函數(shù)
????let?__dirname?=?path.dirname(module.id);
????//?讓函數(shù)執(zhí)行
????fn.call(module.exports,?module.exports,?req,?module,?__dirname,?module.id)
}

//?如果文件是json
Module.extensions['.json']?=?function?(module)?{
????let?script?=?fs.readFileSync(module.id,?'utf8');
????module.exports?=?JSON.parse(script)
}

//?將一個(gè)相對路徑?轉(zhuǎn)化成絕對路徑
Module._resolveFilename?=?function?(id)?{
????//?將相對路徑轉(zhuǎn)化成絕對路徑
????let?absPath?=?path.resolve(id);

????//??先判斷文件是否存在如果存在
????if(fs.existsSync(absPath)){
????????return?absPath;
????}
????//?去嘗試添加文件后綴?.js?.json?
????let?extenisons?=?Object.keys(Module.extensions);
????for?(let?i?=?0;?i?????????let?ext?=?extenisons[i];
????????//?判斷路徑是否存在
????????let?currentPath?=?absPath?+?ext;?//?獲取拼接后的路徑
????????let?exits?=?fs.existsSync(currentPath);?//?判斷是否存在
????????if(exits){
????????????return?currentPath
????????}
????}
????throw?new?Error('文件不存在')
}

let?wrapper?=?[
????'(function?(exports,?require,?module,?__dirname,?__filename)?{\r\n',
????'\r\n})'
];
//?模塊獨(dú)立?相互沒關(guān)系

function?tryModuleLoad(module)?{?//?嘗試加載模塊
???let?ext?=??path.extname(module.id);
???Module.extensions[ext](module)
}

Module._cache?=?{}

function?req(id){?//?沒有異步的api方法
????//?通過相對路徑獲取絕對路徑
????let?filename?=?Module._resolveFilename(id);
????let?cache?=?Module._cache[filename];
????if(cache){?//?如果有緩存直接將模塊的結(jié)果返回
????????return?cache.exports
????}
????let?module?=?new?Module(filename);?//?創(chuàng)建了一個(gè)模塊
????Module._cache[filename]?=?module;
????//?加載相關(guān)模塊?(就是給這個(gè)模塊的exports賦值)
????tryModuleLoad(module);?//?module.exports?=?{}
????return?module.exports;
}

let?str?=?req('./a');
console.log(str);

結(jié)束總結(jié)

這樣,我們就手寫實(shí)現(xiàn)了一個(gè)精簡版的CommonJS require函數(shù)。

讓我們回顧一下,require的實(shí)現(xiàn)流程:

  • 拿到要加載的文件絕對路徑。沒有后綴的嘗試添加后綴
  • 嘗試從緩存中讀取導(dǎo)出內(nèi)容。如果緩存有,返回緩存內(nèi)容。沒有,下一步處理
  • 新建一個(gè)模塊實(shí)例,并輸入進(jìn)緩存對象
  • 嘗試加載模塊
  • 根據(jù)文件類型,分類處理
  • 如果是js文件,讀取到文件內(nèi)容,拼接自執(zhí)行函數(shù)文本,用vm模塊創(chuàng)建沙箱實(shí)例加載函數(shù)文本,獲得導(dǎo)出內(nèi)容,返回內(nèi)容
  • 如果是json文件,讀取到文件內(nèi)容,用JSON.parse 函數(shù)轉(zhuǎn)成js對象,返回內(nèi)容 獲取導(dǎo)出返回值。

1. JavaScript 重溫系列(22篇全)
2. ECMAScript 重溫系列(10篇全)
3. JavaScript設(shè)計(jì)模式 重溫系列(9篇全)
4.?正則 / 框架 / 算法等 重溫系列(16篇全)
5.?Webpack4 入門(上)||?Webpack4 入門(下)
6.?MobX 入門(上)?||??MobX 入門(下)
7. 80+篇原創(chuàng)系列匯總

回復(fù)“加群”與大佬們一起交流學(xué)習(xí)~

點(diǎn)擊“閱讀原文”查看 80+ 篇原創(chuàng)文章

瀏覽 71
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 夜夜撸天天日| 99免费在线观看视频| 色色三区| 嘿嘿av| 抠骚逼| 97中文字幕| 大香蕉在线精品视频| 无码三| 国产成人免费在线视频| 黑人在线视频| 大香蕉AV电影| 黄色视频网站日本| 亚洲AV成人片色在线观看麻豆| 最新一区二区三区| 久久国产精品久久| 夜夜夜撸| 日韩成人视频在线| 天天躁夜夜躁狠狠躁AV| 黑人大肉棒| 蜜桃一区| 亚洲无码伊人| 丁香花在线小说免费阅读| 日韩精品| 8050午夜网| 亚洲日韩第一页| 日本一区二区视频| 天天操天天操天天| 狠狠av| 北条麻妃AV在线播放| 色五月欧美| 精品国产999久久久免费| 少妇搡BBBB搡BBB搡打电话| 麻豆传媒猫爪| 亚洲欧美日韩在线| 天天日天天干天天射| 老熟女视频| 天天干天天拍| 国产在线观看av| 岛国无码破解AV在线播放| 黄片视频国产| 人人操超碰在线| 国产成人精品一区二区三区视频 | 黄色一级电影网| 北条麻妃精品视频| 美女裸体视频网站| WWW.豆花视频精品| 一级黄色视频日逼片| 久久狠| 亚洲中文在线视频| 狠狠操网| 无码电影网| 熟女人妻人蜜桃视频| 欧美成人a| 色五月网| 国产午夜在线视频| 天堂在线无码| 麻豆激情| 一级av在线| 日本天堂在线| 亚洲无码观看视频| 国产激情啪啪| 成人无码区免费A片久久| 久久蝌蚪窝| 中日韩特黄A片免费视频| 安徽妇搡BBBB搡BBBB按摩| 黄片日逼视频| 亚洲有码中文字幕| 影音先锋在线视频观看| 97超碰资源站| 国产精品宾馆在线| 欧美A黄片| 亚洲a电影| 国产做爰XXXⅩ久久久骚妇| 69色色| 日韩色情电影| 国产理论在线| 国产亚洲99久久精品熟女| 天天干天天日天天干天天日 | 亚洲欧美日本在线| 欧美操美女| 亚洲福利社| 国产又粗又长又硬又大毛苴茸图片 | 三级网址在线观看| 天天干,夜夜操| 黄色A片网站| 欧美性爱综合网| 国产性爱AV| 97超碰大香蕉| 狠狠地操| 欧美日韩在线观看视频| 看操b视频| 色妞视频精品一区| 婷婷深爱五月丁香网| 亚洲无码黄色电影| 少妇在线视频| 综合激情av| 久久久无码AV| 亚洲中文免费观看| 黄色A级视频| 国产精品扒开腿做爽爽爽视频 | 午夜免费无码| 日韩欧美在线中文字幕| 免费看黄色的视频| 婷婷深爱五月| 青娱乐欧美| 日韩成人在线观看视频| 亚洲av在线免费观看| 边摸边操| 国产又粗又长| 日韩欧美亚洲| 国产A级成人婬片1976| 黄色一级爱爱| 安微妇搡BBBB搡BBBB日| 欧美日韩肏屄视频| 日韩精品小电影| 夫妻-ThePorn| 欧美另类综合| 18禁黄色免费网站| 国产精品卡一卡二| 一本道高清无码视频| 无码人妻一区二区三区精品不付款 | 国产v欧美| 大香蕉1024| 国产一级婬片A片免费无成人黑豆| www.91在线| 日逼天堂| 日本欧美在线| 人妻人玩| 亚洲国产精品成人网站| 亚洲日韩成人AV| 苍井空视频| 久久久波多野结衣| 久久牛牛| 国产一级a毛一级a做免费图片 | 久久精品国产亚洲AV麻豆痴男| 一级黄色视频片| 天天色伊人| 国产情趣网站| 欧美亚洲成人精品| 国产g蝌蚪| 成人亚洲性情网站www在线| 在线成人网站| 欧美日韩国产在线观看| 2015中文字幕黄色视频| 欧美A一| 成人中文字幕在线视频| 国产91在线一区| 亚洲无码视频看看| 国产91网| 亚洲三级片在线视频| 牛牛在线视频| 成人AV免费| 翔田千里在线一区二区三区| 国产视频精品一区二区三区| 亚洲天堂大香蕉| 日韩在线观看视频网站| 一区二区免费看| 国产精品久久久久毛片SUV| 国产精品123区| 欧美日综合| 台湾成人在线视频| 久久九九电影| 先锋影音一区二区| 91狠狠色丁香婷婷综合久久| 蜜臀色欲AV无码人妻| 色青草影院久久综合| 97资源视频| av天堂中文| 黄色免费在线网站| 人人色视频| 色婷婷一区| 亚洲黄色片| 大香蕉美女视频| 国产欧美综合一区二区| 日韩乱伦中文字幕| 久久无码高清视频| 国产在线小视频| 日韩一级片子| 久久精品视频免费看| 欧美天天性爱| 天堂国产| 欧美a在线| 成人在线91| 91在线无码精品入口电车| 亚洲五月丁香婷婷| 蜜臀av一区二区| 五月丁香中文字幕| 激情麻豆论坛| 国产一级做a爱免费视频| 亚洲尤物| 中文字幕视频网站| 天天干天天操天天| 蜜桃视频网站在线观看| 亚洲天堂成人在线| 欧美黄色成人网站| 欧美青青草| 成人三级黄色| 亚洲无码在线精品| 精品久久一区二区| jiujiuav| 欧美洲成人网站| 精品久久久久久亚洲| 午夜天堂精品久久久久9| 熟妇人妻中文AV无码| 激情五月综合| 亚洲vs无码蜜桃少妇| 91视频高清无码| 婷婷五月一区| 久久大香| 成人影片亚洲| 亚洲A片电影| 亚洲老鸭窝| 精品蜜桃一区二区三区| 国产免费成人在线观看| 九色PORNY国产成人| 成全在线观看高清的| 午夜av无码| 色天堂视频在线观看| 国产黄色片在线播放| va在线| 日本一区二区不卡| 久久人妻视频| 日韩成人免费在线观看| 波多野成人无码精品视频| 国产777| 日欧一级片| 久久永久免费视频| 一区二区三区无码在线| 成人AV电影在线观看| 人妻无码中文字幕蜜桃| 亚洲精品一区二区三区新线路| 久久成人影音先锋| 欧美日韩不卡视频| 岛国av免费| 色狠狠网| 婷婷精品免费| 国产深夜福利| 丝袜内射| 成人小说亚洲一区二区三区| 2025av天堂| 欧美一级A片高清免费播放| 亲子乱婬-一级A片| 人妻福利导航| 中文字幕在线观看视频www| 日本色情网| 人人干国产| 91麻豆精品传媒国产| 日韩另类| 国产精品日韩高清北条麻衣| 高清无码在线观看免费| 欧美人妻视频在线| 中文字幕免费在线观看视频| 欧美日韩中文字幕| 国产欧美综合视频| 国产乱论视频| 天天人人精品| 91丨豆花丨成人熟女| 久久熟妇| a免费视频| 六月婷婷在线观看| NP玩烂了公用爽灌满视频播放| 中文字幕日韩在线观看| 西西人体大胆ww4444图片| 麻豆精品传媒2021md| 17c精品麻豆一区二区免费 | 日产无码久久久久久| 国产欧美一区二区三区视频| 亚洲群交视频| 最新中文字幕在线视频| 黄网在线观看视频| 特级西西444WWW无码视频兔费看 | 天堂网av2014| 91小仙女jK白丝袜呻吟| 国产三级高清无码| 亚洲AV播放| 伊人色五月| 日本亚洲视频| 日韩欧美视频在线| 色999网址| 福利一区在线观看| 日韩无码AV电影| 青草成人在线| 91探花秘在线播放偷拍| 黄片一区| 亚洲精品在线视频观看| 欧美日韩一级视频| 成人无码高清在线观看| 波多野结衣亚洲视频| 99这里只有精品| 成人精品秘久久久按摩下载| 美女自慰网站在线观看| 操美女一区二区| www.日批| 黄色在线| 免费高清无码| 亚洲毛片在线观看| 久久久久中文字幕| 亚洲成人性爱网站| 伊人五月婷婷| 最新黄色av| 91无码人妻一区二区三区| 久久婷婷五月丁香| 91人妻无码成人精品一区二区| 天天摸天天肏| 成人午夜在线| 久久夜色精品噜噜亚洲AV| 亚洲少妇免费| 免费无码国产在线53| 俺去也在线播放| 欧美黄色片在线观看| 色大香蕉伊人| 人人色视频| 最新久欠一区二区免费看| 影音先锋麻豆| 搡BBB搡BBBB搡BBBB| AV天堂资源| 少妇搡BBBB搡BBB搡澳门| 91亚洲一区| 国产亚洲精品久久久久动| 夜夜操操| 亚洲精品一级二级三级| 国产一区二区三区成人| 水果派中文解说AⅤ| gay成人在线观看| 蜜臀av在线免费观看| 欧美福利导航| 91无码人妻精品1国产四虎| 日韩成人无码AV| 我要操逼网| 亚洲口爆| 精品成人av| 高清国产mv在线观看| 二级黄色毛片| 黄色日逼片| 闺蜜AV| 国产一| AV口爆| 97视频在线观看免费| 俺去啦俺也去| 性爱视频无码| 综合激情视频| 无码人妻精品一区二区三区99仓| 国产精品51麻豆cm传媒| 丁香五月欧美激情| 亚洲另类av| www在线播放| 国产精品一二三区| 91人妻人人澡人人添人人爽| 波多野结衣视频网站| 黄色无码在线观看| 桃色av| 日日搔av一区二区三区| 一本一道久久综合狠狠躁牛牛影视 | 人妻少妇精品视频| 中文字幕视频免费| 狼友在线视频| 第一页在线观看| 麻豆三级片| 精品人妻无码一区二区三区四川人 | 三级片韩国AV| 在线内射| 做爱视频毛片人乱| 中文在线高清字幕| 偷拍内射| 91国产爽黄在线| 成年人黄色视频| 国产精品久久久久久久久久王安宇| 日本国产在线视频| 大鸡巴导航| 国产网站免费| 国产福利视频| 91在线综合| 亚洲AV无码成人精品区东京热| 日本欧美在线观看| 黄页免费无码| 婷婷在线观看视频| 特一级A片| 99re在线观看| 亚洲男人的天堂网| 无码中文字幕高清| 老婆中文字幕乱码中文乱码| 久草视频免费在线播放| 日韩精品电影| 国产av网| 操逼黄色视频| www.豆花视频成人版| 亚洲AV无码乱码AV| 一区二区三区无码免费| 人成视频免费观看| 免费A级毛片在线播放不收费| xxxxxbbbbb| 亚洲黄色在线观看| 欧美精品一卡| 中文字幕精品久久久久人妻红杏Ⅰ | 日本三级片在线| 青青草原网址| 丰满的人妻一区二区10| 98国产精品| 天堂中文在线播放| 色婷婷在线播放| 成人久久久久| 99在线精品视频在线观看| 国产一区二区三区免费视频| 91吴梦梦无码一区二区| 操逼在线观看| 大香久久| A免费观看| 青青草97国产精品麻豆| 黄色在线视频观看| 二区AV| 日本爱爱视频免费| 精品一区二区三区四区五区六区七区八区九区| 午夜精品秘一区二区三区| 久久久精品久久久| 精品乱子伦一区二区三区毛| 亚洲国产精品久久人人爱| 2019天天操| 99精品在线观看| 欧美成人精品在线| 国产91嫩草乱婬A片2蜜臀| 国产无遮挡又黄又爽免费网站| 四虎操逼| 亚洲人妻电影一区| 一区二区三区在线免费观看| 婷婷五月天激情电影| 国产激情欧洲在线观看一区二区三区 | 黄片免费视频在线观看| 玖玖爱这里只有精品| 国产激情在线| 一级特黄AA片| 在线无码视频观看| 亚洲小电影| 亚洲国产天堂| 亚洲av资源在线观看| 欧美一区二区三区视频| 成人AV十八亚洲二区| 亚洲日韩成人AV| 国内精品无码| 人妻无码一区二区| 日本大香蕉在线视频| 中日韩欧美一级A片免费| 亚洲国产成人91精品| 国产欧美在线免费观看| 猫咪成人网站| 夜夜爽妓女77777毛片A片| 巨乳一区二区三区| 日韩无码影院| 水果派中文解说AⅤ| 怡春院首页| 97国产| 欧美一级性爱视频| 俺也要操| 大吊无码| 国产网站在线| 男人天堂综合网| 亚洲无吗在线播放| 日韩中文字幕av| 日韩精品久久久| 爱爱亚洲| 国产视频一区二区三区四区| 性爱无码网站| 国内精品久久久久久久久久变脸| 成人av网站在线播放| 91aaa在线观看| 色五月婷婷久久| 噜噜色av| 91久久国产综合久久| 手机在线观看av| 天天干欧美| 免费人成年激情视频在线观看| 蜜桃91视频| WWW久久久| 国产精品AV一区| 无码一二区| 狼友精品| 国产女人18毛片水真多成人如厕| 人人澡人人爽欧一区| 欧美成人小视频| 无码一区二区三区在线观看| 一本之道高清数码大全| aaa在线免费视频| 青青青视频在线| 日韩欧美国产精品综合嫩V| 日韩性生活| www.亚洲无码| 青娱乐毛片| 中文字幕日本无码| 男人天堂亚洲| 成人高清无码| 99久久久久久| 刘玥一区二区三区| 玖玖色资源| 午夜操人妻| 91在线无码精品秘入口动作| 国产精品不卡在线观看| 色哟哟――国产精品| 无码日韩AV| 欧美亚洲| 特级西西人体WWWWW| 中文字幕AV网| 亚洲一区免费| 18禁免费网站| 91天堂网| 人成免费在线视频| 中文字幕在线高清| 人人操人人看人人摸| 日韩高清无码中文字幕| 无码av一区| 亚洲AV成人电影| 巨爆乳肉感一区二区三区视频| 中文字幕在线字幕中文乱码区别| 美女网站在线观看| 成人免费黄色视频| 天天日AV| 粉嫩一区二区三区四区| 国产亚洲色婷婷久久99精品91| 欧美成人手机在线| 操逼逼网站| 人妻黄色| 亚洲欧美日韩性爱| 成人在线视频免费观看| 成人做爰黄AAA片免费直播岛国| 欧美老女人性爱视频| 天天干天天干天天操| 操逼第二页| 日韩A级片| 人人妻人人爽人人精品| 操逼电影网站| 中文字幕在线成人| 国产精品色色色| 日韩欧美不卡色不卡| www.水蜜桃| 性爱av在线| 天天躁夜夜躁狠狠躁AV| 亚洲毛片亚洲毛片亚洲毛片| 丁香五月天婷婷久久| 黄色成人在线观看| 今天成全在线观看高清| 日韩aaaaaa| 十八女人高潮A片免费| 国产一级特黄大片| 久久久免费黄色视频| 国产av一区二区三区| 这里都是精品| 国产免费AV网站| 无码一级二级| 亚洲免费黄色片| 亚洲天堂女人| 天天射夜夜骑| 亚洲精品91| 欧美综合国产| 色色色五月| 97少妇| 就要干就要操| 高H网站| 亚洲中文视频免费| 手机看片午夜福利网| 日韩视频在线观看免费| 一本道在线无码| 精品亚洲无码视频| 中文字幕人妻在线中文乱码怎么解决| 一区二区免费在线观看| 日本久久精品| 操逼逼一区二区三区| 91黄色片| 成人天堂| 成人做爰100部免费网站| 欧美日本中文字幕| 蜜桃av无码一区三区| 五月婷婷五月丁香| 中文字幕精品一区久久久久| 天天色色婷婷| 丁香五香天堂网| 日韩人妻无码一区二区三区99 | 久久视频99| 91精品国产综合久久久蜜臀图片 | www.操操网| 天天干天天干天天| 国产精品一级片| 国产成人精品视频免费| 99国产精品99久久久久久粉嫩| 亚洲A片V一区二区三区| 就要干就要操| 91妻人人澡人人爽人人精品| 欧一美一婬一伦一区二区三区自慰国| 特级特黄A级高潮播放| 日本乱伦电影中文字幕| 精品无码在线观看| 殴美老妇BBBBBBBBB| 91大鸡巴| 四虎高清无码| 伊人77| 亚洲a片在线观看| 免费无码一级A片大黄在线观看| 人人看,人人摸| 蜜桃91在线| 亚洲无码一区二区三| 麻妃无码| 肏逼网站在线观看| 成人aV免费观看| 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲香蕉| 精品久久久久久久久久久| 大黄网站在线观看| 激情五月婷婷丁香| 可以免费看的AV| 成人小说视频| 偷拍久久久| 日韩在线成人中文字幕亚洲| 爱爱日韩| 亚洲欧美视频| 久久九九国产精品怡红院| 国产青娱乐在线视频| 欧美视频色| 欧美国产成人在线| 午夜无码鲁丝午夜免费| 国产激情在线| 中文字幕免费在线观看| 亚洲天堂自拍| 人人操人人操人人| 国产精品久久久久永久免费看| 欧美自拍视频在线观看| 日韩A电影| 亚洲成人日韩| 夜夜操天天操| 国产91福利| 中文字幕不卡在线| 九九福利视频| av网站免费观看| 亚洲成人观看| 四虎在线观看一区网址| 18岁成人毛片| 色呦呦在线| 亚洲黄片大全| 日韩婬乱片A片AAA真人视频| 国产精品乱子伦一区二区三区视频 | 婷婷丁香一区二区三区| 免费无码又爽又黄又刺激网站| 理论片无码| 激情综合网五月| 大奶无码| 国产精品婷婷久久久| 偷拍-91爱爱| 成人免费黄色视频| 国产乱子伦-区二区三区熟睡91| 男女啪啪国产| 久久久久性| 人人妻人人超| 日韩成年视频| 四虎AV在线| 欧美在线视频一区| 蜜臀精品一区二区三区| 日逼视频免费| 操逼在线播放| www.蜜桃视频| 九色PORNY9l原创自拍| 久久国产成人| 91夫妻视频| 日本AV在线播放| 中文视频在线观看| 69av在线播放| 黃色A片一级一级一级久别的草原| 91免费在线| 欧美日韩在线播放| 一区二区三区四区在线| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 五月天激情综合网| 99热免费观看| 五月婷在线| 婷婷视频在线| 日韩av免费| 亚洲高清在线视频| 日韩成人电影| 日本女优婷婷青青草原| 嫩草视频在线观看免费网站| 天堂色| 色欲成人AV| 国产精品欧美激情| 无码综合| 日韩在线女优天天干| 96久久| 操鸡巴网站| 日韩操逼电影| 蜜桃视频在线入口www| 中文字幕日韩视频| 午夜免费视频1000| 国产欧美一区二区三区在线看蜜臀 | 久久理论电影| 国精产品九九国精产品| 久久2| 成人动漫| 12——13女人毛片毛片| 国产成人黄色| 不卡视频一区二区| 亚洲精品国产精品国自产曰本| 女人久久久| 成人性爱在线观看| 国产欧美在线观看| 久久夜色视频网| 国产逼逼| 日本色情在线| 亚洲.www| 国产毛片毛片| 婷婷精品国产一区二区三区日韩| 五月婷婷色综合| 国产精品a片| 亚洲无码福利| 内射网站| 国产一区二区免费看| 精品国产精品国产精品国产网站| 人人操日本| 国产乱╳╳AⅤ毛片| 大骚逼影院| 熟女嗷嗷叫高潮合集91| 人人澡人人爱| 免费福利在线观看| 波多野结衣久久| 国产麻豆精品ThePorn| 亚洲日韩国产中文字幕| 亚洲日逼网站| 亚洲精品视频免费在线观看 | 特级西西人体WWWww| 欧美视频一区二区三区| 人人干人人操人人爽| 国产人妻人伦精品1国产丝袜| 日皮视频| 三级网址在线| 国产伊人在线| 日韩精品一二三区| 亚洲vs无码秘蜜桃少妇| 国产熟妇码AV| 高清的日逼| 欧美日韩亚洲另类| 欧美特黄一级视频| 三个黑人猛躁我一晚上| 亚洲在线视频免费观看| 中文字幕无码在线视频| 亚洲视频在线播放| 中文字幕线观看| 国产精品v欧美精品v日韩精品 | 亚洲精品成人av无码| 欧美一级婬片免费视频黄| 丁香五月婷婷五月| av色在线| 久久青青草在线视频| 欧美日逼片| 老妇槡BBBB槡BBBB槡| 欧美一级片在线| 制服.丝袜.亚洲.中文豆花| 国产主播精品在线| 欧美va亚洲va| 97人妻人人澡人人爽人人| 男女拍拍免费视频| 安徽妇搡BBB搡BBBB户外老太太| 亚洲四区| 成人性视频Aⅴ| 欧美高清一区二区| 一级二级三级视频| 久久aaa| 久久精品免费观看| 国产欧美在线综合| 五月天婷婷小说| 噜噜噜久久久| 在线观看网址你懂的| 欧美黑吊大战白妞| 伊人网视频| 特级西西444www高清大胆免费看 | 亚洲无码精品一区二区三区| 噜噜噜av| 操逼免费| 日韩在线视频网| 天天夜夜久久| 亚洲网站在线播放| 四川少妇BBBB槡BBBB槡| 天堂视频在线| 激情无码五月天| 黄色生活片| 中文字幕国产AV| 亚洲中文字幕码mv| 强伦轩人妻一区二区三区70后 | 青草无码| 99这里有精品| 欧美一卡二卡三卡| 日产久久久| 蜜桃做爱| 26uuu亚洲| 久久婷婷国产| 91麻豆福利在线| 围内精品久久久久久久久白丝制服| 综合网插菊花| 大鸡巴操骚逼视频| 91香蕉视频18| 中文无码网站| 337P粉嫩大胆噜噜噜55569 | 美女天天操| 日韩91在线视频| 中文字幕在线永久| AV大全在线观看| 久久国产AV| 看国产毛片| 仓井空一区二区三区| 日韩精品人妻无码| 亚洲综合小说| 日韩欧美国产黄色电影| 日韩人妻在线播放| 五月天激情综合网| 中文字幕+乱码+中文乱码91| 四季AV一区二区凹凸懂色桃花| www,色婷婷| 视频一区二区三区在线观看| 青草免费视频| zzjicom| 国产九九热视频| 男人天堂2024| 亚洲免费在线观看| AV大片免费看| 婷婷丁香一区二区三区| 久在线| 蜜桃导航-精品导航| 另类老妇极品BBWBBw| 俺来也俺也啪WWW色| 日韩黄色一级片| 日韩激情视频在线观看| 最新中文字幕av| 日本色色色| 人人操人人看人人摸| 日本国产在线视频| 久久AV秘一区二区三区水生| 亚洲四区| 伊人久久久久久久久久久| 午夜成人福利剧场| 成人毛片18女人毛片| 亚洲v欧美v| 久久夜夜操| 去干网欧美| 一本一道久久a久久精品综合| 日韩成人不卡| 蜜桃视频在线入口www| 91人妻人人澡人人精品| 无码欧美人XXXXX日本无码 | 日韩视频在线观看免费| 韩国一区二区三区在线观看| 12——13女人毛片毛片| 无码中文字幕网站| 国产成人a亚洲精品www| 97精品人妻一区二区| 水密桃网站| 99草自拍| 色色视频网| 男男做受A片AAAA| 国产操逼免费| 亚洲精品女人| 护士小雪的yin荡高日记H视频 | 一级黄色视频在线观看| 伊人天天色| 激情爱爱网站| 日日夜夜天天| 午夜成人福利在线观看| 日韩精品无码电影| 免费69视频看片| 北条麻妃无码| 国产人妻一区二区三区欧美毛片| 男人天堂视频在线| 爆操人妻| 国产三级黄色AV| 亚洲二区视频| 欧美日韩高清无码| 国产欧美综合在线三区| 青青草视频偷拍| 国产成人无码区免费AV片在线| 大香蕉现在视频中心一| 久久久久久久艹| 91久久| 中文字幕在线观看1| 三级成人免费| aaa在线| 免费人成年激情视频在线观看| 日美女网站| 久久午夜无码鲁丝片午夜精| 国产又爽又黄视频| 国产97在线视频| 久久波多野结衣| 亚洲一区免费| 日韩欧美国产精品综合嫩V| 成人欧美一区二区三区黑人免费 | 人人cao| 国产在线观看国产精品产拍 | 久久久久久久久久成人| 婷婷六月激情| 国产在线观看97| 亚洲秘av无码一区二区| 欧美激情一区二区三区| 老太色HD色老太HD.| 18AV在线观看| 99热1| 你懂得在线视频| 一区二区三区成人电影| 欧美老妇日韩| 51妺嘿嘿午夜福利在线| 免费a在线|