65

比方说,在我需要一个模块并执行以下操作之后:

var b = require('./b.js');
--- do something with b ---

然后我想带走模块b(即清理缓存)。我该怎么做?

原因是我想在不重新启动节点服务器的情况下动态加载/删除或更新模块。任何的想法?

-------- more -------- 根据删除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.
4

5 回答 5

131

您可以使用它来删除它在缓存中的条目:

delete require.cache[require.resolve('./b.js')]

require.resolve()将找出 的完整路径./b.js,该路径用作缓存键。

于 2013-03-27T18:07:45.917 回答
4

最简单的方法之一(尽管在性能方面不是最好的,因为即使是不相关的模块的缓存也会被清除)是简单地清除缓存中的每个模块

请注意,清除*.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]
      }
    }
于 2018-08-16T09:22:24.520 回答
4

花了一些时间尝试在 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");
});

两个商店将是不同的模块。

于 2020-07-20T09:38:16.223 回答
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

});
于 2019-09-15T05:35:34.207 回答
-1

我发现处理使缓存失效的最简单方法实际上是重置暴露的缓存对象。从缓存中删除单个条目时,子依赖项的迭代变得有点麻烦。

require.cache = {};

于 2016-08-01T22:06:29.700 回答