在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.
网友评论