Node.js的模塊載入方式與機制

Node.js中模塊能夠經過文件路徑或名字獲取模塊的引用。模塊的引用會映射到一個js文件路徑,除非它是一個Node內置模塊。Node的內置模塊公開了一些經常使用的API給開發者,而且它們在Node進程開始的時候就預加載了。javascript

 

其它的如經過NPM安裝的第三方模塊(third-party modules)或本地模塊(local modules),每一個模塊都會暴露一個公開的API。以便開發者能夠導入。如java

var mod = require('module_name')

此句執行後,Node內部會載入內置模塊或經過NPM安裝的模塊。require函數會返回一個對象,該對象公開的API多是函數,對象,或者屬性如函數,數組,甚至任意類型的JS對象。node

 

這裏列下node模塊的載入及緩存機制npm

  1. 載入內置模塊(A Core Module)
  2. 載入文件模塊(A File Module)
  3. 載入文件目錄模塊(A Folder Module)
  4. 載入node_modules裏的模塊
  5. 自動緩存已載入模塊

 

1、載入內置模塊

Node的內置模塊被編譯爲二進制形式,引用時直接使用名字而非文件路徑。當第三方的模塊和內置模塊同名時,內置模塊將覆蓋第三方同名模塊。所以命名時須要注意不要和內置模塊同名。如獲取一個http模塊json

var http = require('http')

返回的http便是實現了HTTP功能Node的內置模塊。數組

 

2、載入文件模塊

絕對路徑的緩存

var myMod = require('/home/base/my_mod')

 

或相對路徑的函數

var myMod = require('./my_mod')

 

注意,這裏忽略了擴展名「.js」,如下是對等的ui

var myMod = require('./my_mod')
var myMod = require('./my_mod.js')

  

3、載入文件目錄模塊

能夠直接require一個目錄,假設有一個目錄名爲folder,如spa

var myMod = require('./folder')

此時,Node將搜索整個folder目錄,Node會假設folder爲一個包並試圖找到包定義文件package.json。若是folder目錄裏沒有包含package.json文件,Node會假設默認主文件爲index.js,即會加載index.js。若是index.js也不存在,那麼加載將失敗。

 

假如目錄結構以下

 

package.json定義以下

{
    "name": "pack",
    "main": "modA.js"
}

此時 require('./folder') 將返回模塊modA.js。若是package.json不存在,那麼將返回模塊index.js。若是index.js也不存在,那麼將發生載入異常。

 

4、載入node_modules裏的模塊

若是模塊名不是路徑,也不是內置模塊,Node將試圖去當前目錄的node_modules文件夾裏搜索。若是當前目錄的node_modules裏沒有找到,Node會從父目錄的node_modules裏搜索,這樣遞歸下去直到根目錄。

沒必要擔憂,npm命令可以讓咱們很方便的去安裝,卸載,更新node_modules目錄。

 

5、自動緩存已載入模塊

對於已加載的模塊Node會緩存下來,而沒必要每次都從新搜索。下面是一個示例

modA.js

console.log('模塊modA開始加載...')
exports = function() {
    console.log('Hi')
}
console.log('模塊modA加載完畢')

 

init.js

var mod1 = require('./modA')
var mod2 = require('./modA')
console.log(mod1 === mod2) 

 

命令行執行:

node init.js 

 

輸入以下

 

能夠看到雖然require了兩次,但modA.js仍然只執行了一次。mod1和mod2是相同的,即兩個引用都指向了同一個模塊對象。

相關文章
相關標籤/搜索