require.cache 分享
发布于 3 年前 作者 leiwei1991 3816 次浏览 来自 分享

有下面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

@lyt308012546 学习下require的机制 就能明白了

回到顶部