能跑 node -v 且 vscode 按 f5 能断点调试,才算 node 环境真正接入成功;其余插件、格式化、typescript 都是后续优化项,不是基础门槛。验证需先在系统终端运行 node -v 和 npm -v 均有输出,再确保 vscode 内置终端也能执行 node -v,最后配置 launch.json 的 program 字段为 "${file}" 或真实 js 路径。

能跑 node -v 且 VSCode 按 F5 能断点调试,才算 Node 环境真正接入成功;其余插件、格式化、TypeScript 都是后续优化项,不是基础门槛。
验证 node 和 npm 是否真被系统识别
很多人在 VSCode 里执行 node -v 报错,却去查 launch.json 或装插件,方向完全错了。问题只可能出在系统 PATH 上。
- 打开系统终端(不是 VSCode 内置终端),运行
node -v和npm -v—— 两者都必须有输出 - Windows:安装时没勾选 Add to PATH 是最常见原因;手动加路径前,确认 Node.js 安装目录不含中文或空格(如
C:\Program Files\nodejs可,D:\我的软件\nodejs不行) - macOS/Linux:用
nvm的用户,检查~/.zshrc或~/.bash_profile是否包含source ~/.nvm/nvm.sh,改完后必须重启终端或执行source ~/.zshrc - VSCode 内置终端若仍报错,关掉所有 VSCode 窗口,重新打开项目文件夹再试 —— 它不会自动继承新加载的 shell 环境
launch.json 中 program 字段怎么设才不踩坑
VSCode 自动生成的 launch.json 默认写死为 "program": "${workspaceFolder}/app.js",换文件就失效。这不是 bug,是配置逻辑没对齐实际开发习惯。
- 单文件调试:用
"program": "${file}"—— 这样无论当前打开的是index.js还是server.js,F5 都能直接跑 - 固定入口文件:比如项目约定用
index.js启动,就写"program": "${workspaceFolder}/index.js",但务必确保该文件存在 - 调试
npm start:把"program"改成"npm",加"args": ["start"]和"console": "integratedTerminal",否则看不到启动日志 - 别忘了保存文件:VSCode 调试器不会自动保存未保存的 JS 文件,F5 前务必按
Ctrl+S
为什么调试时提示 “Cannot find runtime 'node'”
这个错误几乎 100% 意味着 node 命令在 VSCode 终端里不可用,和 launch.json 内容无关。
- 先在 VSCode 内置终端(
Ctrl+`)里敲node -v—— 如果失败,说明环境变量根本没继承进来 - macOS/Linux:从终端启动 VSCode,命令是
code --no-sandbox .,避免 Dock 启动绕过 shell 初始化 - Windows:检查“系统属性 → 高级 → 环境变量”,确认
C:\Program Files\nodejs(或你实际的安装路径)已加入 系统变量 的Path,不是仅用户变量 - 改完环境变量后,必须关闭并重启所有 VSCode 实例,内置终端不会热更新 PATH
code-runner 插件跑 JS 脚本容易出什么问题
它默认命令太简陋,尤其在 ESM 项目、中文路径或需要交互输入时,会静默失败或乱码。
- Windows 中文路径下乱码:在 VSCode 设置里搜
code-runner.executorMap,把javascript对应值改成"node -r utf-8 $fileName" - ESM 项目报
Cannot use import statement outside a module:确保package.json有"type": "module",再把 executor 改成"node --experimental-specifier-resolution=node $fileName" - 遇到
process.stdin就卡住:code-runner 不支持交互式输入,要么换用内置终端手动执行,要么改用 F5 调试模式 - 真要可靠运行脚本,优先用 VSCode 自带调试器(F5)或终端手动
node index.js,别依赖 code-runner
最常被忽略的其实是环境变量的“可见范围”——系统终端能用 node,不代表 VSCode 继承了它;npm 配置生效了,不代表 VSCode 终端读取了 shell 配置。每一步验证都要落在终端里,而不是凭感觉往下走。











