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

Node.js源碼研究之模塊組織加載

開發 前端
粗略研究了一下node.js源碼,它有8000行C++代碼,2000行javascript代碼,來看看js和C++間是怎么組織連接起來,以及各個模塊是怎樣互相調用的。

粗略研究了一下node.js源碼,它有8000行C++代碼,2000行javascript代碼,來看看js和C++間是怎么組織連接起來,以及各個模塊是怎樣互相調用的。

本文使用的node.js版本是0.4.8,可以在https://github.com/joyent/node/tree/v0.4.8這里看到源碼。

js2c.py

node.js使用了V8附帶的js2c.py工具把所有內置的js代碼轉換成C++里的數組,生成node_natives.h直接include到程序中,成了C++源碼的一部分。這樣做能提高內置js模塊的編譯效率。

node.js里內置的javascript包括了主程序src/node.js和模塊程序lib/*.js,通過js2c.py讓每一個js文件都生成一個源碼數組,存放在build/src/node_natives.h里,node_natives.h在node.js編譯后才會生成(編譯的腳本wscript中調用了js2c.py),可以看到大致的結構如下:

  1. namespace node {  
  2. const char node_native[] = {47, 47, 32, 67, 112 ......}  
  3. const char console_native[] = {47, 47, 32, 67, 112 ......}  
  4. const char buffer_native[] = {47, 47, 32, 67, 112 ......}  
  5. .....  
  6. }  
  7. struct _native { const char* name; const char* source; size_t source_len;};  
  8. static const struct _native natives[] = {  
  9. "node", node_native, sizeof(node_native)-1 },  
  10. "dgram", dgram_native, sizeof(dgram_native)-1 },  
  11. "console", console_native, sizeof(console_native)-1 },  
  12. "buffer", buffer_native, sizeof(buffer_native)-1 },  
  13. ....  

這個文件被包含在node_javascript.cc里,node_javascript.cc提供了兩個接口:

MainSource() 處理node_native源碼返回v8::Handle類型的數據可供編譯。

DefineJavaScript(target) 把其他所有模塊源碼變成v8::Handle類型后加載到傳入的target對象上。

所有的js模塊都被轉換成了C數組,接下來看看它們怎么執行和互相調用。

執行js主程序/傳遞process

先看看node.js的底層C++傳遞給javascript的一個變量process,在一開始運行node.js時,程序會先配置好process

  1. Handleprocess = SetupProcessObject(argc, argv); 

然后把process作為參數去調用js主程序src/node.js返回的函數,這樣process就傳遞到javascript里了。

  1. //node.cc  
  2. //通過MainSource()獲取已轉化的src/node.js源碼,并執行它  
  3. Local f_value = ExecuteString(MainSource(), IMMUTABLE_STRING("node.js"));  
  4.  
  5. //執行src/node.js后獲得的是一個函數,從node.js源碼可以看出:  
  6. //node.js  
  7. //(function(process) {  
  8. // global = this;  
  9. // ....  
  10. //})  
  11. Local f = Local::Cast(f_value);  
  12.  
  13.  
  14. //創建函數執行環境,調用函數,把process傳入  
  15. Localglobal = v8::Context::GetCurrent()->Global();  
  16. Local args[1] = { Local::New(process) };  
  17. f->Call(global, 1, args); 

C++模塊

node.js的模塊除了lib/*.js里用js語言編寫的以外,還有一些使用C++編寫,像os/stdio/crypto/buffer等。這些模塊都通過node.h提供的NODE_MODULE方法存儲在變量_module里。node_extensions.cc提供了get_builtin_module(name)接口獲取這些模塊。

process.binding/C++模塊加載

process提供的一個獲取模塊的接口是binding,它的實現Binding()函數可以在node.cc找到。

  1. Persistent binding_cache;  
  2. static Handle Binding(const Arguments& args) {  
  3. HandleScope scope;  
  4. Local module = args[0]->ToString();  
  5. String::Utf8Value module_v(module);  
  6. node_module_struct* modp;  
  7.  
  8. if (binding_cache.IsEmpty()) {  
  9. binding_cache = Persistent::New(Object::New());  
  10. }  
  11. Local exports;  
  12. if (binding_cache->Has(module)) {  
  13. exports = binding_cache->Get(module)->ToObject();  
  14.  
  15. else if ((modp = get_builtin_module(*module_v)) != NULL) {  
  16. exports = Object::New();  
  17. modp->register_func(exports);  
  18. binding_cache->Set(module, exports);  
  19.  
  20. else if (!strcmp(*module_v, "constants")) {  
  21. exports = Object::New();  
  22. DefineConstants(exports);  
  23. binding_cache->Set(module, exports);  
  24.  
  25. #ifdef __POSIX__  
  26. else if (!strcmp(*module_v, "io_watcher")) {  
  27. exports = Object::New();  
  28. IOWatcher::Initialize(exports);  
  29. binding_cache->Set(module, exports);  
  30. #endif  
  31.  
  32. else if (!strcmp(*module_v, "natives")) {  
  33. exports = Object::New();  
  34. DefineJavaScript(exports);  
  35. binding_cache->Set(module, exports);  
  36.  
  37.  
  38. else {  
  39. return ThrowException(Exception::Error(String::New("No such module")));  
  40. }  
  41. return scope.Close(exports);  

從源碼可以看到,調用process.binding時,先看緩存里是否已經存在此模塊,不存在再調用get_builtin_module查找C++內置模塊,找到的話獲取后綁定在exports上,在最后返回exports。

此外還有針對其他模塊的特殊處理,其中natives模塊就是調用上文提到的DefineJavaScript(exports)接口獲取到所有內置的js模塊綁定在exports上。

現在在js上需要調用C++提供的模塊只需要調用process.binding就行了,例如

  1. var stdio = process.binding("stdio"

js模塊加載

src/node.js上實現了一個NativeModule對象用于管理js模塊,它通過調用process.binding(“natives”)把所有內置的js模塊放在NativeModule._source上,并提供require接口供調用。在require里會給代碼加一層包裝,把一些變量傳給這個模塊。

  1. NativeModule.wrapper = [  
  2. '(function (exports, require, module, __filename, __dirname) { ',  
  3. '\n});' 
  4. ]; 

再用process提供的其中一個js編譯接口process.runInThisContext執行代碼。

  1. var fn = runInThisContext(source, this.filename, true);  
  2. fn(this.exports, NativeModule.require, thisthis.filename); 

于是在主程序src/node.js上可以調用NativeModule.require(“net”)去加載net模塊,在lib/*.js的各個js模塊里能通過調用傳進來的require()去加載其他內置js模塊。

總結流程

粗略總結一下加載模塊的流程:

加載C++模塊(以stdio為例):

process.binding(“stdio”) -> get_builtin_module(“stdio”) -> _module -> NODE_MODULE(node_stdio, node::Stdio::Initialize)(定義)

加載js模塊(以net為例)

require(“net”) -> NativeModule.require(“net”) -> process.binding(“natives”)["net"] -> DefineJavaScript() -> natives[] -> node_natives.h

原文:http://cnodejs.org/blog/?p=1280

【編輯推薦】

  1. 揭秘Node.js事件
  2. Node.js初探之與Mysql的交互
  3. Node.js初探之hello world
  4. Node.js入門之神秘的服務器端JavaScript
  5. 什么是Node.js?
責任編輯:陳貽新 來源: cnodejs.org
相關推薦

2019-12-17 11:40:44

Node.js模塊前端

2020-08-31 15:00:17

Node.jsrequire前端

2021-09-26 05:06:04

Node.js模塊機制

2020-04-15 15:48:03

Node.jsstream前端

2011-09-08 10:41:12

Node.js

2025-05-26 00:31:31

2019-12-10 10:23:57

Node.jsCluster前端

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2023-06-30 23:25:46

HTTP模塊內存

2011-12-09 11:16:48

Node.js

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2011-09-08 10:32:27

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2021-01-26 08:07:44

Node.js模塊 Async
點贊
收藏

51CTO技術棧公眾號

黄色a级片在线观看| 日韩肉感妇bbwbbwbbw| 成人午夜免费福利| 国产视频一区三区| 国产一区二区三区免费视频| 奇米视频7777| 涩涩视频在线播放| 国产精品嫩草99a| www.久久久| 91精品国产综合久久久蜜臀九色| 不卡在线一区二区| 精品欧美一区二区久久| 大香煮伊手机一区| 尤物视频在线看| 久久精品亚洲国产奇米99| 91中文字幕在线观看| 丰满少妇乱子伦精品看片| 日韩在线观看| 日韩精品极品在线观看| 午夜精品免费看| 日本乱码一区二区三区不卡| 1024成人网色www| 欧美黄色直播| www.国产视频| 免费成人av在线| 97色在线观看免费视频| 日韩一区二区三区四区视频| 欧美日韩破处| 日韩视频一区二区三区在线播放 | 国产精品夫妻激情| 久久精品www| 水蜜桃精品av一区二区| 亚洲人成电影在线| 国产二级一片内射视频播放| 国产激情一区| 欧美日韩免费视频| 日韩毛片在线免费看| 成av人片在线观看www| 亚洲男人都懂的| 亚洲欧洲久久| 成人在线视频成人| 91啪亚洲精品| 精品久久一区二区三区蜜桃| 亚洲精品一区二区三区蜜桃| 韩国av一区二区三区在线观看| 国产精品mp4| 国产精品21p| 亚洲欧美日本日韩| 97免费中文视频在线观看| 久久久久久天堂| 中文字幕亚洲综合久久五月天色无吗'' | 男人舔女人下面高潮视频| 欧美sm一区| 精品美女久久久久久免费| 男人添女人下部高潮视频在观看| 日韩特级毛片| 亚洲一区在线观看视频| av在线免费观看国产| 亚洲精品白浆| 亚洲国产aⅴ天堂久久| 日本黄大片在线观看| 四虎亚洲成人| 午夜国产不卡在线观看视频| 全黄性性激高免费视频| 91豆花视频在线播放| 欧美日韩亚洲系列| 精品视频一区二区在线| 高潮一区二区| 欧美视频一区二区在线观看| 怡红院亚洲色图| 电影一区中文字幕| 欧美xxxx在线观看| 成年人的黄色片| 老司机aⅴ在线精品导航| 日韩av在线免费观看一区| 中文字幕av网址| 日韩av在线播放网址| 久久五月天色综合| 国产性xxxx高清| 久久午夜av| 成人国产精品日本在线| 国产高潮流白浆喷水视频| 成人av电影在线网| 日韩欧美一区二区三区久久婷婷| 在线视频二区| 亚洲一二三四久久| 成年人小视频网站| 色综合视频一区二区三区44| 日韩精品专区在线影院重磅| 欧美丰满少妇人妻精品| 国产精品久久久久久麻豆一区软件| 欧美成人亚洲成人日韩成人| 影音先锋亚洲天堂| 老司机一区二区| 国产欧美欧洲| 午夜在线免费观看视频| 亚洲mv在线观看| 在线免费观看视频黄| 99久久免费精品国产72精品九九 | 欧美a级片网站| 51精品在线观看| 国产乱色精品成人免费视频| aaa国产一区| 国产又粗又硬又长| 久久人体大尺度| 日韩一级成人av| 国产中年熟女高潮大集合| 亚洲国产一区二区三区在线播放| 7m第一福利500精品视频| 国产精品久久久久久免费免熟| av在线这里只有精品| 一级日韩一区在线观看| 无遮挡爽大片在线观看视频 | 国产不卡av在线免费观看| 国产成人免费看一级大黄| 国产人妖乱国产精品人妖| 妞干网视频在线观看| 国产精品久久久久久久久免费高清| 精品av久久707| 成年人免费视频播放| 性色一区二区| 国产嫩草一区二区三区在线观看| 精品视频在线一区二区| 欧美三级电影网| 蜜桃传媒一区二区亚洲av| 精品91在线| 91精品视频在线看| а天堂8中文最新版在线官网| 亚洲不卡av一区二区三区| 伊人免费视频二| 日本一区二区在线看| 日本成人黄色片| 姝姝窝人体www聚色窝| 亚洲欧美成人一区二区三区| 99视频在线视频| 国产区精品区| 日韩免费观看网站| 日本亚洲一区| 欧美视频在线视频| 成人网站免费观看| 国产精品久久777777毛茸茸| 国产视频不卡| a级片免费在线观看| 精品免费国产一区二区三区四区| 2025国产精品自拍| 国产乱子轮精品视频| 日本黄色a视频| 97色婷婷成人综合在线观看| 色偷偷av亚洲男人的天堂| 亚洲一区中文字幕在线| 中文字幕乱码亚洲精品一区| 91制片厂毛片| 色天天久久综合婷婷女18| 国产精品自产拍高潮在线观看| 成人不用播放器| 欧美日韩你懂得| 萌白酱视频在线| 国产一区二区三区在线观看免费 | 久久国产精品-国产精品| 国产一二在线播放| 亚洲精品久久久久久久久| 国产女同在线观看| 久久精品亚洲国产奇米99| 国产精品入口免费软件| 久久伦理在线| 99热在线播放| 国产在线天堂www网在线观看| 亚洲精品久久久久中文字幕二区 | 国产chinese精品一区二区| brazzers在线观看| 亚洲欧洲国产一区| 国产一区二区在线视频聊天 | 亚洲人成电影网站色xx| 在线免费观看视频网站| 亚洲精品写真福利| 在线观看日韩欧美| 亚洲精蜜桃久在线| 中文字幕成人| 成年无码av片在线| 免费观看国产视频| 色综合色狠狠天天综合色| 国产18无套直看片| 国产精品一区二区男女羞羞无遮挡| 欧美国产日韩激情| 视频一区欧美| 91精品久久久久久久久中文字幕| 最新日本在线观看| 日韩高清免费观看| 亚洲视频在线免费播放| 亚洲一区二区三区四区的| 中文字幕第20页| 国内不卡的二区三区中文字幕 | 一区二区三区免费在线观看视频 | 亚洲精品欧美二区三区中文字幕| 亚洲精品久久久久久| 亚洲欧美高清| www.亚洲一区二区| 台湾亚洲精品一区二区tv| 成人信息集中地欧美| 美女露胸视频在线观看| 久久久999精品| 天天干天天插天天操| 欧美猛男超大videosgay| 一级片中文字幕| 亚洲色图一区二区三区| 成都免费高清电影| 国产成人日日夜夜| 一区二区三区 欧美| 1024精品一区二区三区| 综合网五月天| 久久不见久久见中文字幕免费 | 国内免费久久久久久久久久久 | 欧美人与动xxxxz0oz| 91热精品视频| 国产精品videossex撒尿| 高清欧美电影在线| а√天堂在线官网| 综合136福利视频在线| 无码精品黑人一区二区三区| 欧美一区二区网站| 亚洲一区二区三区高清视频| 狠狠久久五月精品中文字幕| 深夜福利影院在线观看| 国产精品久久久久aaaa| 亚洲成人网在线播放| 成人黄色777网| 亚洲成人av免费观看| 久久精品国产在热久久| 日本美女高潮视频| 亚洲免费网址| 99视频在线免费播放| 亚洲性人人天天夜夜摸| 日本福利视频网站| 66国产精品| 一本久道久久综合| 日韩久久精品网| 天天综合色天天综合色hd| 男男gay无套免费视频欧美| 韩国成人av| 国产精品videossex| 91黄色精品| 欧美一区一区| 97中文在线观看| 日韩精品三级| 成人免费在线看片| 99精品国产一区二区三区2021 | 成人久久精品人妻一区二区三区| 欧美精品v国产精品v日韩精品| 中文字幕日韩三级| 欧美日韩久久久| 一级做a爱片性色毛片| 欧美人牲a欧美精品| 国产精品久久久久久久一区二区 | 天堂在线观看免费视频| 亚洲成在人线av| 无码精品视频一区二区三区 | 麻豆传媒在线免费| 精品国偷自产在线视频99| 国产日产一区二区三区| 欧美另类极品videosbest最新版本| 好吊日视频在线观看| 九九久久久久久久久激情| 久操av在线| 69视频在线播放| 久久91导航| 国产精品v片在线观看不卡| 国产香蕉久久| 亚洲精品免费网站| 国产美女撒尿一区二区| 免费在线观看91| 色婷婷色综合| 九九久久九九久久| 亚洲一区二区动漫| 天天综合网日韩| 国产精品18久久久久久久久| 麻豆精品国产传媒av| 国产午夜精品福利| 婷婷伊人五月天| 午夜精品123| 成人黄色片在线观看| 日韩一区二区三区电影| 亚洲色图 校园春色| 中文字幕欧美视频在线| 天堂亚洲精品| 国产精品国产三级国产aⅴ浪潮| 欧美成人福利| 国产伦精品一区二区三区高清| 九色精品91| 91嫩草国产丨精品入口麻豆| 午夜在线观看免费一区| 天天操狠狠操夜夜操| av午夜一区麻豆| 黄色精品视频在线观看| 婷婷开心激情综合| 一区二区 亚洲| 亚洲国产精品yw在线观看| 91官网在线| 欧美亚洲免费电影| 激情不卡一区二区三区视频在线| 久久精品中文字幕一区二区三区 | 亚洲伊人影院| 欧美日本韩国国产| 欧美三区不卡| 天天综合网日韩| 2020日本不卡一区二区视频| 青青草国产在线观看| 欧美性一级生活| 熟妇人妻中文av无码| 麻豆乱码国产一区二区三区| 免费福利视频一区二区三区| 99久久一区三区四区免费| 久久成人综合| 久久黄色免费看| 播五月开心婷婷综合| 午夜爽爽爽男女免费观看| 色婷婷久久一区二区三区麻豆| 亚洲第一色网站| 久久九九国产精品怡红院 | 在线欧美日韩精品| 亚洲人成色777777老人头| 欧美人在线视频| 99精品国产九九国产精品| 欧美一区二区综合| 夜夜嗨一区二区| 亚洲精品无码一区二区| 亚洲欧美日韩国产手机在线| 亚洲视频在线观看免费视频| 国产午夜精品免费一区二区三区| 国产免费拔擦拔擦8x高清在线人| 91中文字精品一区二区| 久久精品久久久| 在线看的黄色网址| 国产欧美精品一区aⅴ影院| 色av性av丰满av| 日韩精品免费综合视频在线播放| av电影免费在线看| 国产高清在线精品一区二区三区| 在线观看国产精品入口| 手机在线国产视频| 国产精品久久久久国产精品日日| 在线观看视频二区| 日韩在线中文视频| 亚洲精品无播放器在线播放| 亚洲一区美女| 狠狠狠色丁香婷婷综合久久五月| 精品丰满少妇一区二区三区| 欧美日韩国产大片| 欧美激情二区| 3d动漫啪啪精品一区二区免费 | 怡红院av亚洲一区二区三区h| 成人短视频下载| www.av麻豆| 日韩精品亚洲元码| 欧美国产大片| 午夜精品短视频| 精品亚洲成a人在线观看| 538精品在线视频| 亚洲福利视频网站| 亚洲天堂资源| 亚洲精品二区| 国产伦精品一区二区三区视频青涩 | 牛夜精品久久久久久久| 国产精品国产三级国产aⅴ原创| 91在线观看喷潮| 欧美激情网友自拍| 青青操综合网| 另类小说第一页| 亚洲人成亚洲人成在线观看图片| 国产www视频| 国产91|九色| 日产精品一区二区| 亚洲成人精品在线播放| 午夜精彩视频在线观看不卡| 丁香在线视频| 成人18视频| 免费亚洲婷婷| 四虎884aa成人精品| 亚洲白虎美女被爆操| 欧美片第一页| 亚洲欧美一二三| 91一区二区在线| 一区二区视频在线免费观看| 欧美黑人极品猛少妇色xxxxx| 日日狠狠久久偷偷综合色| 色综合天天色综合| 亚洲图片欧美一区| 国产精品99999| 成人av资源网| 日韩精品一卡二卡三卡四卡无卡| 久久国产精品国语对白| 亚洲日本中文字幕| 美女精品视频在线| 欧美日韩怡红院| 亚洲午夜av在线| 亚洲成a人v欧美综合天堂麻豆| 国产一区免费观看| 狠狠色丁香久久婷婷综| www.久久久久久久| 国语自产精品视频在线看一大j8| 成人网18免费网站|