Node.js 模塊導入的基本流程,主要是 CommonJS 模塊加載機制(即使用 require()
)的內部執行步驟。下面我用清晰的結構給你梳理一下這個過程:
? Node.js 模塊導入的基本流程(使用 require()
)
const someModule = require('./someModule');
👣 加載流程詳解:
① 解析模塊路徑
- Node.js 會先判斷傳入的是:
- 核心模塊(如
fs
,http
等); - 第三方模塊(node_modules 中找);
- 相對路徑模塊(以
./
或../
開頭); - 絕對路徑模塊(如
/Users/...
)。
- 核心模塊(如
② 定位文件(模塊路徑解析)
- 以相對路徑為例:
require('./someModule')
,Node.js 會嘗試依次查找以下幾種形式:
./someModule.js
./someModule.json
./someModule.node
./someModule/index.js # 如果是目錄
③ 緩存檢查
- Node.js 會先查看該模塊是否已在 緩存 中(
require.cache
)。 - 如果存在緩存,則直接返回緩存結果(即模塊導出的對象)。
④ 編譯模塊
- Node.js 根據不同文件類型執行不同的加載方式:
文件類型 | 加載方式 |
---|---|
.js | 作為 JavaScript 代碼加載(包一層函數) |
.json | 使用 JSON.parse() 解析為對象 |
.node | 使用 C++ 插件方式加載(動態鏈接庫) |
- 對于
.js
文件,Node.js 會將模塊代碼包裝成如下形式:
(function(exports, require, module, __filename, __dirname) {// 原始模塊代碼
})
這叫做 模塊包裝(Module Wrapper),讓模塊擁有自己的作用域。
⑤ 執行模塊代碼
- 在模塊包裝完成后,Node.js 執行模塊代碼,并把
module.exports
作為結果返回。
⑥ 返回 exports
對象
- 最終,
require()
返回的是module.exports
的內容。
💡 一個完整的生命周期圖示(簡略):
require() 調用↓
路徑解析↓
緩存檢查(require.cache)↓
文件定位(.js/.json/.node)↓
模塊包裝(function wrapper)↓
模塊執行(module.exports)↓
結果返回
🧠 補充:模塊緩存細節
- 所有加載過的模塊都會被緩存(除非手動清理):
delete require.cache[require.resolve('./someModule')];