前言
Node.js 模块系统是采用 CommonJS 模块规范的。每个文件视为一个独立的模块。使用 require 导入模块,使用 module.exports 和 exports 导出模块。
那么 module.exports 和 exports 的区别在哪里呢?
module.exports
- module.exports 就是 require() 的返回值
- module.exports 是模块系统自动创建的,且初始化为空对象 {}
exports 快捷方式
- exports 是为了方便快捷创建的变量,指向 module.exports 的引用
说明
可以看一下 Node 文档 中的一段解释
1 | function require(/* ... */) { |
所以其实两者的关系是:
1 | exports = module.exports = {...} |
module.exports 是一个对象,exports 是对 module.exports 的引用,即他们指向同一块内存。如图所示:
所以如果对 exports (或者 module.exports) 的对象修改,就是对他们共同指向的内存的内容做修改,两者都会影响。
1 | // 这样是可以的 |
但是如果直接将 exports (或者 module.exports) 指向一个值,则会使 exports (或者 module.exports) 指向新的内存块,等于断开了 exports 和 module.exports 的联系。下面的两种情况,导出的值要看 module.exports 的值
1 | // 直接赋值 exports 是无效的,导出的模块就不是 exports 的值了 |
这时候,我们可以 exports = module.exports 让 exports 重新指向 module.exports
总结
对于 module.exports 和 exports 我们只需要记住三点就行了:
- module.exports 是模块系统自动创建的,且初始化为空对象 {}
- require() 返回的是 module.exports 的值
- exports 指向 module.exports 的引用
在使用中,建议使用 module.exports 来导出模块,这样可以应对所有情况。
如果这篇文章对你有帮助,那么不妨?
- 本文链接: https://blog.hhking.cn/2018/08/23/exports-vs-moduleexports/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!