关于node.js中module.exports 和 exports的区别
本文由 小茗同学 发表于 2016-11-02 浏览(2856)
最后修改 2017-04-25 标签:nodejs module exports

区别

关于二者的关系,你只需要这4点:

  1. exports 只是 module.exports 的引用,也就是后者的偷懒写法而已,所以,绝大部分情况下,二者没有区别!
  2. require() 返回的是 module.exports 而不是 exports
  3. 一旦你给exports重新赋值,它将不再是module.exports的引用,所以无法正常导出;
  4. 虽然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,这样可以避免一切问题。