NodeJS中的模組載入機制
1) 模組的型別
odeJS模組分為兩類,一類是核心模組,一類是檔案模組。
1,核心模組就是NodeJS標準中提供的模組,如fs、http、net、vm等,官方提供的模組,編譯成了二進位制程式碼,直接可以通過require獲取核心模組,核心模組具有最高的載入優先順序,如果有模組和其命名衝突,nodeJS總會載入核心模組
2,檔案模組則是儲存為單獨的檔案或者資料夾的模組,可能是JS程式碼、JSON或編譯好的C/C++程式碼。在不顯示指定檔案模組副檔名的時候,NodeJS會分別試圖加上.js、.json和.node副檔名
2)檔案模組載入方式
檔案模組的載入有兩種方式,一種是按路徑載入,一種是查詢node——modules資料夾
A:按路徑載入模組
1,如果require引數以“/"開頭,那麼就以絕對路徑的方式查詢模組名稱,例如require(‘/home/byvoid/module’)將會按照優先順序依次嘗試載入/home/byvoid/module.js、/home/byvoid/module.json、/home/byvoid/module.node(所有無後綴的模組載入方式都是按照js/json/node的順序)
2,如果require引數以‘./’或者'../'開頭,則以相對路徑來查詢模組
B:通過查詢node_modules目錄載入模組
如果require引數不以”/","./“,"../”開頭,而該模組又不是核心模組,那麼就要通過node_module載入模組
在node_moduler目錄的外面一層,我們可以直接使用require(‘express’)來代替require('./node_modules/express'),這是node.js模組載入的一個重要特性,通過查詢node_modules了目錄來載入模組
當require遇到一個既不是核心模組,又不是以路徑形式表示的模組名稱時,會試圖在當前目錄下的node_module目錄中查詢是不是有這樣一個模組,如果沒有找到,則會在當前目錄的上一層的node_module目錄中繼續查詢,返回執行這一過程,直到i遇到根目錄位置。舉個例子,我們要在/home/byoid/develop/foo.js中使用require('bar.js')命令,NodeJS會一次查詢:
/home/byvoid/develop/node_module/bar.js
/home/byvoid/node_module/bar.js
/home/node_module/bar.js
/node_module/bar.js
在通常一個工程內會有一些子目錄,當子目錄內的檔案需要訪問到工程共同依賴的模組時,就需要向父目錄上溯