var Person = function() {
this.name = 'Samuel';
}
module.exports = 'I am a string';//module.exports被声明指向了一个字符串
exports.one = 'Shervesi';
User.js
var P = require('./Person.js');
console.log(P);//'I am a string' //这是module.exports所提供的接口指向的
console.log(P.one);//这里会出现类型错误,因为负责暴露接口的module.exports已经导出了一个字符串,即是一个常量,因此不能携带one属性,exports所修饰的one属性被‘干掉’。
让这个模块更加纯粹的写法。
module.exports是require()方法调用模块的接口,而exports可以给模块添加更多的方法,而exports返回的是一个实例化对象,指向module.exports
比如对于一个构造函数来说:
Person.js
Use.js
因此可以将exports理解为给模块进行最后修饰的方法;
而module.exports则负责暴露一个接口供require()方法调用,若module.exports没有被声明指向,那它就默认的导出exports所指向的对象,如这样一个场景:
Person.js
User.js
总结:
module.exports是模块导出的仲裁,它决定到底导出一个什么东西,本质上就是提供给require()方法的一个返回值,因此它可以是任何js基本类型(包括null);
exports是给导出模块进行修饰的辅助方法,但受module.exports的仲裁,决定模块是否能具有这个属性。