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
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
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:
setTimeout(() => { module.exports = { a: 'hello' }; }, 0);
y.js:
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()
:
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.