module.exports
The module.exports
object is created by the Module system. Sometimes this is not acceptable; many want their module to be an instance of some class. To do this, assign the desired export object to module.exports
. Note that assigning the desired object to exports
will simply rebind the local exports
variable, which is probably not what you want to do.
For example suppose we were making a module called a.js
1 2 3 4 5 6 7 8 9 | const EventEmitter = require( 'events' ); module.exports = new EventEmitter(); // Do some work, and after some time emit // the 'ready' event from the module itself. setTimeout(() => { module.exports.emit( 'ready' ); }, 1000); |
Then in another file we could do
1 2 3 4 | const a = require( './a' ); a.on( 'ready' , () => { console.log( 'module a is ready' ); }); |
Note that assignment to module.exports
must be done immediately. It cannot be done in any callbacks. This does not work:
x.js:
1 2 3 | setTimeout(() => { module.exports = { a: 'hello' }; }, 0); |
y.js:
1 2 | const x = require( './x' ); console.log(x.a); |
exports alias
The exports
variable that is available within a module starts as a reference to module.exports
. As with any variable, if you assign a new value to it, it is no longer bound to the previous value.
To illustrate the behavior, imagine this hypothetical implementation of require()
:
1 2 3 4 5 6 7 8 9 10 | function require(...) { // ... ((module, exports) => { // Your module code here exports = some_func; // re-assigns exports, exports is no longer // a shortcut, and nothing is exported. module.exports = some_func; // makes your module export 0 })(module, module.exports); return module; } |
As a guideline, if the relationship between exports
and module.exports
seems like magic to you, ignore exports
and only use module.exports
.
Please login to continue.