阅读 55

【第25题】node模块的循环加载

题目描述:

node 环境下,有A、B两个模块,两个模块互相调用,打印的输出结果是什么?

// a.js
exports.x = 'a1';
console.log('a.js ', require('./b.js').x);
exports.x = 'a2';

// b.js
exports.x = 'b1';
console.log('b.js ', require('./a.js').x);
exports.x = 'b2';

// main.js
console.log('main.js ', require('./a.js').x);
console.log('main.js ', require('./b.js').x);
复制代码

答案解析:

这个题目涉及node模块的缓存知识,第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的module.exports属性。

require('./example.js');
require('./example.js').message = "hello";
require('./example.js').message
// "hello"
复制代码

上面代码中,连续三次使用require命令,加载同一个模块。第二次加载的时候,为输出的对象添加了一个message属性。但是第三次加载的时候,这个message属性依然存在,这就证明require命令并没有重新加载模块文件,而是输出了缓存。

题目中的输出结果如下:

$ node main.js
b.js  a1
a.js  b2
main.js  a2
main.js  b2
复制代码

运行时,Node返回a.js的不完整版本,后面代码执行,就是取的前面缓存结果了。

关注我

扫一扫 关注我的公众号【前端名狮】,更多精彩内容陪伴你!