在学习Node过程中,对exports和module.exports有所混淆,所以在弄清楚这两者的区别之后决定用博客记录下两者的区别。
多说不易,先直接上代码,利用exports导出a函数,module.exports导出b函数
text.js
function a (){
}
function b (){
}
exports.a = a
module.exports.b = b
如果我们打印test模块最终导出的对象将会是下列这种情况
const test = require("test.js)
/**
test: {
a: function(),
b: function()
} **/
这时你会发现a和b函数竟然都被导出,那是不是exports和module.exports导出的是一个对象呢?我们来看看下一个代码
function a (){
}
function b (){
}
exports.a = a
module.exports = {
b
}
/**以上的module.exports = {
b
}
等同于以下的代码
const newObj = {
b: b
}
module.exports = newObj
**/
而此时的test.js导出的对象是这样的
const test = require("test.js)
/**
test: {
b: function()
} **/
这时导出的对象中就只有b这一个函数,说明这时module.exports = {b}的{}对象是作为我们test.js最终导出的对象。那就是当我们没有对moudle.exports导出的对象进行更改时,将会导出默认对象,并且exports是默认对象的一个引用。当我们通过module.exports的对象不是默认对象时,exports的会不会改变?来看看下一列代码
function a (){
}
function b (){
}
module.exports = {
b
}
exports.a = a
再次打印导出的对象
const test = require("test.js)
/**
test: {
b: function()
} **/
通过这三次的示例代码,相信已经对module.exports和exports之间的关系有所理解了。当我们从某个模块中导入时,其实导入了module.exports定义的对象,而exports是module.exports没有改变导出的对象,即默认导出对象的一个引用。