Chapter 2 : 模組機制
CommonJS的模組規範
- 模組引用
EX:var math = require('math');
- 模組定義
- 模組識別字
在 Node 引入模組時,需要經歷以下三個步驟:
- 路徑分析
- 檔案定位
- 編譯執行
目錄分析與套件
Node 首先在當前目錄下找尋 package.json (CommonJS 套件規範定義的套件描述檔),接著透過 JSON.parse() 解析套件描述物件,從中取出 main 屬性指定的檔案名稱進行定位。
假如 main 屬性指定的檔名錯誤,或者根本沒有 package.json 檔,Node 會把 index 當作預設的檔案,然後依序尋找 index.js、index.node、index.json。
模組編譯
編譯和執行是含括檔案模組的最後一個階段。定位實際的檔案後,Node 會新建一個模組物件,然後根據路徑載入並編譯。
針對不一樣的副檔名,載入方法也不盡相同,如下:
- .js 文件
透過 fs 模組同步讀取檔案後編譯 - .node 文件
這是用 C/C++ 編寫的擴充檔,透過 dlopen() 方法載入最後編譯而成的檔案 - .json 文件
透過 fs 模組同步讀取檔案後,再以 JSON.parse() 解析返回結果 - 其餘副檔名的文件
都被當成 .js 文件載入
套件與NPM
完全符合CommonJS規範的套件目錄應該包含以下檔案
- package.json:套件描述檔
- bin:存放可執行二進位檔的目錄
- lib:存放 JavaScript 程式碼的目錄
- doc:存放文件的目錄
- test:存放單元測試案例的程式碼
在套件描述檔 (package.json) 的規範中,NPM 實際需要的欄位主要有
- name
- version
- description
- keywords
- repositories
- author
- bin
- main
- scripts
- engines
- dependencies
- devDependencies