断点不生效主因是VSCode调试器未连上Node进程或program路径错误:需确认node在调试器PATH中、program指向真实JS文件(如"${workspaceFolder}/dist/index.js")、launch.json含type:"node"和request:"launch"/"attach"。

断点点了没反应,八成不是代码问题,而是 VSCode 调试器压根没连上 node 进程,或者连上了却找不到你写的那行 JS —— 这两件事没理清,红点再漂亮也没用。
确认 node 命令能否被调试器真正看见
VSCode 调试器启动时,会自己去 PATH 里找 node,但它不读你的 ~/.zshrc 或 ~/.bash_profile。终端里 node -v 正常,不代表调试器也能调用它。
- 在 VSCode 内置终端(
Ctrl + `)中运行which node,记下完整路径(如/opt/homebrew/bin/node) - 把这行加进项目根目录下的
.vscode/settings.json:"terminal.integrated.env.osx": {"PATH": "/opt/homebrew/bin:${env:PATH}"}(Windows 对应terminal.integrated.env.windows,路径填C:\Program Files\nodejs\) - 改完必须彻底退出 VSCode(包括菜单栏「Code → Quit Code」或杀掉托盘进程),再从终端执行
code .启动 - 重启后,在内置终端跑
node -v,有输出才算过关;否则调试器启动时会静默失败或报Cannot find runtime 'node' on PATH
检查 launch.json 的 program 字段是否指向真实 JS 文件
program 不是命令行参数,也不是相对路径语法,它必须是一个 Node 可直接执行的、物理存在的 .js 文件路径。
- 正确写法:
"program": "${workspaceFolder}/dist/index.js"(推荐用变量,避免硬编码) - 错误写法:
"program": "src/index.js"(缺${workspaceFolder}/,VSCode 找不到) - 错误写法:
"program": "./src/index.js"(.在这里不被解析,等同字面量) - TypeScript 项目别写
src/index.ts;要么编译后指向dist/index.js,要么配preLaunchTask触发tsc - ESM 项目记得在
package.json里加"type": "module",否则import会报Cannot find module
TypeScript 断点停在 .js 里?source map 链路断了
你在 src/index.ts 上打的断点变成空心红圈,说明 VSCode 根本没把编译后的 dist/index.js 和源码关联起来。
- 确保
tsconfig.json里有"sourceMap": true,且构建后生成了.js.map文件(比如dist/index.js.map) -
launch.json中必须显式加:"sourceMaps": true"outFiles": ["${workspaceFolder}/dist/**/*.js"] - 如果
.ts文件不在根目录(比如在packages/foo/src),还得加:"resolveSourceMapLocations": ["${workspaceFolder}/packages/**/src/**"] - 验证方式:启动调试后,打开调试控制台,搜
Loaded source map from,看到对应路径且无 404 才算通
为什么条件断点设了却不起作用
右键断点红点 → Edit Breakpoint,输入表达式即可。但调试器只做布尔求值,不执行函数调用 —— 很多你以为能用的写法其实被忽略。
- 支持:
i === 5、user?.id > 100、process.env.NODE_ENV === 'development' - 不支持:
console.log('hit')、getUserId()(函数调用)、new Date().getTime()(副作用表达式) - 若依赖变量未定义或为
undefined,整个表达式会视为false,断点跳过 - 异步回调里的条件断点要小心:
setTimeout(() => { /* breakpoint here */ }, 100)中的变量作用域可能已丢失
最常被忽略的其实是 resolveSourceMapLocations 的路径匹配逻辑 —— 它不是 glob,而是正则前缀匹配,写错一个星号或漏掉斜杠,source map 就白生成了。


















