Logo
Section 1 / 8

模块

学习 Node.js 中模块的工作原理。

导入

模块

学习 Node.js 中模块的工作原理。

什么是模块?

让我们来探讨一下在 Node.js 中模块的概念。

在 Node.js 中,每个独立的文件都被视为一个模块。模块最常见的用途是在不同模块之间共享代码或函数。这有助于保持代码的组织性,因为每个模块都可以承担特定的功能。这听起来可能有些循环论证,我们通过下面的代码示例来具体说明。请务必仔细阅读并理解这三个文件。

1const square = require('./square.js') 2const shape = require('./shape.js') 3 4console.log("正方形的面积是", square.area(5)) 5console.log("正方形的周长是", square.perimeter(5)) 6 7const myShape = new shape("六边形", 6) 8myShape.info()

require

require 用于导入模块、JSON 文件以及本地文件。它接收一个相对路径作为字符串参数。在我们的例子中,我们在 index.js 文件的第 1 行和第 2 行分别导入了两个模块。

模块包装器

在模块被导出之前,Node.js 会将其包裹在一个包装函数中。其结构如下:

1(function(exports, require, module, __filename, __dirname) { 2// 模块的实际代码就写在这里 3});

这个包装器的作用包括:

  • 将模块中定义的变量限制在模块作用域内,而不是全局对象中
  • 提供如 __dirname 和 __filename 这样的变量,用于获取模块所在的目录路径和文件名

虽然我们无法直接使用这个包装器,但了解 Node.js 背后的工作机制,有助于我们更深入地理解模块的运行过程。

exports 与 module.exports

我们希望在其他模块中能够访问的变量或函数,都必须被导出。有两种导出方式:使用 exports 或 module.exports。它们的区别如下:

  • exports 变量在模块的文件级作用域中可用。在模块执行前,它的值被设置为 module.exports。我们可以将 exports 看作是一种简写方式。例如,不用写 module.exports.Something,可以直接写 exports.Something。我们在 square.js 文件中就使用了这种方式。
  • module.exports 对象由模块系统创建。通常情况下,我们可以一直使用 exports 的简写形式,而无需直接使用 module.exports。但如果我们通过赋值的方式重写了 exports(例如 exports = function() {}),那么 exports 就不再指向 module.exports,因为赋值操作破坏了两者之间的引用关系。由于真正被导出的是 module.exports,此时 exports 就无法正常工作了。在 shape.js 文件中,因为我们只导出一个类,所以可以直接将该类赋值给 module.exports。

## 编写你自己的模块 创建一个模块,接收一个数字并返回它的平方。在 **square.js** 模块中实现名为 `square` 的函数。将其导入到 **index.js** 中,并在第 4 行设置你导入的函数。准备就绪后点击 **测试** 按钮。如果需要帮助,可以查看提示!

Course Image
1// 在此处导入你的模块 2 3// 在此处设置你导出的函数 4var square = null

基础

操作系统