一、概述
在 Node。js 模組系統中,每個檔案都被視為一個獨立的模組;
npm install 執行完畢後,我們可以在 nodemodules 中看到所有依賴的包。雖然使用者無需關注這個目錄裡的資料夾結構細節,只管在業務程式碼中引用依賴包即可;node_modules是安裝node後用來存放用包管理工具下載安裝的包的資料夾。比如webpack、gulp、grunt這些工具。在node。js中模組與檔案是一一對應的,也就是說一個node。js檔案就是一個模組。
二、模組型別
node。js中模組有兩種型別:核心模組和檔案模組;
三、核心模組
Node。js 核心模組會被編譯成二進位制,核心模組定義在 Node。js 原始碼的
lib/
目錄下,
require()
總是會
優先
載入核心模組;
核心模組直接使用名稱獲取:
var http=require(‘http’);
四、檔案模組
如果按確切的檔名沒有找到模組,則 Node。js 會嘗試帶上
。js
、
。json
或
。node
拓展名再載入。
const circle = require(‘。/circle。js’);console。log(`半徑為 4 的圓的面積是 ${circle。area(4)}`);
1、。js 檔案會被解析為 JavaScript 文字檔案, 。json 檔案會被解析為 JSON 文字檔案。 。node 檔案會被解析為透過 process。dlopen() 載入的編譯後的外掛模組。
2、以 ‘/’ 為字首的模組是檔案的絕對路徑。 例如, require(‘/home/marco/foo。js’) 會載入 /home/marco/foo。js 檔案。
3、以 ‘。/’ 為字首的模組是相對於呼叫 require() 的檔案的。 也就是說, circle。js 必須和 foo。js 在同一目錄下以便於 require(‘。/circle’) 找到它。
4、當沒有以 ‘/’、 ‘。/’ 或 ‘。。/’ 開頭來表示檔案時,這個模組必須是一個核心模組或載入自 node_modules 目錄。
5、如果給定的路徑不存在,則 require() 會丟擲一個 code 屬性為 ‘MODULE_NOT_FOUND’ 的 Error。
五、目錄模組
可以把程式和庫放到一個單獨的目錄,然後提供一個單一的入口來指向它。把目錄遞給
require()
作為一個引數,有三種方式:
1、第一種方式是在根目錄下建立一個
package。json
檔案,並指定一個
main
模組。 例子,
package。json
檔案類似:
{ “name” : “some-library”, “main” : “。/lib/some-library。js” }
如果這是在
。/some-library
目錄中,則
require(‘。/some-library’)
會試圖載入
。/some-library/lib/some-library。js
。
這就是 Node。js 處理
package。json
檔案的方式。
如果目錄裡沒有
package。json
檔案,或者
‘main’
入口不存在或無法解析,則 Node。js 將會試圖載入目錄下的
index。js
或
index。node
檔案。 例如,如果上面的例子中沒有
package。json
檔案,則
require(‘。/some-library’)
會試圖載入:
。/some-library/index。js
。/some-library/index。node
2、如果傳遞給
require()
的模組識別符號不是一個核心模組,也沒有以
‘/’
、
‘。。/’
或
‘。/’
開頭,則 Node。js 會從當前模組的父目錄開始,嘗試從它的
/node_modules
目錄里加載模組。 Node。js 不會附加
node_modules
到一個已經以
node_modules
結尾的路徑上。如果還是沒有找到,則移動到再上一層父目錄,直到檔案系統的根目錄。
例如:如果在
‘/home/ry/projects/foo。js’
檔案裡呼叫了
require(‘bar。js’)
,則 Node。js 會按以下順序查詢:
/home/ry/projects/node_modules/bar。js
/home/ry/node_modules/bar。js
/home/node_modules/bar。js
/node_modules/bar。js
3、從全域性目錄載入
如果
NODE_PATH
環境變數被設為一個以冒號分割的絕對路徑列表,則當在其他地方找不到模組時 Node。js 會搜尋這些路徑;
$HOME/。node_modules
$HOME/。node_libraries
$PREFIX/lib/node