mirror of https://github.com/nodejs/node.git
Fix #1694 Document require() cycles
parent
cb6b9eb19e
commit
dc8f4eed53
|
@ -30,6 +30,60 @@ Variables
|
|||
local to the module will be private. In this example the variable `PI` is
|
||||
private to `circle.js`.
|
||||
|
||||
### Cycles
|
||||
|
||||
When there are circular `require()` calls, a module might not be
|
||||
done being executed when it is returned.
|
||||
|
||||
Consider this situation:
|
||||
|
||||
`a.js`:
|
||||
|
||||
console.log('a starting');
|
||||
exports.done = false;
|
||||
var 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;
|
||||
var 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');
|
||||
var a = require('./a.js');
|
||||
var 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
|
||||
|
||||
If you have cyclic module dependencies in your program, make sure to
|
||||
plan accordingly.
|
||||
|
||||
### Core Modules
|
||||
|
||||
Node has several modules compiled into the binary. These modules are
|
||||
|
|
Loading…
Reference in New Issue