nodejs-require-cache

  目录

nodejs中require缓存处理

nodejs-require-cache

简述

在使用nodejs的require一个模块的时候,这个模块已经被缓存了起来,如果再次require这个模块,是从缓存中取出的。
这个有点像设计模式里的单例模式,只有这么一个实例,无论new多少个实例出来,返回的都是第一次的实例。
如果有这样的一个需求:
引入一个模块后,对这个模块里的内容进行了更改,正常来说再次引入这个模块,里边的内容是已经更改过的,但不想要改过的,想要一个新的,该如何处理呢?
这里需要了解下require的cache。

实例demo

1
2
3
4
5
// a.js
module.exports = {
name: 'a',
count: 1
}
1
2
3
4
5
// b.js
module.exports = {
name: 'b',
count: 10
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// index.js
var a = require('./a');
var b = require('./b');
console.log('a moule--->', a.count);
console.log('b moule--->', b.count);
a.count = 5;
b.count = 20;
console.log('a plus 5 moule--->', a.count);
console.log('b plus 20 moule--->', b.count);
var newA = require('./a');
var NewB = require('./b');
console.log('new a moudle--->', newA.count);
console.log('new b moudle--->', NewB.count);
// 进行cache处理
console.log(Object.prototype.toString.call(require.cache)); // require.cache是一个对象
Object.keys(require.cache).forEach(key=> {
console.log(require.resolve(key)); // require.resolve(key)可以把相对路径转成绝对路径,使用更安全
// require.resolve('./a.js');
if(key.includes('a.js')) {
delete require.cache[require.resolve(key)];
}
});
console.log(require.cache);
var cacheA = require('./a');
var cacheB = require('./b');
console.log('new a moudle cache--->', cacheA.count);
console.log('new b moudle cache--->', cacheB.count);

总结

require.cache包含了当前所有的缓存模块,是一个对象{},key是文件路径
require.resolve(‘./a.js’),可以将相对路径转成绝对路径,key就是一个绝对路径
delete require.cache[key],清除掉了对应路径的缓存模块