亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Node.js中require的工作原理淺析

2019-11-20 14:24:20
字體:
來源:轉載
供稿:網友

幾乎所有的Node.js開發人員可以告訴你`require()`函數做什么,但我們又有多少人真正知道它是如何工作的?我們每天都使用它來加載庫和模塊,但它的行為,對于我們來說反而是一個謎。

出于好奇,我鉆研了node的核心代碼來找出在引擎下發生了什么事。但這并不是一個單一的功能,我在node的模塊系統的找到了module.js。該文件包含一個令人驚訝的強大的且相對陌生的核心模塊,控制每個文件的加載,編譯和緩存。`require()`,它的橫空出世,只是冰山的一角。

module.js

復制代碼 代碼如下:

function Module(id, parent) {
  this.id = id;
  this.exports = {};
  this.parent = parent;
  // ...

在module.js在Node.js內部主要承擔兩個角色。首先,它為所有的Node.js模塊提供了一個基礎。每個文件是基本模塊new出的一個新實例,即使在該文件已經運行之后,仍然存在。這就是為什么我們能夠性為module.exports附加屬并在需要時返回它們。

該模塊的第二大任務是處理node的模塊加載機制。我們使用的獨立操作的“require”函數實際上是一個抽象概念的module.require,這本身就是只是一個簡單的關于Module._load功能的封裝。此load方法處理每個文件的實際加載,并在那里開始我們的旅程。

Module._load

復制代碼 代碼如下:

Module._load = function(request, parent, isMain) {
  // 1. Check Module._cache for the cached module.
  // 2. Create a new Module instance if cache is empty.
  // 3. Save it to the cache.
  // 4. Call module.load() with your the given filename.
  //    This will call module.compile() after reading the file contents.
  // 5. If there was an error loading/parsing the file,
  //    delete the bad module from the cache
  // 6. return module.exports
};

Module._load負責加載新的模塊和管理模塊的緩存。緩存加載的每個模塊減少冗余文件的讀取次數,并可以顯著地加快您應用程序的速度。此外,共享模塊實例允許單例特性的模塊,保持在項目中的狀態。

如果某個模塊沒有在緩存中存在,Module._load將創建該文件的一個新的基本模塊。然后,它會告訴模塊在將它們發送到module._compile之前閱讀新文件的內容。[1]

如果您注意到上面的步驟#6,你會看到module.exports已被返回給用戶。這就是為什么當你在定義公共接口使用時,你使用exports和module.exports,因為Module._load將接下來返回require的內容。我很驚訝,這里沒有更多的功能,但如果有的話那更好。

module._compile

復制代碼 代碼如下:

Module.prototype._compile = function(content, filename) {
  // 1. Create the standalone require function that calls module.require.
  // 2. Attach other helper methods to require.
  // 3. Wraps the JS code in a function that provides our require,
  //    module, etc. variables locally to the module scope.
  // 4. Run that function
};

? 這是真正的奇跡發生的地方。首先,一個特殊的獨立操作的require函數是為該模塊創建的。這是我們需要的并且都熟悉的功能。而函數本身只是一個在Module.require的封裝,它也包含了一些便于我們使用的鮮為人知的輔助方法:

? require():加載一個外部模塊
? require.resolve():解析一個模塊名到它的絕對路徑
? require.main:主模塊
? require.cache:所有緩存好的模塊
? ?require.extensions:根據其擴展名,對于每個有效的文件類型可使用的編制方法

一旦require準備好了,整個加載的源代碼就會被封裝在一個新的函數里,可以接受require,module,exports和所有其他暴露的變量作為參數。這是一個僅僅為封裝模塊的而創建的函數,以便于在防止與Node.js的環境產生沖突。

復制代碼 代碼如下:

(function (exports, require, module, __filename, __dirname) {
  // YOUR CODE INJECTED HERE!
});

該Module._compile方法是同步執行的,所以對Module._load的調用只能等到這段代碼運行結束,并將module.exprts返回給用戶。

結論

因此,我們已經了解了require的全部代碼,并已經初步了解它是如何工作的。

如果你已經按照這一切的方式做了,那么你已經為最后的秘密做好準備:require('module')。這是正確的,該模塊系統本身可以通過模塊系統被加載。盜夢空間。這可能聽起來很奇怪,但它可以讓用戶空間同模塊加載系統互動起來,并不需要鉆研Node.js核心。受歡迎的模塊都像這樣被建立。[2]

如果您想了解更多,請自己查看module.js源代碼。還有很多東西足夠你頭痛一段時間了。第一個可以告訴我什么是NODE_MODULE_CONTEXTS“以及它為什么被添加的人可以得到加分獎勵 :)

[1] module._compile方法只用于運行JavaScript文件。 JSON文件需通過JSON.parse() 解析并返回

