循环引用在平时的开发过程中大家一定碰到过,同样NODE.JS中也会有这个问题,我们做一个测试
(1)a.js文件
var b = require('../test/b');
module.exports.a = 1;
console.log('a.js get b:' + b.b);
(2)b.js文件
var a = require('../test/a');
console.log('b.js get a:' + a.a);
module.exports.b = 2;
以上的例子中我们在a文件中加载了b文件,同时在b文件中也加载了a文件,很明显的循环依赖情况,如果我们执行a.js会发生什么呢?
结果:
"C:\Program Files (x86)\nodejs\node.exe" a.js
b.js get a:undefined
a.js get b:2
从输出我们可以得到执行顺序
(1)var b = require('../test/b');
(2)var a = require('../test/a');
(3)console.log('b.js get a:' + a.a);
(4)module.exports.b = 2;
(5)console.log('a.js get b:' + b.b);
(6)module.exports.a = 1;
很明显的发现在(3)的时候a.a并没有生成,所以必然为undefined了!那到底为什么没有生成呢?
node在加载模块的时候会为每个新加载的文件创建一个Module对象(假设为a),这个就是我们在a.js代码中看到的module了。在创建a之 后,node会先将 a放到cache中,然后再对它进行加载操作。也就是说,如果在加载a的过程中,有其他的代码(假设为b)require a.js的话,那么b可以从cache中直接取到a的module,但是这个时候的a是不完整的也就是没有完全加载完毕的 a,所以自然就是undefined了。
解决方法:在node加载完成之后再访问需要访问的内容
修改a.js为
module.exports.a = 1;
var b = require('../test/b');
console.log('a.js get b:' + b.b);
可以看到在a.js的module.exports之后再加载b.js模块,这个时候即使b.js中有引用a.js也是完整的创建并且加载完毕的a.js了
运行结果为:
b.js get a:1
a.js get b:2