在 commonjs 中,node.js 通过 require.cache 缓存已加载模块,手动删除对应绝对路径的键值对可实现重新加载;需用 require.resolve() 获取路径,避免直接清空 cache 或忽略 esm 不兼容性。

在 CommonJS 模块系统中,Node.js 会把已加载的模块缓存到 require.cache 对象里,避免重复加载和执行。如果你想让模块重新加载(比如开发时热更新、测试中重置状态),可以通过手动删除 require.cache 中对应模块的缓存项来实现。
理解 require.cache 的结构
require.cache 是一个普通对象,键是模块的绝对路径(filename),值是该模块对应的 Module 实例。每个 Module 实例包含 exports、id、filename 等属性。清除缓存的本质,就是从这个对象中删掉对应路径的键值对。
- 模块路径必须是绝对路径,相对路径(如
'./utils')需先解析为绝对路径 - 注意 Windows 下路径分隔符是
\,但require.cache中统一使用正斜杠/或系统原生格式,建议用require.resolve()获取准确路径 - 删除后,下次
require()会重新执行模块代码并生成新缓存
清除单个模块缓存的标准做法
最安全的方式是先用 require.resolve() 获取模块的绝对路径,再从 require.cache 中删除:
const modulePath = require.resolve('./my-module.js');
delete require.cache[modulePath];
// 后续 require 将重新加载
const myModule = require('./my-module.js'); // 执行新副本
注意:如果模块路径含扩展名(如 .js),require.resolve() 返回的就是带扩展的绝对路径;若不写扩展,Node 会按顺序尝试 .js、.json、.node,返回实际匹配的那个路径。
清除多个或匹配路径的模块缓存
有时需要批量清理(例如清空所有 src/ 下的模块),可以用 Object.keys() 遍历缓存,并用字符串匹配或正则筛选:
// 清除所有 src/ 目录下的模块缓存
Object.keys(require.cache).forEach(key => {
if (key.includes('src/')) {
delete require.cache[key];
}
});
// 或者用正则(更精确)
const srcPattern = /\/src\//;
Object.keys(require.cache).forEach(key => {
if (srcPattern.test(key)) {
delete require.cache[key];
}
});
⚠️ 注意:不要直接赋值 require.cache = {},这会清空所有缓存(包括核心模块如 fs、path),可能导致后续代码异常。
注意事项和常见陷阱
手动清除缓存不是“万能热重载”,需配合实际场景谨慎使用:
- 模块内的顶层变量、闭包状态不会自动重置——清除缓存只影响
require()行为,不销毁已有对象引用 - 如果其他模块已引用了旧模块的
exports,那些引用仍指向旧对象,新require返回的是全新对象 - ESM(
import)不支持运行时清除缓存,require.cache仅对 CommonJS 有效 - 某些工具(如 Jest)内部封装了缓存清理逻辑,测试中优先用
jest.resetModules()而非手动操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











