Node.js ≥ v14.15.1 才能原生支持 ES 模块语法,因该版本起默认启用 import/export(无需 --experimental-modules 标志),且配合 package.json 中 "type": "module" 声明,使 .js 文件按 ES 模块解析。

能直接运行,但前提是 Node.js 版本 ≥ v14.15.1 且 package.json 中声明 "type": "module" —— 不需要 Babel、不依赖 babel-node,也不用转码。
为什么 node -v ≥ 14.15.1 才行?
Node.js 在 v12.20.0 开始实验性支持 ES 模块(--experimental-modules),但直到 v14.15.1 才默认启用 import/export 语法(无需 flag)。低于这个版本,import 会报 Cannot use import statement outside a module 错误。
- v12.x:必须加
node --experimental-modules xxx.mjs,且文件名强制为.mjs - v13.x:仍需 flag,行为不稳定
- v14.15.1+:只要
"type": "module"声明,.js文件也能用import
package.json 里必须加 "type": "module"
这是关键一步。没有它,Node.js 默认把 .js 当作 CommonJS 模块处理,import 就是语法错误。
在项目根目录的 package.json 中添加这一行(已有其他字段就补在顶层):
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
{
"name": "my-app",
"type": "module",
"version": "1.0.0"
}
- 不写这行,哪怕 Node 版本够新,
import依然报错 - 写了之后,所有
.js文件都按 ES 模块解析,require()不能混用(除非用createRequire) - 如果只想局部启用,可改用
.mjs后缀,但不推荐——破坏编辑器识别和团队约定
VSCode 终端里怎么跑?就用 node xxx.js
确认上面两点后,打开 VSCode 集成终端(Ctrl + `),确保当前路径在项目根目录(有 package.json 的地方),然后直接执行:
node src/index.js
- 别用右上角 ▶️ 按钮:它走的是调试器配置,容易因
launch.json缺失或runtimeExecutable错配失败 - 别用
babel-node:现代 Node 已原生支持,额外转码纯属拖慢启动、掩盖真实环境差异 - 路径必须写对:ES 模块的
import路径必须带扩展名(import { foo } from './utils.js'),否则报ERR_MODULE_NOT_FOUND
常见报错和对应解法
遇到这些错误,基本就是上面三步中某处没对齐:
-
Cannot use import statement outside a module→ 检查package.json是否有"type": "module",再确认文件是否在该package.json所在目录下运行 -
ERR_MODULE_NOT_FOUND→import路径缺.js后缀,或路径指向了.ts/.jsx等非 JS 文件 -
ReferenceError: require is not defined→ 用了require(),但当前是 ES 模块环境;改用import,或通过import { createRequire } from 'module'; const require = createRequire(import.meta.url);临时兼容 -
node: --experimental-loader is not allowed in NODE_OPTIONS→ 说明你全局设置了NODE_OPTIONS,比如之前装过 Babel 相关工具,删掉或临时清空再试
最易被忽略的是:VSCode 终端可能继承了旧 shell 的环境变量,导致实际运行的不是你认为的那个 Node 版本;建议每次先敲 node -v 和 which node(macOS/Linux)或 where node(Windows)确认。

















