
在 node.js repl 中多次使用 require() 加载同一本地脚本时,后续调用不会重新执行文件代码,而是直接返回缓存结果,导致无法获取最新修改——这是 node.js 模块缓存机制的默认行为。
在 node.js repl 中多次使用 require() 加载同一本地脚本时,后续调用不会重新执行文件代码,而是直接返回缓存结果,导致无法获取最新修改——这是 node.js 模块缓存机制的默认行为。
Node.js 的 require() 方法在首次加载模块(如 require('./script.js'))时,会执行该文件中的全部代码,并将导出对象(module.exports)缓存到 require.cache 中。后续对同一路径的 require() 调用将跳过文件读取与执行,直接返回缓存值——这正是你在 REPL 中修改 script.js 后再次 require() 却看不到更新的原因。
⚠️ 注意:即使你的脚本未显式导出(如仅操作 global.testObject),只要它被 require() 过一次,其顶层代码就只执行一次;后续 require() 不会重跑,因此 global.testObject.cont 仍为初始值。
✅ 正确解决方案:手动清除模块缓存
在 REPL 中,可通过删除 require.cache 中对应模块的条目,强制下一次 require() 重新加载并执行:
// 第一次加载(执行 script.js,初始化 global.testObject)
require('./script.js');
console.log(global.testObject.cont); // "This is sample 1"
// 修改 script.js 文件内容后,执行以下两步:
delete require.cache[require.resolve('./script.js')];
require('./script.js'); // 重新执行!
console.log(global.testObject.cont); // "This is an updated sample 2"
? 关键点说明:
- 使用 require.resolve('./script.js') 获取模块的绝对路径(避免相对路径解析歧义);
- delete require.cache[...] 是标准、安全的清除方式;
- 清除后再次 require() 将触发完整加载流程(读取 → 编译 → 执行 → 缓存)。
? 进阶技巧:封装热重载函数(推荐用于频繁调试)
可在 REPL 中定义快捷函数,提升效率:
// 定义一个可重载的 require 函数
const reload = (path) => {
const absPath = require.resolve(path);
delete require.cache[absPath];
return require(absPath);
};
// 使用示例
reload('./script.js');
? 提示:若脚本依赖其他模块,且你也希望其同步更新,需递归清理依赖缓存(较复杂,一般场景无需);对于纯副作用脚本(如仅设置全局变量),上述方法已完全满足需求。
总结:这不是 bug,而是 Node.js 设计的模块一致性保障机制。理解并合理利用 require.cache,即可在 REPL 中高效迭代调试本地脚本。











