从 CommonJS 迁移到 ESM
如果你的 Node.js 项目使用 CommonJS 模块(例如使用
require
),你需要将代码更新为使用
ECMAScript 模块 (ESM)
以在 Deno 中运行。本指南将帮助你更新代码以使用 ESM 语法。
模块导入与导出 Jump to heading
Deno 仅支持 ECMAScript 模块。如果你的 Node.js
代码使用
require
,你应该将其更新为使用
import
语句。如果你的内部代码使用 CommonJS 风格的导出,这些也需要更新。
一个典型的 CommonJS 风格项目可能如下所示:
add_numbers.js
module.exports = function addNumbers(num1, num2) {
return num1 + num2;
};
index.js
const addNumbers = require("./add_numbers");
console.log(addNumbers(2, 2));
要将这些转换为 ECMAScript 模块,我们需要做一些小的改动:
add_numbers.js
export function addNumbers(num1, num2) {
return num1 + num2;
}
index.js
import { addNumbers } from "./add_numbers.js";
console.log(addNumbers(2, 2));
导出:
CommonJS | ECMAScript 模块 |
---|---|
module.exports = function add() {} |
export default function add() {} |
exports.add = function add() {} |
export function add() {} |
导入:
CommonJS | ECMAScript 模块 |
---|---|
const add = require("./add_numbers"); |
import add from "./add_numbers.js"; |
const { add } = require("./add_numbers") |
import { add } from "./add_numbers.js" |
使用 VS Code 快速修复 Jump to heading
如果你使用 VS Code,你可以使用其内置功能将 CommonJS 转换为 ES6 模块。右键点击
require
语句或灯泡图标,选择 Quick Fix
,然后选择 Convert to ES module
。
CommonJS 与 ECMAScript 解析 Jump to heading
两种模块系统之间的一个重要区别是,ECMAScript 解析需要完整的路径
包括文件扩展名。省略文件扩展名以及对 index.js
的特殊处理是 CommonJS
独有的特性。ECMAScript 解析的好处是它在浏览器、Deno 和其他运行时中的行为一致。
CommonJS | ECMAScript 模块 |
---|---|
"./add_numbers" |
"./add_numbers.js" |
"./some/directory" |
"./some/directory/index.js" |
Tip
Deno 可以通过运行 deno lint --fix
为你添加所有缺失的文件扩展名。Deno 的 linter
附带了一个 no-sloppy-imports
规则,当导入路径不包含文件扩展名时,会显示一个
linting 错误。
🦕 现在你知道了如何从 CJS 迁移到 ESM,你可以利用 ESM 提供的现代特性,例如异步模块加载、与浏览器的互操作性、更好的可读性、标准化和未来兼容性。