在 node.js 中设置 "type": "module" 可使所有 .js 文件默认按 es 模块解析,支持 import/export 语法,要求 node.js ≥ 12.20.0,且顶层不可用 require(),需用 await import() 替代动态加载。

在 Node.js 中,通过在 package.json 中设置 "type": "module",可以让整个包默认以 ES 模块(ESM)方式解析 JavaScript 文件,无需使用 .mjs 扩展名。
作用与前提
该字段告诉 Node.js:当前包内所有 .js 文件都按 ESM 规则加载(如支持 import/export 语法),而不是默认的 CommonJS(CJS)模式。需注意:
- Node.js 版本需 ≥ 12.20.0(推荐 ≥ 14.13.0 或更新 LTS 版本)
- 设置后,
require()在顶层作用域不可用(仍可在vm或动态import()中使用) - 若同时存在
.cjs和.mjs,它们仍按扩展名优先判定模块类型,不受"type"影响
基本配置方式
在项目根目录的 package.json 中添加或修改 type 字段:
{
"name": "my-app",
"type": "module",
"main": "index.js",
"exports": "./index.js"
}
此后,index.js 可直接写 ESM 语法:
// index.js
import { readFile } from 'fs/promises';
export async function readConfig() {
return JSON.parse(await readFile('./config.json', 'utf8'));
}
常见注意事项
开启后需同步调整一些习惯和依赖用法:
-
不能混用
require和顶层export:ESM 不允许在同一个文件中同时使用require()和export(会报错) -
动态导入替代
require:如需运行时加载模块,用await import('./utils.js') -
CJS 依赖仍可正常使用:Node.js 自动处理 ESM → CJS 的互操作(例如
import _ from 'lodash'依然有效) -
JSON 和 CommonJS 模块需显式指定:ESM 默认不支持直接
importJSON;如需,要加"assertions": { "type": "json" }(Node.js ≥ 16.14.0)或用createRequire兼容
调试与兼容性提示
遇到 ERR_REQUIRE_ESM 或 Cannot use import statement outside a module 错误时,检查:
- 是否漏写了
"type": "module",或拼写错误(如写成"Type") - 是否在子包中未单独配置
type(monorepo 中各包需各自声明) - 是否尝试用
node index.js运行但package.json不在当前目录(Node.js 只读取入口文件所在包的package.json)
如果需要兼顾 CJS 环境(如某些工具链不支持 ESM),可暂不设 type,改用 .mjs 后缀或通过 --input-type=module 参数启动单个文件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











