📌  相关文章
📜  NodeJS中module.exports和exports的区别(1)

📅  最后修改于: 2023-12-03 15:03:16.144000             🧑  作者: Mango

NodeJS中module.exports和exports的区别

在NodeJS中,模块化是一种常见的编程模式,通过模块化,我们可以将代码分拆成多个文件,每个文件都是一个模块,每个模块是独立的、可重用的。

在模块化中,module.exports和exports都是用于将模块中的变量、函数或类暴露给其他模块使用的方式,但是它们有一些区别。

module.exports

module.exports是NodeJS中的一个特殊对象,用于导出模块中的变量、函数或类。如果我们导出的是一个变量或函数,则可以直接将其赋值给module.exports,如下所示:

// math.js
function add(a, b) {
  return a + b;
}

module.exports = add;

在另一个模块中,我们可以通过require函数获取到math.js中导出的add函数,并使用它:

// main.js
const add = require('./math.js');
console.log(add(1, 2)); // 输出 3

我们也可以使用module.exports导出一个对象,如下所示:

// math.js
module.exports = {
  add: function(a, b) {
    return a + b;
  },
  substract: function(a, b) {
    return a - b;
  }
};

在另一个模块中,我们可以通过require函数获取到math.js中导出的对象,如下所示:

// main.js
const math = require('./math.js');
console.log(math.add(1, 2)); // 输出 3
console.log(math.subtract(3, 2)); // 输出 1
exports

exports是module.exports的一个别名,它是一个空对象,它指向module.exports。它是为了让我们在编写模块的时候更加方便,可以直接向exports对象上添加属性和方法。

例如,我们可以使用exports对象导出一个变量或函数,如下所示:

// math.js
exports.add = function(a, b) {
  return a + b;
};

在另一个模块中,我们可以通过require函数获取到math.js中导出的对象,并使用它:

// main.js
const math = require('./math.js');
console.log(math.add(1, 2)); // 输出 3

需要注意的是,如果我们直接将exports对象赋值为一个函数或类,则module.exports会失效,如下所示:

// math.js
exports = function(a, b) {
  return a + b;
};

在另一个模块中,再次使用require函数获取到math.js中导出的对象时,我们得到的是一个空对象,而不是预期中的函数:

// main.js
const math = require('./math.js');
console.log(math); // 输出 {}

因此,建议我们在编写模块时,使用module.exports代替exports来导出模块中的变量、函数或类。

总结

module.exports和exports都可以用于导出模块中的变量、函数或类,但是它们有一些区别。module.exports是一个特殊对象,它是真正导出模块中变量、函数或类的对象,而exports是module.exports的一个别名,它是一个空对象,通过向它添加属性和方法来导出模块中的变量、函数或类。因此,建议我们在编写模块时,使用module.exports代替exports来导出模块中的变量、函数或类。