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

聊聊 Node.js 的模塊機(jī)制

開(kāi)發(fā) 前端
模塊機(jī)制是 Node.js 中非常重要的組成,模塊機(jī)制使得我們可以以模塊化的方式寫代碼,而不是全部代碼都寫到一個(gè)文件里。

[[425593]]

本文轉(zhuǎn)載自微信公眾號(hào)「編程雜技」,作者theanarkh。轉(zhuǎn)載本文請(qǐng)聯(lián)系編程雜技公眾號(hào)。

前言:模塊機(jī)制是 Node.js 中非常重要的組成,模塊機(jī)制使得我們可以以模塊化的方式寫代碼,而不是全部代碼都寫到一個(gè)文件里。我們平時(shí)使用的比較多的通過(guò) require 加載模塊,但是我們可能不是很清楚 require 的實(shí)現(xiàn)原理,另外 Node.js 里存在多種模塊類型,加載原理也不太一樣,本文將會(huì)介紹 Node.js 模塊機(jī)制以及實(shí)現(xiàn)原理。

1 模塊機(jī)制的初始化和使用

1.1 注冊(cè) C++ 模塊

在 Node.js 啟動(dòng)的時(shí)候,會(huì)通過(guò) RegisterBuiltinModules 注冊(cè) C++ 模塊。

  1. void RegisterBuiltinModules() {   
  2.  #define V(modname) _register_##modname();   
  3.    NODE_BUILTIN_MODULES(V)   
  4.  #undef V   

NODE_BUILTIN_MODULES是一個(gè)C語(yǔ)言宏,宏展開(kāi)后如下(省略類似邏輯)

  1. voidRegisterBuiltinModules() {   
  2.     #define V(modname) _register_##modname();   
  3.       V(tcp_wrap)    
  4.       V(timers)   
  5.       ...其它模塊   
  6.     #undef V   

再一步展開(kāi)如下

  1. void RegisterBuiltinModules() {   
  2.   _register_tcp_wrap();   
  3.   _register_timers();   

執(zhí)行了一系列_register開(kāi)頭的函數(shù),但是我們?cè)贜ode.js源碼里找不到這些函數(shù),因?yàn)檫@些函數(shù)是在每個(gè)C++模塊定義的文件里(.cc文件的最后一行)通過(guò)宏定義的。以tcp_wrap模塊為例,看看它是怎么做的。文件tcp_wrap.cc的最后一句代碼 NODE_MODULE_CONTEXT_AWARE_INTERNAL(tcp_wrap, node::TCPWrap::Initialize) 宏展開(kāi)是

  1. #define NODE_MODULE_CONTEXT_AWARE_INTERNAL(modname, regfunc)  \   
  2.     NODE_MODULE_CONTEXT_AWARE_CPP(modname,  
  3.                                   regfunc,  
  4.                                   nullptr,  
  5.                                   NM_F_INTERNAL) 

繼續(xù)展開(kāi)

  1. define NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, priv, flags) \   
  2.   static node::node_module _module = {              \   
  3.       NODE_MODULE_VERSION,                        \   
  4.       flags,                        \   
  5.       nullptr,                        \   
  6.       __FILE__,                        \   
  7.       nullptr,                        \   
  8.       (node::addon_context_register_func)(regfunc),  \   
  9.       NODE_STRINGIFY(modname),                        \   
  10.       priv,                        \   
  11.       nullptr};                        \   
  12.   void _register_tcp_wrap() { node_module_register(&_module); } 

