循环
【Cycles】
当存在循环 require() 调用时,模块在被返回时可能尚未执行完成。
【When there are circular require() calls, a module might not have finished
executing when it is returned.】
考虑这种情况:
【Consider this situation:】
a.js:
console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done'); b.js:
console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done'); main.js:
console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done); 当 main.js 加载 a.js 时,a.js 又会加载 b.js。此时,b.js 尝试加载 a.js。为了防止无限循环,会向 b.js 模块返回 a.js 导出对象的未完成副本。随后 b.js 完成加载,并将其 exports 对象提供给 a.js 模块。
【When main.js loads a.js, then a.js in turn loads b.js. At that
point, b.js tries to load a.js. In order to prevent an infinite
loop, an unfinished copy of the a.js exports object is returned to the
b.js module. b.js then finishes loading, and its exports object is
provided to the a.js module.】
当 main.js 加载完这两个模块时,它们都已经完成了。因此,该程序的输出将是:
【By the time main.js has loaded both modules, they're both finished.
The output of this program would thus be:】
$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done = true, b.done = true 需要仔细规划,以确保循环模块依赖在应用中能够正确工作。
【Careful planning is required to allow cyclic module dependencies to work correctly within an application.】