根本原因是VSCode未加载shell配置文件导致PATH缺失;macOS/Linux需设terminal.integrated.profiles中shell的args为["-l"]并彻底重启,Windows需手动添加Node路径到系统PATH并重启VSCode。

VSCode 里 node -v 报错或版本太低
VSCode 内置终端不识别 node,根本不是插件或设置问题,而是它没加载 shell 的 PATH。Mac/Linux 下常见于 ~/.zshrc 里写了 export PATH="...:$PATH",但 VSCode 启动时没执行该文件;Windows 多因安装 Node.js 时漏选 “Add to PATH”。
先在系统终端运行 which node(macOS/Linux)或 where node(Windows),确认路径存在且版本 ≥ v14.0(ES12 要求最低 v14.5,推荐 v18.17+)。若路径正确但 VSCode 终端仍报错:
- macOS/Linux:彻底退出 VSCode,从终端执行
code .启动(确保 shell 环境被继承) - Windows:把
C:\Program Files\nodejs\手动加进「系统环境变量 > PATH」,重启 VSCode
launch.json 中启用 ES12 模块支持
即使 node -v 正常,调试时仍可能报 Cannot use import statement outside a module——这是 Node 默认按 CommonJS 解析,而 ES12 的 import/export 需显式启用 ESM 模式。
在项目根目录的 .vscode/launch.json 中,确保配置含以下关键项:
-
"type": "pwa-node"(新版推荐,兼容 ESM 和源码映射) -
"program": "${workspaceFolder}/src/index.js"(必须指向已编译的.js文件,不能是.ts或未转译的源码) -
"runtimeArgs": ["--loader", "ts-node/esm"](仅 TypeScript 项目;纯 JS 项目需在package.json中加"type": "module") -
"env": { "NODE_OPTIONS": "--enable-source-maps" }(配合sourceMap: true才能断点精准停在源码行)
jsconfig.json 或 tsconfig.json 必须声明模块类型
VSCode 的智能提示、跳转、自动补全失效,90% 是因为语言服务没识别出 ESM 上下文。它不看 node --version,只认配置文件。
纯 JavaScript 项目:在项目根目录新建 jsconfig.json,内容至少含:
{
"compilerOptions": {
"module": "ESNext",
"target": "ES2022",
"allowJs": true,
"checkJs": true,
"moduleDetection": "force"
},
"include": ["**/*.js"],
"exclude": ["node_modules"]
}
TypeScript 项目:确认 tsconfig.json 有:
-
"module": "NodeNext"或"ESNext" -
"target": "ES2022"(对应 ES12) -
"outDir": "./dist"且"sourceMap": true -
"types": ["node"](否则require、__dirname等提示会报错)
别让 code-runner 插件破坏 ESM 解析
很多人用 code-runner 直接运行单个 JS 文件,但它默认调用 node filename.js,完全忽略 package.json 的 "type": "module",导致 import 报错。
解决方法只有两个:
- 禁用
code-runner,改用 VSCode 内置调试器(F5)——它尊重launch.json和项目配置 - 若必须用
code-runner,在settings.json中强制指定解释器:"code-runner.executorMap": {"javascript": "node --input-type=module"}(注意:这仅对单文件有效,不适用于多文件项目)
ES12 的核心支持不在 VSCode 插件里,而在 Node 运行时 + 配置文件的协同。漏掉 package.json 的 "type": "module" 或 jsconfig.json 的 "module": "ESNext",再新的 Node 版本也白搭。


















