Cycles
History
Introduced in: v0.10.0
v0.10.0
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);
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.
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.