Node.js Module.exports和exports

在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {},用作文件的导出。

创建一个main.js,打印moudle

console.log(module);

module

Node为每个模块提供一个exports变量,指向module.exports。可以通俗的理解为:exports和module.exports指向同一个对象,及exports = module.exports = {};
给Module.exports添加属性类似于给exports添加属性。例如:

module.exports.name = function() { 
console.log('My name is kevin'); 
}; 

同样,exports是这样的 :

exports.name = function() { 
console.log('My name is kevin'); 
}; 

module.exports

(1)程序导出的永远是 module.exports
(2)如果你创建了 既有 exports 又有 module.exports 的模块,那它会返回 module.exports(如下图)


为什么要拿一个 exports 来做 module.exports 的引用?而不是直接使用 module.exports ?
其实是为了保证,模块的初始化环境是干净的。同时也方便我们,即使改变了 module.exports 指向的对象后,依然能沿用 exports的特性。通过exports = module.exports的方法,让其恢复原来的特点。

使用场景

什么情况下使用module.exports,什么时候用exports?
如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports;及你的模块属于“模块实例(module instances)”,就像官方文档中给出的示例那样,那么exports足以满足要求。
最后用官方的一句话,简述两者区别:

If you want the root of your module’s export to be a function (such as a constructor) 
or if you want to export a complete object in one assignment instead of building it one property at a time, 
assign it to module.exports instead of exports.

你可能感兴趣的:(Node.js Module.exports和exports)