在学习node的时候,遇到module.exports和exports,傻傻分不清这2者的区别,通过看文档以为别人的帖子,大概明白了他们之间的区别与联系,汇总一下
在这先做一个说明:
1、module.exports 初始值为一个空对象 {};
2、exports 是指向的 module.exports 的引用;
3、require() 返回的是 module.exports 而不是 exports;
下图就是exports 与module.exports最开始的时候的状态
![](https://img.haomeiwen.com/i7096759/3ac813d164c4bf9a.png)
image.png
重点来了:!!!!
exports只是module.exports的辅助方法。你的模块最终返回module.exports给调用者,而不是exports。
exports所做的事情是收集属性,如果module.exports当前没有任何属性的话,exports会把这些属性赋予
module.exports。如果module.exports已经存在一些属性的话,那么exports中所用的东西都会被忽略。
第一种情况:使用exports
a.js
exports.hi = {
a:1
}
b.js
var result = require('./a')
console.log(result)
//结果是
![](https://img.haomeiwen.com/i7096759/d04de2231736e49c.png)
image.png
第二种情况:
a.js
module.exports = {
b:1
}
b.js
var result = require('./a')
console.log(result)
//结果是
![](https://img.haomeiwen.com/i7096759/90924ab1d8000fed.png)
image.png
第三种情况
a.js
module.exports = {
b:1
}
exports.hi = {
a:1
}
b.js
var result = require('./a')
console.log(result)
//结果是
![](https://img.haomeiwen.com/i7096759/fe55194f78c9a3f1.png)
image.png
第四种情况
a.js
exports.hi = {
a:1
}
module.exports.hello = {
b:1
}
b.js
var result = require('./a')
console.log(result)
//结果是
![](https://img.haomeiwen.com/i7096759/96805287fc625ab7.png)
image.png
第四种情况,就相当于是2者都给exports这个属性添加属性
至于用哪个比较好呢,其实我也不清楚,我个人建议,如果你那个js文件是单独的一个方法等,可以使用exports,如果比较多方法属性等的,可以使用moduel.exports来暴露这个对象。为了保险起见,为了以后鬼知道会不会突然添加几个方法呢,还是用module.exports来比较踏实。
初学node有不对的地方,希望能得到朋友小哥哥,小姐姐们的指出,感谢!
网友评论