从 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
语句或灯泡图标,然后选择“快速修复”,再选择“转换为 ES 模块”。
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 的 linter 带有 no-sloppy-imports
规则,当导入路径不包含文件扩展名时,将显示 lint 错误。
🦕 现在您已经知道如何从 CJS 移植到 ESM,您可以利用 ESM 提供的现代功能,例如异步模块加载、与浏览器的互操作性、更好的可读性、标准化和面向未来。