通常,在Node.js里導入是通過 require函數調用進行的。
Node.js會根據 require的是相對路徑還是非相對路徑做出不同的行為。
相對路徑
相對路徑很簡單。 例如,假設有一個文件路徑為 /root/src/moduleA.js,包含了一個導入
var x = require("./moduleB");
Node.js以下面的順序解析這個導入:
- 檢查/root/src/moduleB.js文件是否存在。
- 檢查/root/src/moduleB目錄是否包含一個package.json文件,且package.json文件指定了一個"main"模塊。 在我們的例子里,如果Node.js發現文件 /root/src/moduleB/package.json包含了{ "main": "lib/mainModule.js" },那么Node.js會引用/root/src/moduleB/lib/mainModule.js。
- 檢查/root/src/moduleB目錄是否包含一個index.js文件。 這個文件會被隱式地當作那個文件夾下的"main"模塊。
非相對路徑
非相對模塊名的解析是個完全不同的過程。
Node會在一個特殊的文件夾 node_modules里查找你的模塊。
node_modules可能與當前文件在同一級目錄下,或者在上層目錄里。
Node會向上級目錄遍歷,查找每個 node_modules直到它找到要加載的模塊。
假設/root/src/moduleA.js里使用的是非相對路徑導入:
var x = require("moduleB");
Node則會以下面的順序去解析 moduleB,直到有一個匹配上。
/root/src/node_modules/moduleB.js
/root/src/node_modules/moduleB/package.json (如果指定了"main"屬性)
/root/src/node_modules/moduleB/index.js
/root/node_modules/moduleB.js
/root/node_modules/moduleB/package.json (如果指定了"main"屬性)
/root/node_modules/moduleB/index.js
/node_modules/moduleB.js
/node_modules/moduleB/package.json (如果指定了"main"屬性)
/node_modules/moduleB/index.js
注意Node.js在步驟(4)和(7)會向上跳一級目錄。