从 CommonJS 更新到 ESM
如果你的 Node.js 项目使用 CommonJS 模块(例如,它使用 require
),你需要更新你的代码以使用 ECMAScript 模块 (ESM) 才能在 Deno 中运行。本指南将帮助你更新代码以使用 ESM 语法。
模块导入和导出 跳转到标题
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 快速修复 跳转到标题
如果你正在使用 VS Code,你可以使用其内置功能将 CommonJS 转换为 ES6 模块。右键单击 require
语句或灯泡图标,然后选择 Quick Fix
,再选择 Convert to ES module
。
CommonJS 与 ECMAScript 解析 跳转到标题
这两种模块系统之间一个重要的区别是,ECMAScript 解析要求完整的说明符,包括文件扩展名。省略文件扩展名以及对 index.js
的特殊处理是 CommonJS 独有的特性。ECMAScript 解析的优点是它在浏览器、Deno 和其他运行时中都以相同的方式工作。
CommonJS | ECMAScript 模块 |
---|---|
"./add_numbers" |
"./add_numbers.js" |
"./some/directory" |
"./some/directory/index.js" |
提示
Deno 可以通过运行 deno lint --fix
为你添加所有缺失的文件扩展名。Deno 的代码检查器带有一个 no-sloppy-imports
规则,当导入路径不包含文件扩展名时,它将显示一个检查错误。
🦕 既然你已经知道如何从 CJS 移植到 ESM,你就可以利用 ESM 提供的现代功能,例如异步模块加载、与浏览器互操作、更好的可读性、标准化和面向未来。