在 Node.js 中启用 ES 模块最推荐的方式是在 package.json 中设置 "type": "module",使所有 .js 文件按 ES 模块解析;也可用 .mjs 后缀,但需显式写扩展名;启用后不可用 require()、__dirname 和 __filename,路径需用 import.meta.url 配合 fileURLToPath。

在 Node.js 中启用 ES 模块,核心是让运行时识别 `.js` 文件为 ES 模块(而非默认的 CommonJS),目前最稳定、推荐的方式是通过 package.json 中声明 "type": "module"。
方式一:在 package.json 中设置 type 字段
这是当前(2026 年)生产环境首选方案,无需改后缀、无需命令行参数,兼容性好且语义清晰:
- 打开项目根目录下的
package.json - 添加或修改
"type"字段为"module":{ "name": "my-app", "version": "1.0.0", "type": "module", "main": "index.js", "scripts": { "start": "node index.js" } } - 保存后,所有
.js文件自动按 ES 模块解析,可直接使用import/export
方式二:使用 .mjs 后缀
不改动 package.json 也能启用 ES 模块,只需将文件扩展名改为 .mjs:
- 例如把
index.js改为index.mjs - Node.js 会自动识别该后缀为 ES 模块,无需额外配置
- 导入路径需带完整扩展名:
import { foo } from './utils.mjs'; - 适合混合模块类型项目(如部分用 CJS、部分用 ESM)
注意:避免混用与常见陷阱
启用 ESM 后,以下行为不再适用,需调整代码逻辑:
立即学习“Java免费学习笔记(深入)”;
-
require()在 ESM 文件中不可用 —— 不能在.js(已设"type": "module")或.mjs中调用 - 没有
__dirname和__filename—— 应改用import.meta.url配合fileURLToPath获取路径 - 导入路径必须显式含扩展名(
.js或.mjs)或为裸包名(如express);不能省略扩展名写./utils - CommonJS 模块可被 ESM 导入,但只暴露
default(即module.exports的值),命名导出需靠 CJS 包自身适配
历史参数已过时,无需再用
早期 Node.js(v12 以前)需加 --experimental-modules 启动参数,但自 v14 起该标志已被移除。当前稳定版(v18/v20/v22)及 2026 年主流版本均原生支持,只要配置正确,直接运行即可,无实验性警告。


















