先说区别
1.exports = module.exports = {};
2.exports 是 module.exports 的一个引用
3.module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
4.require 引用模块后,返回的是 module.exports 而不是 exports!!!!!
5.exports.xxx 相当于在导出对象上挂属性,该属性对调用模块直接可见
6.exports = 相当于给 exports 对象重新赋值,调用模块不能访问 exports 对象及其属性 如果此模块是一个类,就应该直接赋值 module.exports,这样调用者就是一个类构造器,可以直接 new 实例。
再说例子
例子一:
var name = 'rainbow';
exports.name = name;
exports.sayName = function(){
console.log(name);
}
// 给 exports 赋值相当于给 module.exports 这个空对象添加了两个属性,相当于:
var name = 'rainbow';
module.exports.name = name;
module.exports.sayName = function(){
console.log(name);
}
例子二:
exports = module.exports = somethings
// 等价于
module.exports = somethings
exports = module.exports
// module.exports = somethings 是对 mudole.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,mudole.exports 指向了新的内存块,而exports 还是指向原来的内存块,为了让 module.exports 和 exports 还 是指向同一个内存或者说指向同一个"对象",所以我们就 exports = module.exports.
例子三:
exports = function(){};
// 这样就是重新给 exports 赋值,它将不再是 module.exports 的引用,二者将无任何联系。
例子四:
module.exports.something = function(){};
exports.something = function(){};
// 上面两个方程是等价的
例子五最重要:
// index.js
var something = require('./requireMe');
something();
// requireMe.js
exports.something = function(){
console.log('am a function');
}
// 以上代码会报错,因为 require 出来的 module.exports 是一个object,不能直接执行
//修改方式一
// requireMe.js
module.exports = function(){
console.log('am a function');
}
// 当把代码改成上面这样,就不会报错,因为此时的 module.exports 是一个 function,可以直接执行。
// 修改方式二
// index.js
var something = require('./requireMe');
something.something();
// 因为这时候 require 出来的是一个 object,有一个 something 的属性,所以可以这样调用执行。