三段代码区别Node中的exports和module.exports

840 阅读1分钟

在学习Node过程中,对exportsmodule.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()
  } **/

这时你会发现ab函数竟然都被导出,那是不是exportsmodule.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.exportsexports之间的关系有所理解了。当我们从某个模块中导入时,其实导入了module.exports定义的对象,而exportsmodule.exports没有改变导出的对象,即默认导出对象的一个引用。