返回

exports 和 module.exports: 理解概念及其使用原因

前端

exports 和 module.exports 是 JavaScript 中两个重要的概念,特别是在 Node.js 模块系统中。这两个变量允许你在 JavaScript 模块之间共享数据和功能,从而创建可重用和可维护的代码。然而,它们之间存在着一些细微差别,可能会让初学者感到困惑。

什么是 exports?

exports 是一个特殊的对象,允许你从一个 JavaScript 模块中导出变量、函数或类。当你想在其他模块中使用这些实体时,你可以通过 require() 函数来导入它们。值得注意的是,exports 对象不是一个真正的 JavaScript 对象,而是一个指向 module.exports 对象的引用。这并不是说它们是完全相同的,它们之间存在着一些差异。

什么是 module.exports?

module.exports 是一个 JavaScript 对象,允许你从一个模块中导出变量、函数或类。与 exports 不同,module.exports 是一个真正的 JavaScript 对象,因此你可以直接赋值给它。当你想导出多个实体时,你可以使用 module.exports 来导出它们。

exports 和 module.exports 的区别

虽然 exports 和 module.exports 都是用来导出实体,但它们之间存在着一些细微差别:

  • 类型: exports 是一个特殊的对象,而 module.exports 是一个真正的 JavaScript 对象。
  • 赋值: 你可以直接给 module.exports 赋值,而不能直接给 exports 赋值。
  • 默认导出: 如果没有明确地导出任何内容,module.exports 会被默认导出一个空对象,而 exports 不会。
  • 导出多个实体: 你可以使用 module.exports 来导出多个实体,而 exports 不允许你这样做。

何时使用 exports 和 module.exports?

一般来说,建议使用 module.exports 来导出实体,因为它更灵活、更强大。如果你需要导出一个空对象或在其他模块中使用 exports 对象本身,那么你可以使用 exports。

导出实体的示例

以下是一些导出实体的示例:

// 导出一个变量
module.exports.name = "John Doe";

// 导出一个函数
module.exports.greet = function() {
  console.log("Hello, world!");
};

// 导出一个类
module.exports.Person = class {
  constructor(name) {
    this.name = name;
  }

  greet() {
    console.log("Hello, my name is " + this.name);
  }
};

导入实体的示例

以下是一些导入实体的示例:

// 从另一个模块导入变量
const name = require("./person").name;

// 从另一个模块导入函数
const greet = require("./person").greet;

// 从另一个模块导入类
const Person = require("./person").Person;

总结

exports 和 module.exports 是 JavaScript 中用来导出实体的两个重要概念。它们之间存在着一些细微差别,但一般来说,建议使用 module.exports 来导出实体。通过理解这些概念,你将能够编写出更清晰、更可维护的 JavaScript 代码。