[2]然而,這兩個模塊都建立在私有模塊的方法,如Module._resolveLookupPaths和Module._findPath。你可以認為這并沒有好多了...

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩一区二区三区在线| 综合国产在线观看| 国产日韩精品电影| 欧美精品在线播放| 亚洲精品免费一区二区三区| 啪一啪鲁一鲁2019在线视频| 欧美猛男性生活免费| 亚洲性视频网址| 色偷偷亚洲男人天堂| 欧美午夜精品久久久久久浪潮| 亚洲人成电影在线观看天堂色| 伊人青青综合网站| 麻豆国产va免费精品高清在线| 国产黑人绿帽在线第一区| 欧美噜噜久久久xxx| 久久国产精品久久久久| 精品偷拍各种wc美女嘘嘘| 亚洲成人久久一区| 亚洲**2019国产| 最近免费中文字幕视频2019| 中文字幕亚洲无线码a| 日本精品免费观看| 日韩欧美国产视频| 久久影视三级福利片| 日韩美女在线观看一区| 欧美日韩一区二区三区在线免费观看| 精品久久国产精品| 国产一区二区三区欧美| 亚洲精品v欧美精品v日韩精品| 欧美性猛交丰臀xxxxx网站| 日韩在线免费av| 91在线视频精品| 国产在线视频欧美| 国产精品夫妻激情| 九九九热精品免费视频观看网站| 最近中文字幕2019免费| 欧美视频免费在线观看| 国精产品一区一区三区有限在线| 日韩视频在线一区| 亚洲免费一级电影| 欧美大片欧美激情性色a∨久久| 国产成人精品a视频一区www| 日本一区二区三区四区视频| 日本精品久久电影| 亚洲成人激情在线| 国模精品系列视频| 丝袜情趣国产精品| 久久午夜a级毛片| 久久久久久久久久久久久久久久久久av| 亚洲高清色综合| 成人a视频在线观看| 欧美做受高潮电影o| 亚洲a中文字幕| 国产在线观看不卡| 国产精品久久久久999| 久久福利网址导航| 中文字幕日韩在线视频| 日韩av在线最新| 91豆花精品一区| 国产一区二区三区在线免费观看| 日韩av一区二区在线观看| 亚洲美女动态图120秒| 亚洲国产精品va在线| 亚洲xxxx3d| 伊人久久久久久久久久久| 色噜噜狠狠狠综合曰曰曰88av| 久久精品91久久久久久再现| 国产日韩中文字幕在线| 91在线免费网站| 亚洲第一国产精品| 国产精品影片在线观看| 国产ts人妖一区二区三区| 51久久精品夜色国产麻豆| 国产日产亚洲精品| 九九热精品在线| 性欧美xxxx交| 91av在线网站| 久久人人爽人人爽人人片亚洲| 日韩欧美亚洲成人| 国产精品第七十二页| 亚洲天堂免费视频| 久久99精品视频一区97| 成人国产在线激情| 91久久精品国产| 欧美激情免费观看| zzjj国产精品一区二区| 久久久女女女女999久久| www.亚洲男人天堂| 亚洲无亚洲人成网站77777| 国产精欧美一区二区三区| 国产91色在线|免| 精品久久久久久久中文字幕| 亚洲成人激情视频| 亚洲网站在线看| 91视频-88av| 日本成熟性欧美| 98视频在线噜噜噜国产| 国产日韩精品一区二区| 95av在线视频| 国产乱人伦真实精品视频| 亚洲国产精品va在线看黑人| 亚洲黄色片网站| 深夜成人在线观看| 欧美激情区在线播放| 国产91精品视频在线观看| 久久久亚洲天堂| 亚洲a∨日韩av高清在线观看| 久久久久久久久国产精品| 欧美日韩亚洲一区二区三区| 亚洲人成电影在线观看天堂色| 不卡中文字幕av| 精品亚洲精品福利线在观看| 成人免费网视频| 国产一区视频在线| 久久精品国产成人精品| 国产ts人妖一区二区三区| 欧美激情欧美激情| 性欧美办公室18xxxxhd| 91久久久久久国产精品| 91精品视频在线| 九九九久久国产免费| 亚洲国产美女精品久久久久∴| 中文字幕免费精品一区| 精品福利在线观看| 国产成人拍精品视频午夜网站| 亚洲国模精品一区| 国产中文字幕91| 亚洲网站在线播放| 国产一区二区黑人欧美xxxx| 亚洲欧美日韩久久久久久| 久久精品国产清自在天天线| 成人免费看吃奶视频网站| 高清欧美一区二区三区| 亚洲成人教育av| 日本精品中文字幕| 日韩二区三区在线| 国产成人午夜视频网址| 91九色国产视频| 欧美最近摘花xxxx摘花| 欧美激情亚洲综合一区| 国产精品一区二区久久| 日韩av电影中文字幕| 久久夜精品va视频免费观看| 91精品国产综合久久香蕉最新版| 自拍偷拍免费精品| 在线视频免费一区二区| 日韩欧美中文在线| 国产精品99久久久久久白浆小说| 精品亚洲aⅴ在线观看| 日韩av在线一区| 日韩中文字幕视频在线| 国产aⅴ夜夜欢一区二区三区| 久久亚洲精品一区二区| 亚洲一区美女视频在线观看免费| 日韩视频在线免费| 91精品国产电影| 欧美亚洲视频在线观看| 美日韩精品免费视频| 欧美体内谢she精2性欧美| 欧美激情亚洲自拍| 欧美一区亚洲一区| 日韩中文字幕久久| 久久这里只有精品99| 亚洲欧美国产日韩天堂区|