Node.js 中 Module.exports 和 Exports 的区别

21 Feb 2025 | 阅读 6 分钟

Node.js 最重要的特性之一是其对模块的支持,模块是代码的可重用块,可以在应用程序的多个区域共享。在 Node.js 中,模块使用 CommonJS 模块系统定义,该系统允许我们通过两种方式导出模块功能:module.exportsexports。在本文中,我们将了解这两种策略之间的区别以及何时使用它们。

Node.js 中的 module.exports 是什么?

Node.js 模块包含在它们的作用域内,这意味着除非它们被明确导出,否则它们的所有变量和函数只能在模块内部访问。一个特殊的内置对象允许我们将模块的功能导出,那就是 module.exports。当我们为 module.exports 指定一个值时,我们实际上是用一个新的对象替换了整个 exports 对象。例如,我们有一个 math.js 模块,它导出了 add 函数

在此示例中,我们将 add 函数赋值给了 module.exports,因此当我们在程序的另一个区域使用此模块时,我们将获得 add 函数

Node.js 中的 exports 是什么?

exports 仅仅是 module.exports 的一个引用。当我们为 exports 设置值时,我们实际上是在修改 module.exports 对象。例如,让我们修改 math.js 模块以使用 exports 而不是 module.exports

我们将一个包含单个属性的对象赋值给了 exports。如果我们的应用程序需要此模块,我们可以使用 add 函数作为生成对象的属性来访问它

何时使用 module.exports 和 exports?

当我们希望从模块中导出一个函数或对象时,使用 modules.exports 会很有益。但是,如果我们希望从模块中导出多个属性或函数,exports 模块会派上用场。例如,假设我们有一个 utils.js 模块,它导出了许多实用函数

在此示例中,我们使用 exports 从模块中导出了多个函数。当我们在应用程序中需要此模块时,我们可以将这些函数作为最终对象的属性来使用

  • 在本文中,我们探讨了 Node.js 中 module.exports 和 exports 之间的区别。我们已经看到 module.exports 用于从模块中导出一个函数或对象,而 exports 用于导出多个属性或函数。掌握这两种方法之间的区别至关重要,这样我们才能为我们的模块选择最佳的导出方式。通过使用正确的技术,我们可以确保我们的模块导出相关的功能,并且易于使用和维护。
  • 此外,我们应该避免在同一个模块中使用 module.exports 和 exports,因为这可能会导致意外行为。当我们为 exports 设置值时,我们实际上是在修改 module.exports。因此,如果我们同时使用这两种方式,我们可能会导出模块中不正确的功能。
  • 总的来说,如果我们对哪种技术感到困惑,请坚持使用 module.exports。此方法从我们的模块中导出一个函数或对象,并且是 Node.js 模块中最常用的方法。

关于 module.exports

文件名:calculator.js

示例

让我们举一个例子来演示 Node.js 中的 module.exports。

文件名:operation.js

JavaScript

输出

 
Addition -> 140
Subtraction -> 60
Multiplication -> 4000
Division -> 2.5   

关于 exports

文件名:calculator.js

Javascript

文件名:operation.js

Javascript

输出

 
Addition -> 140
Subtraction -> 60
Multiplication -> 4000
Division -> 2.5   

Module.exports 和 Exports 的主要区别

Node.js 中的 Module.exports 和 Exports 之间存在一些区别。主要区别如下:

序号Module.exportsExports
1.当我们想将单个类、变量或函数从一个模块移到另一个模块时,使用 module.Export。当我们希望将多个变量或函数从一个模块导出到另一个模块时,使用 exports 方法。
2.Require() 调用返回一个对象引用。Exports 不是由 require() 返回的。它只是 module.exports 的一个指针。

修改 Module.exports 属性

说明

在此示例中,我们在上面的代码示例中的 math 模块内定义了 add 和 subtract 两个函数。之后,我们使用 module.exports 来导出这些函数。

1. 函数定义

Add:在给出两个参数 a 和 b 时,它返回它们的总和。

Subtract:在接收两个参数 a 和 b 后,它返回 a 减去 b。

2. 导出函数

Module.exports.add = add;:导出 add 函数,以便可以在此模块外部使用它。

Module.exports.subtract = subtract;:与此类似,导出 subtract 函数。

3. 使用模块

Const math = require("./math");:它引入了 math 模块,该模块包含加法和减法函数。

使用参数 2 和 3,math.add(2, 3) 函数调用导入的 math 模块中的 add 函数,结果为 5。

使用参数 2 和 3,math.subtract(2, 3) 调用导入的 math 模块中的 subtract 函数,结果为 -1。

修改 exports 属性

说明

1. 函数定义

Add:add 函数接受两个参数 a 和 b,并输出它们的总和 (a + b)。

Subtract 函数:它在接受两个参数 a 和 b 后返回 a - b 的结果。

2. 导出函数

exports.add = add;:CommonJS 模块使用此语法导出 add 函数,以便可以从另一个模块访问它。

同样,exports.subtract = subtract; 导出 subtract 函数。

3. 导入和使用模块

使用 const math = require("./math"); 导入 math 模块时,会导入 add 和 subtract 函数。

Math.add(2, 3):它使用输入 2 和 3 调用导入的 math 模块中的 add 函数,结果为 5。

Math.subtract(2, 3):此函数在调用时使用输入 2 和 3 返回 -1,并且是导入的 math 模块的一部分。