我們看到每個(gè)C++模塊底層都定義了一個(gè) _register 開(kāi)頭的函數(shù),在 Node.js 啟動(dòng)時(shí),就會(huì)把這些函數(shù)逐個(gè)執(zhí)行一遍。我們繼續(xù)看一下這些函數(shù)都做了什么,在這之前,我們要先了解一下Node.js中表示 C++ 模塊的數(shù)據(jù)結(jié)構(gòu)。

  1. struct node_module {   
  2.   int nm_version;   
  3.   unsigned int nm_flags;   
  4.   void* nm_dso_handle;   
  5.   const char* nm_filename;   
  6.   node::addon_register_func nm_register_func;   
  7.   node::addon_context_register_func nm_context_register_func;   
  8.   const char* nm_modname;   
  9.   void* nm_priv;   
  10.   struct node_module* nm_link;   
  11. }; 

我們看到 _register 開(kāi)頭的函數(shù)調(diào)了 node_module_register,并傳入一個(gè) node_module 數(shù)據(jù)結(jié)構(gòu),所以我們看一下node_module_register 的實(shí)現(xiàn)

  1. void node_module_register(void* m) {   
  2.       struct node_module* mp = reinterpret_cast<struct node_module*>(m);   
  3.       if (mp->nm_flags & NM_F_INTERNAL) {   
  4.         mp->nm_link = modlist_internal;   
  5.         modlist_internal = mp;   
  6.       } else if (!node_is_initialized) {  
  7.         mp->nm_flags = NM_F_LINKED;   
  8.         mp->nm_link = modlist_linked;   
  9.         modlist_linked = mp;   
  10.       } else {   
  11.         thread_local_modpending = mp;   
  12.       }   

C++ 內(nèi)置模塊的 flag 是 NM_F_INTERNAL,所以會(huì)執(zhí)行第一個(gè)if的邏輯,modlist_internal 類似一個(gè)頭指針。if 里的邏輯就是頭插法建立一個(gè)單鏈表。

1.2 初始化模塊加載器

注冊(cè)完 C++ 模塊后,接著初始化模塊加載器。

  1. MaybeLocal<Value> Environment::BootstrapInternalLoaders() { 
  2.   EscapableHandleScope scope(isolate_); 
  3.  
  4.   // 形參 
  5.   std::vector<Local<String>> loaders_params = { 
  6.       process_string(), 
  7.       FIXED_ONE_BYTE_STRING(isolate_, "getLinkedBinding"), 
  8.       FIXED_ONE_BYTE_STRING(isolate_, "getInternalBinding"), 
  9.       primordials_string()}; 
  10.   // 實(shí)參 
  11.   std::vector<Local<Value>> loaders_args = { 
  12.       process_object(), 
  13.       NewFunctionTemplate(binding::GetLinkedBinding) 
  14.           ->GetFunction(context()) 
  15.           .ToLocalChecked(), 
  16.       NewFunctionTemplate(binding::GetInternalBinding) 
  17.           ->GetFunction(context()) 
  18.           .ToLocalChecked(), 
  19.       primordials()}; 
  20.  
  21.   // 執(zhí)行 internal/bootstrap/loaders.js 
  22.   Local<Value> loader_exports; 
  23.   if (!ExecuteBootstrapper( 
  24.            this, "internal/bootstrap/loaders", &loaders_params, &loaders_args) 
  25.            .ToLocal(&loader_exports)) { 
  26.     return MaybeLocal<Value>(); 
  27.   } 
  28.   // ... 

ExecuteBootstrapper 會(huì)讀取 internal/bootstrap/loaders.js 的內(nèi)容,并且封裝到一個(gè)函數(shù)中,這個(gè)函數(shù)如下

  1. function (process, getLinkedBinding, getInternalBinding, primordials) { 
  2.     // internal/bootstrap/loaders.js 的內(nèi)容 

然后執(zhí)行這個(gè)參數(shù),并傳入四個(gè)實(shí)參。我們看看 internal/bootstrap/loaders.js 執(zhí)行后返回了什么。

  1. const loaderExports = { 
  2.   // 加載 C++ 模塊 
  3.   internalBinding, 
  4.   // 原生 JS 模塊管理器 
  5.   NativeModule, 
  6.   // 原生 JS 加載器 
  7.   require: nativeModuleRequire 
  8. }; 

返回了兩個(gè)模塊加載器和一個(gè)模塊管理器。接著 Node.js 把他們存起來(lái),后續(xù)使用。

  1. // 保存函數(shù)執(zhí)行的返回結(jié)果 
  2. Local<Value> loader_exports; 
  3. if (!ExecuteBootstrapper( 
  4.          this, "internal/bootstrap/loaders", &loaders_params, &loaders_args) 
  5.          .ToLocal(&loader_exports)) { 
  6.   return MaybeLocal<Value>(); 
  7. Local<Object> loader_exports_obj = loader_exports.As<Object>(); 
  8. // 獲取 C++ 模塊加載器 
  9. Local<Value> internal_binding_loader = loader_exports_obj->Get(context(), internal_binding_string()) 
  10.         .ToLocalChecked(); 
  11. // 保存 C++ 模塊加載器set_internal_binding_loader(internal_binding_loader.As<Function>()); 
  12. // 獲取原生 JS 加載器 
  13. Local<Value> require = loader_exports_obj->Get(context(), require_string()).ToLocalChecked(); 
  14. // 保存原生 JS 加載器set_native_module_require(require.As<Function>()); 

1.3 執(zhí)行用戶 JS

Node.js 初始化完畢后最終會(huì)通過(guò)以下代碼執(zhí)行用戶的代碼。

  1. StartExecution(env, "internal/main/run_main_module"

看看 StartExecution。

  1. MaybeLocal<Value> StartExecution(Environment* env, const char* main_script_id) { 
  2.   EscapableHandleScope scope(env->isolate()); 
  3.   CHECK_NOT_NULL(main_script_id); 
  4.  
  5.   std::vector<Local<String>> parameters = { 
  6.       env->process_string(), 
  7.       // require 函數(shù) 
  8.       env->require_string(), 
  9.       env->internal_binding_string(), 
  10.       env->primordials_string(), 
  11.       FIXED_ONE_BYTE_STRING(env->isolate(), "markBootstrapComplete")}; 
  12.  
  13.   std::vector<Local<Value>> arguments = { 
  14.       env->process_object(), 
  15.       // 原生 JS 和 C++ 模塊加載器 
  16.       env->native_module_require(), 
  17.       env->internal_binding_loader(), 
  18.       env->primordials(), 
  19.       env->NewFunctionTemplate(MarkBootstrapComplete) 
  20.           ->GetFunction(env->context()) 
  21.           .ToLocalChecked()}; 
  22.  
  23.   return scope.EscapeMaybe( 
  24.       ExecuteBootstrapper(env, main_script_id, &parameters, &arguments)); 

傳入了兩個(gè)加載器,然后執(zhí)行 run_main_module.js。核心代碼如下

  1. require('internal/modules/cjs/loader').Module.runMain(process.argv[1]); 

Module.runMain 的代碼如下

  1. function executeUserEntryPoint(main = process.argv[1]) { 
  2.   Module._load(main, nulltrue); 

最終通過(guò) _load 完成用戶代碼的加載和執(zhí)行,下面我們具體分析各種加載器。

2 模塊加載的實(shí)現(xiàn)

我們平時(shí)都是通過(guò) require 加載模塊,require 幫我們處理一切,其實(shí) Node.js 中有很多種類型的模塊,下面我們逐個(gè)介紹。

2.1 JSON 模塊

  1. Module._extensions['.json'] = function(module, filename) { 
  2.   const content = fs.readFileSync(filename, 'utf8'); 
  3.  
  4.   try { 
  5.     module.exports = JSONParse(stripBOM(content)); 
  6.   } catch (err) { 
  7.     err.message = filename + ': ' + err.message; 
  8.     throw err; 
  9.   } 
  10. }; 

JSON 模塊的實(shí)現(xiàn)很簡(jiǎn)單,讀取文件的內(nèi)容,解析一下就可以了。

2.2 用戶 JS 模塊

我們看到為什么在寫代碼的時(shí)候可以直接使用 require 函數(shù),不是因?yàn)?require 是全局變量,而是我們寫的代碼會(huì)被封裝到一個(gè)函數(shù)里執(zhí)行,require 和 module.exports 等變量都是函數(shù)的形參,在執(zhí)行我們代碼時(shí), Node.js 會(huì)傳入實(shí)參,所以我們就可以使用這些變量了。require 函數(shù)可以加載用戶自定義的 JS,也可以加載原生 JS,比如net,不過(guò) Node.js 會(huì)優(yōu)先查找原生 JS。

2.3 原生 JS 模塊

原生 JS 模塊和用戶 JS 模塊的加載原理是類似的,但是也有些不一樣的地方,我們看到執(zhí)行原生 JS 模塊代碼時(shí),傳入的實(shí)參和加載用戶 JS 時(shí)是不一樣的。首先 require 變量的值是一個(gè)原生 JS 模塊加載器,所以原生 JS 模塊里通過(guò) require 只能加載 原生 JS 模塊。另外還有另一個(gè)實(shí)參也需要關(guān)注,那就是 internalBinding,internalBinding 用于加載 C++ 模塊,所以在原生 JS 里可以通過(guò) internalBinding 加載 C++模塊。

2.4 C++ 模塊

2.5 Addon 模塊

 

 

 

后記:模塊機(jī)制在任何語(yǔ)言里都是非常基礎(chǔ)且重要的部分,深入理解 Node.js 的模塊機(jī)制原理,我們知道 require 的時(shí)候到時(shí)候發(fā)生了什么,如果你對(duì)模塊加載的具體實(shí)現(xiàn)感興趣,可以去閱讀 Node.js 的源碼,也可以看一下 https://github.com/theanarkh/js_runtime_loader 這個(gè)倉(cāng)庫(kù)。

 

責(zé)任編輯:武曉燕 來(lái)源: 編程雜技
相關(guān)推薦

2021-11-06 18:40:27

js底層模塊

2022-03-26 16:51:27

Node.jstrace架構(gòu)

2020-08-31 15:00:17

Node.jsrequire前端

2020-04-15 15:48:03

Node.jsstream前端

2025-05-26 00:31:31

2022-03-30 08:36:32

Node.jsPRHTTP

2019-12-17 11:40:44

Node.js模塊前端

2020-11-02 11:40:24

Node.jsRequire前端

2023-06-30 23:25:46

HTTP模塊內(nèi)存

2017-08-16 10:36:10

JavaScriptNode.js事件驅(qū)動(dòng)

2021-10-22 08:29:14

JavaScript事件循環(huán)

2011-12-09 11:16:48

Node.js

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開(kāi)發(fā)指南基礎(chǔ)介紹

2011-09-08 14:07:28

Node.js

2023-06-20 19:35:00

Node.js工具

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-01-26 08:07:44

Node.js模塊 Async
點(diǎn)贊
收藏

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

日本一本a高清免费不卡| 亚洲第一精品久久忘忧草社区| 任我爽在线视频精品一| 亚洲一级黄色大片| 国产精品国码视频| 亚洲人成五月天| 免费黄色在线播放| 日本在线视频一区二区| 一区二区视频在线| 欧洲精品在线一区| 亚洲国产精品欧美久久| 日韩激情中文字幕| 国产做受69高潮| 影音先锋男人资源在线观看| 精品综合久久88少妇激情| 欧美色手机在线观看| 91午夜在线观看| 丝袜美腿美女被狂躁在线观看| 床上的激情91.| 国产在线视频欧美| 综合网在线观看| 黑人一区二区| 久久精视频免费在线久久完整在线看| 香蕉网在线播放| 日韩综合一区二区三区| 欧美日韩激情在线| 日本一极黄色片| 爱情岛亚洲播放路线| ...av二区三区久久精品| 欧美日韩亚洲免费| 五月天婷婷在线观看| 国产精品一品视频| 91精品免费久久久久久久久| 国产99久久久久久免费看| 精品69视频一区二区三区Q| 精品久久久91| 亚洲a∨无码无在线观看| 九九热爱视频精品视频| 亚洲精品久久久久久下一站 | 精品一区二区日韩| 国产精品91久久| 国产性猛交╳xxx乱大交| 激情综合中文娱乐网| 欧美激情a∨在线视频播放| 国产第一页浮力| 色乱码一区二区三区网站| 在线观看日韩www视频免费| 日本乱子伦xxxx| 蜜臀91精品国产高清在线观看| 精品亚洲国产成av人片传媒| 中国黄色a级片| 日韩最新在线| 亚洲欧美国产精品va在线观看| 日本黄色动态图| 你懂的在线观看一区二区| 亚洲成人网在线观看| 在线观看免费视频黄| 欧美一区 二区| 亚洲欧美成人一区二区在线电影| 中文字幕在线免费看线人| 欧美日韩一区二区三区四区不卡| 亚洲精品福利在线| 精品人伦一区二区三电影| 精品一二三区| 国产亚洲美女久久| 免费成人深夜蜜桃视频 | 精品少妇在线视频| a级片在线免费观看| 精品免费在线视频| 91看片就是不一样| 免费成人黄色网| 日韩一区二区不卡| 中文文字幕文字幕高清| 国产欧美亚洲精品a| 中文字幕亚洲欧美一区二区三区| 欧美一级特黄高清视频| 欧美日韩视频一区二区三区| 91黑丝高跟在线| 一区二区三区麻豆| 国产在线视频精品一区| 岛国视频一区| 国产三级视频在线| 中文字幕亚洲欧美在线不卡| 51xx午夜影福利| 毛片在线网站| 欧美日产在线观看| 中国一级特黄录像播放| 三级电影一区| 久久久久久久久久久免费精品| 69视频免费在线观看| 美女一区二区三区| 国产精品制服诱惑| h视频网站在线观看| 一区二区三区美女| 亚洲狼人综合干| 精品视频一二| 伊人青青综合网站| 久久久久久久国产视频| 日韩精品高清不卡| 国产精品一区二区av| 8888四色奇米在线观看| 午夜电影久久久| 亚洲午夜精品一区| 自拍自偷一区二区三区| 欧美理论电影在线播放| 中文字幕激情视频| 99久久免费视频.com| 国产高清免费在线| 姬川优奈av一区二区在线电影| 日韩午夜在线影院| 1024手机在线观看你懂的| 99精品视频网| 91偷拍精品一区二区三区| 成人免费在线电影| 欧美日韩激情美女| 亚洲美女高潮久久久| 色综合咪咪久久网| 国产不卡精品视男人的天堂| 成人精品在线播放| 综合精品久久久| 亚洲三级视频网站| 亚洲婷婷丁香| 午夜精品视频在线| 草草视频在线播放| 亚洲色图在线播放| xxx国产在线观看| 精品国产精品国产偷麻豆| 午夜精品国产精品大乳美女| 99久久免费国产精精品| 中文字幕亚洲欧美在线不卡| 五月天婷婷激情视频| 亚洲人成伊人成综合图片| 久久久久一本一区二区青青蜜月| www.色视频| 亚洲视频一二区| 免费精品99久久国产综合精品应用| 国产成人精品三级高清久久91| 午夜精品久久久久久久99热浪潮| 亚洲成人久久精品| 亚洲在线一区二区三区| 亚洲丝袜在线观看| 欧美a级在线| 91嫩草免费看| 成人性生交大片免费看网站 | 日韩综合第一页| 欧美日韩天堂| 国产精品久久波多野结衣| 日本在线观看大片免费视频| 欧美一级二级三级乱码| 懂色av懂色av粉嫩av| 国产乱码精品一区二区三| 看全色黄大色大片| 999久久久精品一区二区| 高清欧美性猛交xxxx黑人猛交| 男人天堂综合网| 欧美视频一二三| www.av欧美| 久久狠狠亚洲综合| 最新视频 - x88av| eeuss鲁片一区二区三区| 高清视频欧美一级| 男人天堂综合| 欧美人狂配大交3d怪物一区| 精品国产视频在线观看| 国产一区二区在线观看视频| 国产日本欧美在线| 国产成人夜色高潮福利影视| 8050国产精品久久久久久| 久色视频在线| 69堂国产成人免费视频| 久久久精品91| www精品美女久久久tv| 一级在线免费视频| 亚洲人成免费网站| 国产欧美日韩一区二区三区| 日韩精品99| 日韩在线观看免费全| 亚洲爱爱综合网| 欧美性xxxx18| 国产小视频你懂的| 粉嫩一区二区三区在线看| 99热成人精品热久久66| 国产精品传媒精东影业在线| 国产精品麻豆免费版| 四虎成人在线| 欧美人与性动交a欧美精品| 亚洲 欧美 激情 小说 另类| 欧美日韩另类国产亚洲欧美一级| 欧美精品99久久久| 国产欧美日韩精品一区| 中文字幕av一区二区三区人妻少妇| 国产欧美91| 永久免费精品视频网站| 欧美精品密入口播放| 国产欧美一区二区三区在线看| 9765激情中文在线| 丝袜美腿亚洲一区二区| 少妇一区二区三区四区| 欧美日本高清视频在线观看| 日韩少妇高潮抽搐| 亚洲视频免费看| 新91视频在线观看| 国产精品99久久久久久久女警 | 国产美女无遮挡网站| 日韩成人三级| 韩国成人一区| 成人自拍视频| 国产精品va在线| 成人av影院在线观看| 日韩小视频在线| 男人天堂亚洲二区| 亚洲精品720p| 99免费在线视频| 欧美日韩久久久一区| 亚洲欧美综合自拍| 亚洲制服丝袜一区| 国产传媒免费在线观看| 国产亚洲一区二区三区| 国产精品麻豆入口| 国产不卡一区视频| 黄色a级三级三级三级| 青青青爽久久午夜综合久久午夜| 国产精品自拍片| 伊人成人网在线看| 最新中文字幕久久| 水蜜桃精品av一区二区| 欧美亚洲爱爱另类综合| 色天下一区二区三区| 国产精品对白一区二区三区| 国产精品99久久免费| 国产欧美在线看| 国产91欧美| 国产精品日韩久久久久| 久久野战av| 国产精品99导航| 六月婷婷综合| 欧洲精品毛片网站| 自拍在线观看| 欧美专区福利在线| 手机在线观看av网站| 91国偷自产一区二区三区的观看方式| 国产网红女主播精品视频| 欧美福利在线观看| 女囚岛在线观看| 久久免费视频网| 激情aⅴ欧美一区二区欲海潮| 久久久女人电视剧免费播放下载| 美女精品视频| 国模精品一区二区三区色天香| av免费不卡国产观看| 97精品一区二区视频在线观看| caoprom在线| 欧美亚洲伦理www| 美女100%一区| 国产精品一区=区| av在线亚洲一区| 97人人澡人人爽| 精品精品精品| 欧美婷婷久久| 99久久精品网| 国产成人艳妇aa视频在线| 一区精品久久| mm1313亚洲国产精品无码试看| 人人超碰91尤物精品国产| 91高清国产视频| 国产suv精品一区二区三区| 黑人玩弄人妻一区二区三区| 26uuu国产电影一区二区| 日本黄色小视频在线观看| 综合久久久久综合| 国产在线观看免费av| 色欧美乱欧美15图片| 怡春院在线视频| 精品精品欲导航| 黄色毛片在线观看| 久久综合伊人77777蜜臀| 国产蜜臀av在线播放| 国产91九色视频| 激情不卡一区二区三区视频在线| 成人一区二区三区四区| 精品国产一区二区三区av片| 只有这里有精品| 亚洲自啪免费| 永久免费黄色片| 99久久精品国产导航| 蜜桃av.com| 欧美视频在线视频| 国产乱淫a∨片免费视频| 亚洲精品久久久久久久久| 日本视频在线观看| 91高清视频免费| 91精品国产一区二区在线观看| 精品国产乱码久久久久久郑州公司| 精品视频亚洲| 男女超爽视频免费播放| 麻豆91精品91久久久的内涵| 黄色污在线观看| 亚洲色图一区二区| 精品久久久久久久久久久久久久久久| 在线播放一区二区三区| 欧洲毛片在线| 久久久久久久久久久亚洲| 福利精品一区| 欧洲一区二区日韩在线视频观看免费 | 久久久久亚洲av片无码下载蜜桃| 色94色欧美sute亚洲线路一ni| 草逼视频免费看| 久久九九亚洲综合| av综合电影网站| 国产精品推荐精品| 欧美高清视频在线观看mv| 欧美韩国日本在线| 成人黄色在线看| 黑人巨大精品一区二区在线| 欧美色综合天天久久综合精品| 天堂av中文在线资源库| 久久成人精品视频| 日日夜夜亚洲精品| 日本一区二区三不卡| 一本久久知道综合久久| av在线网站免费观看| 中文字幕一区二区在线观看| 伦av综合一区| 日韩成人av在线播放| 蜜臀av国内免费精品久久久夜夜| 成人精品在线视频| 色婷婷热久久| 在线观看免费的av| 国产精品全国免费观看高清| 成人a v视频| 亚洲人成电影网站| 国产超碰精品| 欧美成人一区二区在线| 国产视频久久| 性色av蜜臀av色欲av| 精品欧美激情精品一区| 香蕉视频黄色片| 6080yy精品一区二区三区| 精品国产一区二区三区不卡蜜臂| 成人一级生活片| 国产不卡在线视频| 日韩成人高清视频| 亚洲精品国产拍免费91在线| 久草在线中文最新视频| 久久国产精品一区二区三区四区 | 久久久久久久国产精品| 中文字幕av一区二区三区四区| 草草草视频在线观看| 丁香婷婷综合激情五月色| 久久亚洲AV无码| 日韩精品中文字幕在线播放| 亚洲电影观看| 日韩三级电影免费观看| 美女诱惑一区二区| 国产大学生自拍| 亚洲精品在线电影| 密臀av在线播放| 天堂精品一区二区三区| 久久国产乱子精品免费女| 日韩精品123区| 精品久久久久久久久久久久久久久| av3级在线| 青青草成人网| 久久91精品久久久久久秒播| 中文字幕手机在线观看| 日韩电视剧在线观看免费网站| 在线日韩影院| 一本一生久久a久久精品综合蜜| 精品中文av资源站在线观看| 久久婷婷一区二区| 日韩不卡在线观看| 91成人在线网站| www.xxx麻豆| 久久精品男人的天堂| 国产精品久久久久久久免费| 久久久久久一区二区三区| 在线视频亚洲专区| 久久成年人网站| 午夜精品福利在线| 137大胆人体在线观看| 999日本视频| 久热国产精品| 亚洲熟女www一区二区三区| 亚洲国产精品久久久久久| 日韩欧美一区二区三区免费观看 | 五月天久久综合网| 国产馆精品极品| 亚洲综合久久网| 欧美乱妇高清无乱码| 在线看成人短视频| 台湾佬美性中文| 欧美最猛性xxxxx直播| 色呦呦在线视频| 神马影院我不卡午夜| 东方aⅴ免费观看久久av| 免费又黄又爽又猛大片午夜| 久久久av电影| 精品视频网站| 亚洲国产精品自拍视频| 欧美丰满少妇xxxbbb|