清除 require 缓存

25

我正在尝试按照这里建议的方法从缓存中删除一个模块。

文档中我们可以看到:

require.cache

  • Object

当需要时,这些模块会被缓存在此对象中。 通过从该对象中删除键值,下一个 require 将重新加载该模块。

所以,我创建了一个名为1.js的文件,其中只包含一行:

module.exports = 1;

然后我通过 node shell 要求它:

ionicabizau@laptop:~/Documents/test$ node
> require("./1")
1
> require.cache
{ '/home/ionicabizau/Documents/test/1.js': 
   { id: '/home/ionicabizau/Documents/test/1.js',
     exports: 1,
     parent: 
      { id: 'repl',
        exports: [Object],
        parent: undefined,
        filename: '/home/ionicabizau/Documents/test/repl',
        loaded: false,
        children: [Object],
        paths: [Object] },
     filename: '/home/ionicabizau/Documents/test/1.js',
     loaded: true,
     children: [],
     paths: 
      [ '/home/ionicabizau/Documents/test/node_modules',
        '/home/ionicabizau/Documents/node_modules',
        '/home/ionicabizau/node_modules',
        '/home/node_modules',
        '/node_modules' ] } }
# edited file to export 2 (module.exports = 2;)
> require.cache = {}
{}
> require.cache
{}
> require("./1") // supposed to return 2
1
因此,当我的文件包含“module.exports = 2”并清除缓存时,为什么“require(“./1”)”返回“1”?进行调试时,我看到有一个“Module._cache”对象,在执行“require.cache = {}”时未被清除。
2个回答

43

require.cache是一个公开的缓存对象引用,这个属性不会直接使用,所以更改它不起作用。您需要迭代键并实际删除它们。


啊,现在我明白了我的错误。谢谢! - Ionică Bizău
33
Object.keys(require.cache).forEach(function(key) { delete require.cache[key] })这段代码的作用是:遍历 require.cache 对象的属性,删除每个属性对应的缓存模块。 - Dancrumb
7
有一个名为clear-require的NPM包,它抽象了这个逻辑。 - Gajus
7
“@Gajus 'abstracts this logic'”?哦天啊,这只有一行! - mzalazar
这还有很多内容。https://github.com/sindresorhus/clear-module/blob/master/index.js - Gajus

1
for (var i in require.cache) { delete require.cache[i] }

如果您需要过滤特定的文件,可以使用特定的正则表达式或自定义规则来过滤i

for (var i in require.cache) { if (i.startsWith('src/cache/') )delete require.cache[i] }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接