必须设置"type": "module",因为node.js默认将.js文件视为commonjs模块,不设该字段时使用import/export会报syntaxerror;设为"module"后整个包按esm解析,支持import/export语法,但require和module.exports失效,且本地导入路径须带.js扩展名。

在 Node.js 中,若想让项目默认使用 ES Module(ESM)语法(比如 import / export),需要在 package.json 中设置 "type": "module"。
为什么要设 type 字段?
Node.js 默认把 .js 文件当作 CommonJS 模块处理。即使你写了 export,也会报错“SyntaxError: Unexpected token 'export'”。"type": "module" 告诉 Node.js:整个包默认按 ESM 解析,无需靠文件扩展名(如 .mjs)来区分。
怎么配置 type 字段?
直接在 package.json 的顶层加一行:
"type": "module"
完整示例:
{
"name": "my-app",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"exports": {
".": "./index.js"
}
}
设了 type: module 之后要注意什么?
-
CommonJS 语法失效:不能再用
require()或module.exports,否则运行时报错; -
文件扩展名要明确:动态
import()加载本地文件时,路径必须带扩展名(如import('./utils.js')),不能省略.js; -
与
exports字段配合更安全:建议同时定义"exports",避免模块解析歧义,尤其发布到 npm 时; -
不兼容某些老工具:部分构建工具或测试框架(如旧版 Mocha)默认不支持 ESM,需额外配置加载器(
--loader ts-node/esm等)。
不想全项目切 ESM?可选方案
如果只想局部用 ESM,不用改 type 字段:
- 把 ESM 文件命名为
.mjs(如utils.mjs),Node.js 自动按 ESM 解析; - 用
--input-type=module运行单个文件:node --input-type=module --eval "import('fs').then(...)"; - 混合项目中,CommonJS 主入口(
index.js)可通过import()动态加载 ESM 模块。
设 "type": "module" 是启用 ESM 最直接的方式,但要确保团队和依赖生态已准备好支持它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











