program字段不能写死路径,因为会导致每次调试不同文件都要手动修改配置;应使用${file}动态指向当前打开文件,否则易报“cannot find module”或启动卡死。

launch.json 里 program 字段为什么不能写死
因为写死路径(比如 "program": "server.js")会导致每次调试不同文件都要手动改配置,极其低效。VSCode 调试器真正需要的是「当前打开的 JS 文件」,所以必须用 ${file} 动态解析。
常见错误现象:F5 启动后报错 Error: Cannot find module 'xxx' 或直接卡在启动界面——大概率是 program 指向了不存在的路径,或没保存当前文件(VSCode 默认不自动保存,调试前务必 Ctrl+S)。
-
program设为${file}:适用于单文件快速测试,如app.js、test.js - 设为
${workspaceFolder}/bin/www:适合 Express 等约定式项目结构,但需确保路径真实存在 - 避免使用相对路径如
./src/index.js:VSCode 不会自动补全工作区根目录,容易因 cwd(当前工作目录)偏差导致模块解析失败
怎么让 npm script 在 VSCode 里一键运行
不用每次都切终端敲 npm run dev,VSCode 可以把 package.json 里的脚本直接注册为可调试任务。关键是靠 tasks.json + launch.json 协同。
典型场景:你写了 "scripts": { "dev": "nodemon index.js" },想点一下就跑,还带断点。
- 先在项目根目录建
.vscode/tasks.json,内容包含type: "shell"和command: "npm run dev" - 再在
launch.json里加一个配置,request设为launch,type仍为node,但runtimeExecutable改成npm,args设为["run", "dev"] - 注意:如果用了
nodemon,得加"console": "integratedTerminal",否则重启时调试器会断连
自定义脚本调试时为什么断点不生效
根本原因通常是 Node.js 进程没走 VSCode 的调试协议通道。比如你用 npm run start 启动,但没加 --inspect 参数,VSCode 就连不上。
解决路径只有两条:要么让脚本启动时主动暴露调试端口,要么用 attach 模式反向连接。
- 推荐改
package.json脚本:"debug": "node --inspect-brk=9229 index.js",然后launch.json配request: "attach"+port: 9229 - 若脚本本身是
ts-node或babel-node,必须确认它们支持--inspect标志(新版基本都支持,旧版可能需加-r @babel/register等) - Windows 下遇到
spawn ENOENT错误?检查runtimeExecutable是否指向了真实存在的可执行文件路径,比如npx在某些环境里不是全局命令
多版本 Node 共存时 launch.json 容易踩什么坑
VSCode 默认用系统 PATH 里的 node,但如果你用 nvm 或 fnm 切换版本,VSCode 启动时可能读的是旧版本,导致 require() 报错或 ES 模块语法不识别。
最稳妥的做法不是改 PATH,而是显式指定 runtimeExecutable。
- 查当前 shell 里 node 路径:
which node(macOS/Linux)或where node(Windows) - 把结果填进
launch.json的runtimeExecutable字段,例如/Users/xxx/.nvm/versions/node/v18.17.0/bin/node - 别依赖
node命令名:VSCode 启动时不会加载你的 shell profile,nvm use的效果对它无效
复杂点在于:每个项目可能依赖不同 Node 版本,而 launch.json 是 workspace 级配置,没法按文件动态切换。真要隔离,得配合 nvm exec 包一层 shell 任务,或者直接用 volta 管理 runtime。











