小编典典

node.js 需要()缓存 - 可能无效?

all

从 node.js 文档中:

模块在第一次加载后被缓存。这意味着(除其他外)每次调用 require(‘foo’) 都将返回完全相同的对象,如果它会解析为同一个文件。

有没有办法使这个缓存失效?即对于单元测试,我希望每个测试都在一个新的对象上工作。


阅读 106

收藏
2022-03-28

共1个答案

小编典典

即使存在循环依赖项,您也始终可以安全地删除 require.cache
中的条目而不会出现问题。因为当你删除的时候,你只是删除了对缓存模块对象的引用,而不是模块对象本身,模块对象不会被GC,因为在循环依赖的情况下,仍然有一个对象在引用这个模块对象。

假设你有:

脚本 a.js:

var b=require('./b.js').b;
exports.a='a from a.js';
exports.b=b;

脚本 b.js:

var a=require('./a.js').a;
exports.b='b from b.js';
exports.a=a;

当你这样做时:

var a=require('./a.js')
var b=require('./b.js')

你会得到:

> a
{ a: 'a from a.js', b: 'b from b.js' }
> b
{ b: 'b from b.js', a: undefined }

现在如果你编辑你的 b.js:

var a=require('./a.js').a;
exports.b='b from b.js. changed value';
exports.a=a;

并做:

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

你会得到:

> a
{ a: 'a from a.js', b: 'b from b.js' }
> b
{ b: 'b from b.js. changed value',
  a: 'a from a.js' }

===

如果直接运行 node.js,以上是有效的。但是,如果使用具有自己的模块缓存系统的工具,例如 jest ,正确的语句应该是:

jest.resetModules();
2022-03-28