Node 的 require 缓存机制是怎样的?循环依赖会怎样?

require 加载模块后会把 module.exports 缓存到 require.cache 中,同进程内第二次 require 直接返回缓存(不会重复执行文件),因此模块顶层代码只跑一次。

delete require.cache[require.resolve('./x.js')] // 强制重新加载

循环依赖:Node 在加载 A(A 引用 B)时会先执行 A,遇到 require(B) 转去执行 B,若 B 又 require(A),此时 A 尚未执行完,拿到的是不完整的 module.exports(通常是个空对象或已导出的部分)。

// a.js
exports.done = false
const b = require('./b')   // b 此时 require(a) 拿到 { done: false }
exports.done = true
// 结论:循环依赖下拿到的是「半截导出」,应避免,或改用函数/延迟引用

ESM 对循环依赖处理更优(用 live binding,能拿到最终值)。

同分类其他题目