node.js require() cache - possible to invalidate?

后端 未结 17 1640
我寻月下人不归
我寻月下人不归 2020-11-22 06:52

From the node.js documentation:

Modules are cached after the first time they are loaded. This means (among other things) that every call to require(\'

17条回答
  •  既然无缘
    2020-11-22 07:25

    You can always safely delete an entry in require.cache without a problem, even when there are circular dependencies. Because when you delete, you just delete a reference to the cached module object, not the module object itself, the module object will not be GCed because in case of circular dependencies, there is still a object referencing this module object.

    Suppose you have:

    script a.js:

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

    and script b.js:

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

    when you do:

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

    you will get:

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

    now if you edit your b.js:

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

    and do:

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

    you will get:

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

    ===

    The above is valid if directly running node.js. However, if using tools that have their own module caching system, such as jest, the correct statement would be:

    jest.resetModules();
    

提交回复
热议问题