配好Node调试需满足三条件:node命令在VSCode终端可用、launch.json的program指向真实JS文件、Node版本≥14;PATH不一致导致“Cannot find runtime 'node'”;program路径须用${workspaceFolder}变量;TS项目需编译或用ts-node;服务端推荐attach模式;多线程调试需autoAttachChildProcesses并显式传--inspect参数。

能断点、能看变量、能进调用栈,才算配好了——不是装插件、不是改一堆设置,核心就三件事:node 命令得在 VSCode 终端里跑通,launch.json 的 program 必须指向真实可执行的 .js 文件,Node 版本不能低于 14。
为什么终端里 node -v 有输出,但调试时还报 Cannot find runtime 'node'
这是 GUI 进程没加载 shell 初始化文件导致的 PATH 不一致。VSCode 桌面图标启动时,不会自动 source ~/.zshrc 或 ~/.bash_profile;Windows 下则常因安装时没勾选 “Add to PATH”,或系统环境变量没刷新。
- macOS/Linux:确认
~/.zshrc(或当前 shell 配置)里有export PATH="/opt/homebrew/bin:$PATH"(Homebrew 路径)或source ~/.nvm/nvm.sh(nvm),然后从终端执行code .启动 VSCode - Windows:重装 Node.js,务必勾选 “Add to PATH”;若已装,手动把
C:\Program Files\nodejs\加进「系统环境变量」的Path,再彻底退出 VSCode(任务管理器里杀干净)重新打开 - 验证方式:VSCode 内置终端(
Ctrl + `)里运行which node(macOS/Linux)或where node(Windows),输出路径必须和你终端里一致
launch.json 的 program 字段怎么写才不灰掉断点
断点变空心、hover 看不到变量,90% 是 program 指向了不存在的路径、非 JS 文件、或没解析工作区变量。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 正确写法:
"program": "${workspaceFolder}/src/index.js"(推荐)或"program": "${file}"(仅限单文件快速测试) - 常见错误:
"program": "src/index.js"(缺${workspaceFolder}/,VSCode 当作字面字符串找);"program": "./src/index.js"(.不被解析);"program": "${workspaceFolder}/src/index.ts"(TS 源码不能直跑) - TypeScript 项目:要么配
preLaunchTask编译到dist/,然后program指向dist/index.js;要么用runtimeExecutable: "npx"+runtimeArgs: ["ts-node", "src/index.ts"] - ESM 项目:确保
package.json里有"type": "module",否则import会解析失败,调试器卡在模块加载阶段
调试 Express/Koa 之类服务端项目,该用 launch 还是 attach
用 attach 更稳。因为 launch 要完全接管进程启动,而服务端常依赖 NODE_ENV、端口复用、子进程 fork 等,稍有不一致就卡住或报 EADDRINUSE。
- 先在终端手动启动:
node --inspect-brk ./bin/www(Express 默认入口)或node --inspect-brk app.js -
launch.json配置关键项:"type": "node"、"request": "attach"、"port": 9229(和--inspect默认端口一致) - 如果启动时指定了其他端口,比如
--inspect=9230,那port字段必须同步改,否则连不上 - 别同时开两个
--inspect进程——端口冲突会导致第二个连接失败,错误信息通常是Could not connect to debug target
多线程(Worker Threads / child_process.fork)调试为什么断点不进子进程
默认情况下,VSCode 只调试主进程。子进程(包括 Worker 和 fork 出的子进程)要被调试,必须显式启用附加机制并传调试参数。
- 在
launch.json中加:"autoAttachChildProcesses": true(这是开关,不是可选项) - Worker 构造时必须带
execArgv:new Worker('./worker.js', { execArgv: ['--inspect-brk=9229'] }) -
child_process.fork()同样要传:fork('./sub.js', [], { execArgv: ['--inspect=9230'] });只写fork('./sub.js')是无效的 - 注意端口唯一性:多个 Worker 共用同一端口会导致调试器只连上第一个;建议不指定端口让 Node 自动分配,或为每个 Worker 设不同端口
最常被忽略的是:autoAttachChildProcesses 仅对标准 Node.js 启动流程生效,用了 ts-node 或 esbuild-node 就会失效;Worker 必须显式加 --inspect-brk,否则即使开了自动附加也找不到调试端口。

















