简中文档
On this page

从 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 语句或灯泡图标,选择 快速修复,然后选择 转换为 ES 模块

快速修复

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 提供的现代功能,例如异步模块加载、与浏览器的互操作性、可读性更好、标准化和未来兼容性。

你找到了你需要的东西吗?

编辑此页面
隐私政策