module.exports vs exports in Node.js

commonjs, javascript, node.js

Solution

Setting `module.exports` allows the `database_module` function to be called like a function when `required`. Simply setting `exports` wouldn't allow the function to be exported because node exports the object `module.exports` references. The following code wouldn't allow the user to call the function.

module.js

The following won't work.

exports = nano = function database_module(cfg) {return;}

The following will work if `module.exports` is set.

module.exports = exports = nano = function database_module(cfg) {return;}

console

var func = require('./module.js');
// the following line will **work** with module.exports
func();

Basically node.js doesn't export the object that `exports` currently references, but exports the properties of what `exports` originally references. Although Node.js does export the object `module.exports` references, allowing you to call it like a function.

2nd least important reason

They set both `module.exports` and `exports` to ensure `exports` isn't referencing the prior exported object. By setting both you use `exports` as a shorthand and avoid potential bugs later on down the road.

Using `exports.prop = true` instead of `module.exports.prop = true` saves characters and avoids confusion.

Problem

I've found the following contract in a Node.js module: ``` module.exports = exports = nano = function database_module(cfg) {...} ``` I wonder what's the difference between `module.exports` and `exports` and why both are used here.

Original source

Related problems