HiveBrain v1.2.0
Get Started
← Back to all entries
principlejavascriptCritical

module.exports vs exports in Node.js

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
moduleexportsnode

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.

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.

Code Snippets

exports = nano = function database_module(cfg) {return;}
module.exports = exports = nano = function database_module(cfg) {return;}
var func = require('./module.js');
// the following line will **work** with module.exports
func();

Context

Stack Overflow Q#7137397, score: 462

Revisions (0)

No revisions yet.