node.js require()缓存-可能无效?
从node.js文档中:
第一次加载模块后将对其进行缓存。这意味着(除其他事项外)每次对require(’foo’)的调用都将获得与返回的对象完全相同的对象(如果它将解析为相同的文件)。
有没有办法使此缓存无效?即对于单元测试,我希望每个测试都可以在一个新对象上进行。
回答:
即使存在循环依赖关系,也始终可以安全地删除require.cache中的条目,而不会出现问题。因为在删除时,您仅删除对缓存的模块对象的引用,而不是对模块对象本身的引用,所以不会对GC对象进行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.resetModules();
以上是 node.js require()缓存-可能无效? 的全部内容, 来源链接: utcz.com/qa/397592.html