Node.js 中 exports 和 module.exports 的区别

导读:本篇文章讲解 Node.js 中 exports 和 module.exports 的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

  1. 每个模块中都有一个 module 对象
  2. module 对象中有一个 exports 对象
  3. 可以把需要导出的成员都挂载到 module.exports 接口对象中
  4. 即以:`moudle.exports.xxx = xxx` 的方式
  5. 但是如果每次都以 `moudle.exports.xxx = xxx` 的方式会很麻烦,因为点儿的太多了
  6. 所以 Node 为了方便,同时在每一个模块中又都提供了一个成员叫:`exports`
  7. 因为`exports === module.exports` 结果为  `true`
  8. 所以对于:`moudle.exports.xxx = xxx` 的方式 完全可以:`expots.xxx = xxx`
  9. 当一个模块需要导出单个成员的时候,这个时候必须使用:`module.exports = xxx` 的方式
  10. 不要使用 `exports = xxx` 不管用
  11. 因为每个模块最终向外 `return` 的是 `module.exports`
  12. 而 `exports` 只是 `module.exports` 的一个引用
  13. 所以即便你为 `exports = xx` 重新赋值,也不会影响 `module.exports`
  14. 但是有一种赋值方式比较特殊:`exports = module.exports` 这个用来重新建立引用关系的
exports.foo = 'bar'  // {foo: bar}

module.exports.a = 123  // {foo: bar, a: 123}

// exports !== module.exports
// 最终 return 的是 module.exports
// 所以无论你 exports 中的成员是什么都没用
// exports 冲洗赋值与 module.exports 断开了联系
exports = {
  a: 456
}

module.exports.foo = 'haha'  // {foo: 'haha', a: 123}

// 没关系,混淆你的   exports再赋值已经对 module.exports 没有影响
exports.c = 456  

// 重新建立了和 module.exports 之间的引用关系了
exports = module.exports

// 由于在上面建立了引用关系,所以这里是生效的
exports.a = 789  // {foo: 'haha', a: 789}

// 前面再牛逼,在这里都全部推翻了,重新赋值
// 最终得到的是 Function  因为最后 return 的是 module.exports
module.exports = function () {
  console.log('hello')   // 因此输出为  hello
}

// 真正去使用的时候:
//    导出多个成员:exports.xxx = xxx
//    导出多个成员也可以:module.exports = {
//                        }
//    导出单个成员:module.exports
// 谁来 require 我,谁就得到 module.exports
// 默认在代码的最后有一句:
// 一定要记住,最后 return 的是 module.exports
// 不是 exports
// 所以你给 exports 重新赋值不管用,
// return module.exports

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/66470.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!