require.cache 分享
有下面3个js文件,执行c.js; 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;
c.js :
var a=require('./a.js');
console.log(a); //{ a: 'a from a.js', b: 'b from b.js' }
var b=require('./b.js');
console.log(b); //{ b: 'b from b.js', a: undefined }
why is a undefined in b.js?
在b.js第一次执行var a=require('./a.js').a; 这个a其实是个{};a.js代码还没执行完。
此时b.js已经被缓存了,如何让b.a得到正确的值?
可以这么做:
delete require.cache[require.resolve('./b.js')]
b=require('./b.js')
欢迎大家一起讨论,批评指正。
参考:https://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate
4 回复
无聊, a和b之间再加个公共的js不就行了。
不无聊啊,我很纳闷为什么在a.js没有执行完的时候b.js能拿到a={}这个值,难道模块在未执行完成可以输出内容了? 如果单纯看代码,我感觉是一个死循环。
function Module(id, parent) {
this.exports = {};
}
Module.prototype.require = function(path) {
return Module._load(path, this, /* isMain */ false);
};
Module._load = function(request, parent, isMain) {
var filename = Module._resolveFilename(request, parent, isMain);
// b require a 走的缓存,a.exports 默认为 {}
var cachedModule = Module._cache[filename];
if (cachedModule) {
return cachedModule.exports;
}
}
@lyt308012546 学习下require的机制 就能明白了