最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年06月24日 10:40:19   投稿:junjie  
這篇文章主要介紹了Node.js中require的工作原理淺析,通過分析node.js的源碼得到本文,需要的朋友可以參考下

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

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

module.js

復(fù)制代碼 代碼如下:

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

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

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

Module._load

復(fù)制代碼 代碼如下:

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負責加載新的模塊和管理模塊的緩存。緩存加載的每個模塊減少冗余文件的讀取次數(shù),并可以顯著地加快您應(yīng)用程序的速度。此外,共享模塊實例允許單例特性的模塊,保持在項目中的狀態(tài)。

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

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

module._compile

復(fù)制代碼 代碼如下:

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
};

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

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

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

復(fù)制代碼 代碼如下:

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

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

結(jié)論

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

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

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

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

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

相關(guān)文章

  • nodejs利用readline提示輸入內(nèi)容實例代碼

    nodejs利用readline提示輸入內(nèi)容實例代碼

    這篇文章主要給大家介紹了關(guān)于nodejs利用readline提示輸入內(nèi)容的相關(guān)資料,Readline是Node.js里實現(xiàn)標準輸入輸出的封裝好的模塊,通過這個模塊我們可以以逐行的方式讀取數(shù)據(jù)流,需要的朋友可以參考下
    2021-07-07
  • 使用Node.js的async和await進行異步編程

    使用Node.js的async和await進行異步編程

    使用異步編程可以提高Node.js應(yīng)用程序的性能,而async和await是Node.js中實現(xiàn)異步編程的一種簡單且易于使用的方式,可以幫助開發(fā)者避免回調(diào)地獄和處理異步操作時的錯誤
    2023-05-05
  • node.js實現(xiàn)的裝飾者模式示例

    node.js實現(xiàn)的裝飾者模式示例

    這篇文章主要介紹了node.js實現(xiàn)的裝飾者模式,簡單說明了裝飾者模式的原理、功能并結(jié)合實例形式給出了node.js裝飾者模式的實現(xiàn)方法,需要的朋友可以參考下
    2017-09-09
  • Node.js從字符串生成文件流的實現(xiàn)方法

    Node.js從字符串生成文件流的實現(xiàn)方法

    這篇文章主要介紹了Node.js從字符串生成文件流的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • node.js 使用 net 模塊模擬 websocket 握手進行數(shù)據(jù)傳遞操作示例

    node.js 使用 net 模塊模擬 websocket 握手進行數(shù)據(jù)傳遞操作示例

    這篇文章主要介紹了node.js 使用 net 模塊模擬 websocket 握手進行數(shù)據(jù)傳遞操作,結(jié)合實例形式分析了node.js基于net模塊模擬 websocket握手相關(guān)原理及進行數(shù)據(jù)傳遞具體操作技巧,需要的朋友可以參考下
    2020-02-02
  • Nodejs--post的公式詳解

    Nodejs--post的公式詳解

    本篇文章主要介紹了Nodejs--post公式的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Node.js+ELK日志規(guī)范的實現(xiàn)

    Node.js+ELK日志規(guī)范的實現(xiàn)

    這篇文章主要介紹了Node.js+ELK日志規(guī)范的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 搭建pomelo 開發(fā)環(huán)境

    搭建pomelo 開發(fā)環(huán)境

    Pomelo是基于 Node.js 的高性能、分布式游戲服務(wù)器框架。它包括基礎(chǔ)的開發(fā)框架和相關(guān)的擴展組件(庫和工具包),可以幫助你省去游戲開發(fā)枯燥中的重復(fù)勞動和底層邏輯的開發(fā)。Pomelo不但適用于游戲服務(wù)器開發(fā),也可用于開發(fā)高實時 Web 應(yīng)用
    2014-06-06
  • nodejs操作mongodb的增刪改查功能實例

    nodejs操作mongodb的增刪改查功能實例

    這篇文章主要介紹了nodejs操作mongodb的增刪改查功能,簡單分析了mongodb模塊的安裝并結(jié)合實例形式分析了nodejs操作mongodb數(shù)據(jù)庫進行增刪改查的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • 輕松創(chuàng)建nodejs服務(wù)器(9):實現(xiàn)非阻塞操作

    輕松創(chuàng)建nodejs服務(wù)器(9):實現(xiàn)非阻塞操作

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(9):實現(xiàn)非阻塞操作,本系列文章會教你一步一步創(chuàng)建一個完整的服務(wù)器,要的朋友可以參考下
    2014-12-12

最新評論

增城市| 定远县| 上蔡县| 从江县| 织金县| 威远县| 佛教| 阳春市| 禹城市| 原平市| 临颍县| 灯塔市| 临夏县| 砚山县| 江川县| 巨鹿县| 开封市| 临城县| 日土县| 万年县| 田阳县| 吉木萨尔县| 石楼县| 七台河市| 东明县| 禹州市| 清镇市| 洛浦县| 伊吾县| 田林县| 赤壁市| 泰州市| 讷河市| 北流市| 旬邑县| 安仁县| 南涧| 彰化市| 邯郸市| 拉萨市| 崇文区|