
在 Node.js REPL 中多次调用 require() 不会重新执行脚本,因为模块被缓存;需手动清除缓存才能加载最新代码。
在 node.js repl 中多次调用 `require()` 不会重新执行脚本,因为模块被缓存;需手动清除缓存才能加载最新代码。
Node.js 的模块系统默认采用单次加载、永久缓存机制:首次 require('script.js') 时,文件被解析、执行,并将导出对象(module.exports)存入 require.cache;后续同路径 require() 直接返回缓存结果,不会重新读取文件或执行代码——这正是你修改 script.js 后 testObject.cont 未更新的根本原因。
值得注意的是,你的示例脚本并未显式导出任何内容(即未设置 module.exports 或 exports),而是直接向 global 对象挂载变量。这种写法虽能“生效”,但违背模块封装原则,且仍受缓存影响:因模块标识符(filename)未变,Node 认为“同一模块无需重载”,故 global.testObject 的初始化逻辑(包括赋值 "This is sample 1")仅执行一次。
✅ 正确解决方案:清除模块缓存后重新加载
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
// 假设 script.js 位于当前目录
const path = require('path');
const scriptPath = path.resolve('./script.js');
// 1. 删除 require.cache 中对应模块的缓存项
delete require.cache[scriptPath];
// 2. 重新 require(此时会重新读取并执行文件)
require(scriptPath);
console.log(testObject.cont); // 输出: "This is an updated sample 2"⚠️ 关键注意事项:
- 必须使用绝对路径(如 path.resolve('./script.js'))匹配 require.cache 中的键,相对路径(如 'script.js')会导致删除失败;
- 若脚本依赖其他模块,其子模块缓存不会自动清除,需递归处理(生产环境建议用专用工具如 require-reload);
- 频繁手动清缓存易出错,开发调试推荐替代方案:
• 使用 node --watch(Node.js 20.6+ 内置热重载);
• 在 REPL 中启用 repl 模块的 setupHistory 并配合外部编辑器;
• 将逻辑封装为函数导出(如 module.exports = () => { ... }),每次调用函数而非 require。
总结:require() 的缓存行为是 Node.js 的设计特性,非 Bug。理解 require.cache 机制并合理运用 delete require.cache[absPath],即可在 REPL 中高效迭代调试本地脚本。

















