8 Node.js 小白教程:模块系统之 ES 模块
在上一篇文章中,我们讨论了 Node.js 的模块系统之 CommonJS 模块,了解到了如何使用 require
和 module.exports
来组织我们代码中的模块。在这一篇中,我们将探讨另一种模块系统——ES 模块(ECMAScript Modules),这也是现代 JavaScript 推荐的模块组织方式。ES 模块在浏览器中得到广泛应用,并且 Node.js 也逐步开始支持这一标准。
什么是 ES 模块?
ES 模块是 ECMAScript 2015(ES6)引入的一种标准化的模块系统。这种模块系统允许开发者使用 import
和 export
关键字来引入和导出模块,使得代码更加清晰和可维护。
ES 模块的基本语法
- 导出模块
要导出一个变量、函数或类,可以使用 export
关键字。例子如下:
// myModule.js
export const name = 'Node.js';
export function greet() {
console.log(`Hello, ${name}!`);
}
- 导入模块
要导入一个模块,可以使用 import
关键字。可以使用默认导入和命名导入,具体如下:
// main.js
import { name, greet } from './myModule.js';
console.log(name); // 输出: Node.js
greet(); // 输出: Hello, Node.js!
在上面的示例中,我们从 myModule.js
文件中导入了 name
变量和 greet
函数,并使用它们。
Node.js 中使用 ES 模块
启用 ES 模块支持
在 Node.js 中,可以通过以下两种方法启用 ES 模块支持:
- 使用
.mjs
扩展名。 - 在
package.json
文件中添加"type": "module"
。
例如,假设我们选择第二种方法,可以创建一个 package.json
文件如下:
{
"type": "module"
}
案例:创建一个简单的模块
让我们创建一个简单的 Node.js 应用,使用 ES 模块组织代码。
1. 创建项目结构
my-node-app/
│
├── package.json
├── index.js
└── utils.js
2. 编辑 utils.js
文件
在 utils.js
中,我们将导出一个简单的加法函数:
// utils.js
export function add(x, y) {
return x + y;
}
export function subtract(x, y) {
return x - y;
}
3. 编辑 index.js
文件
在 index.js
中,我们将导入上面的函数并使用它们:
// index.js
import { add, subtract } from './utils.js';
const sum = add(5, 3);
const difference = subtract(5, 3);
console.log(`Sum: ${sum}`); // 输出: Sum: 8
console.log(`Difference: ${difference}`); // 输出: Difference: 2
在 Node.js 中运行
确保你的 package.json
文件中含有 "type": "module"
,然后在终端中使用命令:
node index.js
你应该会看到如下输出:
Sum: 8
Difference: 2
ES 模块的特性
1. 静态分析
ES 模块的一个好处是支持静态分析,导入和导出的路径在编译时就能够确定。这使得工具(例如 IDE 和构建工具)可以更容易地分析依赖关系。
2. 使用 default
导出
一个模块可以有一个默认导出,使用 export default
语法:
// myDefaultModule.js
const myFunction = () => {
console.log('This is my default function');
};
export default myFunction;
导入方式如下:
// main.js
import myFunction from './myDefaultModule.js';
myFunction(); // 输出: This is my default function
小结
在这一篇文章中,我们深入探讨了 Node.js 中的 ES 模块,包括其语法和用法。我们创建了一个简单的应用,演示了如何导入和导出模块,以及如何在 Node.js 环境中运行它们。相较于 CommonJS,ES 模块提供了更清晰的语法和更好的静态分析功能。
下一篇文章,我们将讨论 Node.js 中的异步编程之回调函数,进一步探索 JavaScript 的异步特性及其在 Node.js 中的应用。请保持关注!