Fix #1694 Document require() cycles

pull/22966/head
isaacs 2011-09-13 10:59:42 -07:00
parent cb6b9eb19e
commit dc8f4eed53
1 changed files with 54 additions and 0 deletions

View File

@ -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