导入
模块
学习 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 行设置你导入的函数。准备就绪后点击 **测试** 按钮。如果需要帮助,可以查看提示!

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