区别
关于二者的关系,你只需要这4点:
- exports 只是 module.exports 的引用,也就是后者的偷懒写法而已,所以,绝大部分情况下,二者没有区别!
- require() 返回的是 module.exports 而不是 exports
- 一旦你给exports重新赋值,它将不再是module.exports的引用,所以无法正常导出;
- 虽然
module.exports
默认值为一个空对象{}
(所以exports
初始值也是 {}),但是它仍然可以导出任意类型数据,比如说只导出一个int数字;
还不太明白,继续看下面2个小例子你马上就明白了!
示例
// a.js
exports.test = {str: 'abc'};
// b.js
var a = require('./a.js');
console.log(a.test.str); // 正常输出 'abc'
错误示例:
// a.js
exports = {str: 'abc'};
// b.js
var a = require('./a.js');
console.log(a); // 输出空的对象: {}
console.log(a.str); // 输出 undefined
以上例子中,由于给exports
整体重新赋值,其不再指向module.exports
,所以无法正确导出,而又由于module.exports
的默认值为{}
,所以当我们输出a.str
时自然提示undefined
。
所以,正确做法是,在exports
前面加上module.
就可以了:
// a.js
module.exports = {str: 'abc'};
// b.js
var a = require('./a.js');
console.log(a); // 输出空的对象: {}
console.log(a.str); // 输出 undefined
建议
无论何时何地都使用module.exports
,这样可以避免一切问题。