node.js 从 v12.20.0、v14.13.0 和 v15.0.0 起原生支持 esm,但需在 package.json 中设 "type": "module" 才启用;此后 .js 文件按 esm 解析,须用 import/export,禁用 require();.mjs 始终为 esm,.cjs 始终为 commonjs。

Node.js 从 v12.20.0、v14.13.0 和 v15.0.0 起,原生支持 ES Module(ESM),但默认不启用——需通过 package.json 中的 "type" 字段显式声明。
设置 "type": "module"
在项目根目录的 package.json 文件中添加或修改 type 字段为 "module":
{
"type": "module"
}
此后,所有以 .js 结尾的文件将被 Node.js 当作 ES 模块处理,必须使用 import/export 语法,不能再用 require() 或 module.exports(否则报错 ERR_REQUIRE_ESM)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
注意文件扩展名与解析规则
Node.js 的模块解析受 type 影响,但不是唯一依据:
-
"type": "module"时:.js文件按 ESM 解析;.cjs强制为 CommonJS;.mjs强制为 ESM(无论type值) -
"type": "commonjs"(或未设置)时:.js按 CommonJS 解析;.mjs仍强制为 ESM;.cjs强制为 CommonJS
常见兼容性问题与应对
启用 ESM 后可能遇到以下典型问题:
-
第三方包是 CommonJS:不能直接
import foo from 'foo'(除非该包已提供 ESM 入口且package.json正确声明"exports")。可改用动态import()或检查包文档是否支持 ESM -
无法在 ESM 中使用
__dirname/__filename:需用import.meta.url配合file://URL API 计算路径,例如:
const __dirname = fileURLToPath(import.meta.url); -
顶层
await可用:ESM 支持模块级await,无需包裹在 IIFE 中
混合模块场景建议
若项目需渐进迁移,不建议混用 .js 类型但不同 type 的子目录。更稳妥的方式是:
- 统一设
"type": "module",将遗留 CommonJS 文件重命名为.cjs - 或保持
"type": "commonjs",对新模块用.mjs扩展名并显式导入 - 避免依赖
require.extensions或钩子强行切换,这不属于标准行为且易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










