在我需要一个模块并执行以下操作后,请说:
var b = require('./b.js');
--- do something with b ---
然后我想拿掉模块b(即清理缓存)。我该怎么做?
原因是我想在不重新启动节点服务器的情况下动态加载/删除或更新模块。任何想法?
-------更多-------- 基于删除require.cache的建议,它仍然不起作用......
what I did are few things:
1) delete require.cache[require.resolve('./b.js')];
2) loop for every require.cache's children and remove any child who is b.js
3) delete b
但是,当我打电话给b时,它仍在那里!它仍然可以访问。除非我这样做:
b = {};
不确定这是否是处理它的好方法。 因为如果以后再次要求('./b.js')b.js被修改。它是否需要旧的缓存b.js(我试图删除)或新的?
-----------更多发现--------------
确定。我做更多的测试和玩代码..这是我发现的:
1) delete require.cache[] is essential. Only if it is deleted,
then the next time I load a new b.js will take effect.
2) looping through require.cache[] and delete any entry in the
children with the full filename of b.js doesn't take any effect. i.e.
u can delete or leave it. However, I'm unsure if there is any side
effect. I think it is a good idea to keep it clean and delete it if
there is no performance impact.
3) of course, assign b={} doesn't really necessary, but i think it is
useful to also keep it clean.
答案 0 :(得分:100)
您可以使用它来删除缓存中的条目:
delete require.cache[require.resolve('./b.js')]
require.resolve()
将找出./b.js
的完整路径,该路径用作缓存密钥。
答案 1 :(得分:2)
最简单的方法之一(尽管在性能方面并不是最好的方法,因为即使不相关的模块的缓存也会被清除),只是清除缓存中的每个模块
请注意,清除*.node
文件(本机模块)的缓存可能会导致不确定的行为,因此不受支持(https://github.com/nodejs/node/commit/5c14d695d2c1f924cf06af6ae896027569993a5c),因此需要有一个if语句以确保不也会从缓存中删除。
for (const path in require.cache) {
if (path.endsWith('.js')) { // only clear *.js, not *.node
delete require.cache[path]
}
}
答案 2 :(得分:1)
花了一些时间尝试清除Vuex存储的Jest测试中的缓存,但是没有运气。好像Jest有自己的机制,不需要手动调用即可删除require.cache。
beforeEach(() => {
jest.resetModules();
});
并进行测试:
let store;
it("1", () => {
process.env.something = true;
store = require("@/src/store.index");
});
it("2", () => {
process.env.something = false;
store = require("@/src/store.index");
});
两家商店都是不同的模块。
答案 3 :(得分:0)
我发现处理无效缓存的最简单方法实际上是重置暴露的缓存对象。从缓存中删除单个条目时,子依赖关系变得有点麻烦,无法迭代。
require.cache = {};

答案 4 :(得分:0)
我发现这对客户端应用程序很有用。我想根据需要导入代码,然后在完成后进行垃圾回收。这似乎有效。我不确定缓存,但是一旦不再有对module
的引用并且CONTAINER.sayHello
已被删除,就应该收集垃圾。
/* my-module.js */
function sayHello { console.log("hello"); }
export { sayHello };
/* somewhere-else.js */
const CONTAINER = {};
import("my-module.js").then(module => {
CONTAINER.sayHello = module.sayHello;
CONTAINER.sayHello(); // hello
delete CONTAINER.sayHello;
console.log(CONTAINER.sayHello); // undefined
});