最稳解法是给 package.json 添加 "type": "module" 并重启终端;或改用 .mjs 后缀让 Node 自动启用 ESM 模式,同时确认 Node 版本 ≥ v14.13。

终端执行 node index.js 报 Cannot use import statement outside a module
这不是 VSCode 的 bug,是 Node.js 默认把 .js 文件当 CommonJS 处理。即使你写了 import,只要没明确告诉 Node 这是 ESM,它就直接报错。
最稳解法是让 package.json 说话:
- 确保
package.json在当前工作目录(即 VSCode 打开的文件夹根目录) - 在里面加一行:
"type": "module"(注意是双引号,不是单引号) - 保存后,在内置终端里重新执行
node index.js
别信“我刚加了 type 就能跑”——改完必须关掉终端再新开,否则旧 shell 还缓存着旧状态。
终端里 node -v 能用,但运行 ESM 脚本仍失败
常见原因是 Node 版本太低或环境不一致。ESM 在 Node v12.20+ 才稳定支持,v14.13+ 才默认启用部分特性。你现在用的大概率是 v20.x 或 v22.x(2026 年主流 LTS),但得确认终端里跑的真是这个版本:
- 在 VSCode 内置终端执行
which node(macOS/Linux)或where node(Windows) - 再执行
node -v,看输出是否 ≥ v14.13 - 如果路径指向
/usr/local/bin/node但node -v输出 v12.x,说明 PATH 混了多个版本,得清理或用nvm use切换
尤其 macOS 用 nvm 的用户:source ~/.zshrc 后必须重启 VSCode,否则终端继承的是旧 shell 环境。
想临时跑单个 ESM 文件,又不想建 package.json
直接改后缀最省事:
- 把
index.js改成index.mjs - 在终端里执行
node index.mjs
Node 遇到 .mjs 后缀会自动启用 ESM 模式,完全绕过 package.json 依赖。调试时 launch.json 的 program 也得同步改成 "${file}" 或显式路径,否则断点不会命中。
中文路径下 import 报错或乱码
这通常发生在 Windows 中文用户名或项目路径含中文时。Node 自身不处理编码问题,终端默认用系统编码(如 GBK),而 JS 文件多为 UTF-8:
- VSCode 设置里搜
files.encoding,设为utf8 - 终端里别用默认 PowerShell,改用
cmd或在设置里把终端默认 shell 设为Command Prompt - 实在不行,临时把项目移到英文路径下(如
C:\dev\myapp),ESM + 中文路径组合目前仍是 Node 生态的灰色地带
真正麻烦的不是语法报错,而是错误信息本身被截断或显示为方块——这时候先砍掉路径里的中文,比调半天配置更有效。


















