JavaScript 規格(ECMAScript)沒有定義一套完善的能適用於大多數程式的標準函式庫。 CommonJS 提供了一套 JavaScript 標準函式庫規格。 Node 實作了 CommonJS 規範。
模組基礎
在 Node 中,模組和檔案是一一對應的。我們定義一個模組:
模組的載入
Node 會對已載入的模組進行緩衝,避免再次載入的開銷:
多次載入模組 test.js
當載入檔案沒有後綴時,Node 會嘗試加入後綴並載入:
1..js(JavaScript 原始檔)
2..node(C/C 擴充模組)
3..json(JSON 檔案)
模組主要有幾類:
1.核心模組。核心模組已經被編譯到了 Node 中,我們在其原始碼中的 lib 目錄可以找到這些核心模組。常見的核心模組:net、http、fs 模組等
2.檔案模組。檔案模組透過一個相對或絕對路徑加載,例如我們上面看到的 circle.js
3.自訂模組。自訂模組位於 node_modules 目錄中,我們透過 npm 安裝的各種模組就放置在 node_modules 目錄中
核心模組總是優先被加載,假如有一個自訂模組 http,那麼加載時仍然會加載核心模組 http 而非自訂模組 http。在載入自訂模組時,首先尋找目前目錄下的 node_modules 目錄,而後尋找父目錄下的 node_modules 目錄,以此類推,直到根目錄。
require 載入的模組不是一個文件,而是一個目錄時,這樣的目錄被叫做套件(package)。套件中存在一個名為 package.json 的檔案(套件描述檔),例如:
其中 main 指出需要被載入的模組。如果套件中不存在 package.json 或 package.json 中未指定 main 模組,那麼 Node 將會嘗試載入 index.js、index.node、index.json。
在載入 JavaScript 模組時,被載入的模組被包裹在一個函數中:
每個 JavaScript 模組存取到的 module、exports、__filename、__dirname 等實際上是透過函數參數傳遞進來的。由於這種包裹,才使得模組的局部變數外部無法存取。但有時候也會出現讓人難以理解的問題,例如:
test1.js
test2.js
載入這兩個模組:
exports 作為參數傳遞給模組,我們透過exports.x 自然可以為exports 物件添加屬性(或方法),但直接給exports 賦值(例如,exports = x)僅僅是改變了形參而非實參的值,因此:
1.為 exports 新增屬性時,使用 exports
2.為 exports 賦值時,使用 module.exports
包
依照 CommonJS 的規範,一個完整的包裝應該包含有:
1.package.json 套件描述檔
2.bin 二進位檔案目錄
3.lib JavaScript 程式碼目錄
4.doc 文檔目錄
5.test 測試程式碼目錄
NPM 是一個 Node 的一個套件管理工具。常見用法:
查看指令的文件:
檢視指令 install 的文件。
安裝一個套件:
移除一個包包: