断点停在.js而非.ts的根本原因是source map未正确启用或路径未对齐;需在tsconfig.json设"sourcemap": true,在launch.json配"sourcemaps": true、"outfiles"及"resolvesourcemaplocations"。

VSCode 调试 Node.js 不是“点一下就灵”,断点打不对、配置没配好、source map 挂了,都会让你卡在 dist/index.js 里干瞪眼——真正能秒杀 Bug 的,是懂调试器怎么跟 Node.js 协作的人。
为什么断点总停在 .js 文件而不是 .ts?
这是 TypeScript 项目最常踩的坑:你明明在 src/index.ts 打了断点,运行时却停在编译后的 dist/index.js 第 12 行,变量名全是 _a、_b,根本看不懂。
- 根本原因是 VS Code 没法把运行时的 JS 行号映射回原始 TS 源码——
sourceMaps没启用或路径没对上 - 确保
tsc编译时生成了.map文件:"sourceMap": true必须写在tsconfig.json的compilerOptions里 - 在
.vscode/launch.json的调试配置中,必须显式开启:"sourceMaps": true,并指定输出文件位置:"outFiles": ["./dist/**/*.js"] - 如果 TS 文件分散在多包结构里(比如
packages/cli/src),还要加"resolveSourceMapLocations": ["${workspaceFolder}/packages/**/src/**", "!**/node_modules/**"],否则 VS Code 会跳过那些路径
如何让断点只在特定条件触发?
循环里第 100 次才出错?某个 API 返回值为 null 时才想暂停?普通断点会每轮都停,浪费大量时间。这时候得用条件断点。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 右键已设的断点 → “Edit Breakpoint” → 输入表达式,比如
i === 100或response == null - 表达式必须是当前作用域可访问的变量,不能调用函数(如
isValid())或访问未声明变量,否则断点变空心、不生效 - 注意运算符优先级:
i == 100 && user.id !== undefined比i == 100 && !user.id更安全,避免user.id为0或""导致误判 - VS Code 底部状态栏显示「调试正在运行」但断点没触发?打开「调试控制台」看有没有类似
Condition not valid: i === 100的警告
require() 加载的模块里打不了断点?
你在 node_modules/lodash/fp/map.js 里点了红点,结果运行时完全不暂停——不是代码没执行,是 VS Code 默认跳过了所有 node_modules 和内置模块。
- 默认行为由
skipFiles控制,它通常包含["<node_internals>/**", "**/node_modules/**"]</node_internals> - 真要调试依赖源码(比如怀疑
axios内部重试逻辑有 bug),就在launch.json中删掉或注释掉skipFiles字段,或改成空数组:"skipFiles": [] - 更稳妥的做法是只排除无关路径:
"skipFiles": ["<node_internals>/**"]</node_internals>,保留node_modules可调试性 - 注意:改完
skipFiles后首次启动调试可能变慢,因为调试器要加载更多符号信息
Attach 模式下连不上正在运行的 Node 进程?
用 npm run dev 启的服务,或者 Docker 容器里的 Node,没法用 Launch 模式直接启动——必须 Attach,但连不上是最让人抓狂的场景之一。
- 先确认 Node 进程是否真的开启了调试端口:
node --inspect-brk index.js(--inspect-brk会在第一行暂停,比--inspect更可靠) - 检查端口是否一致:
launch.json中的"port": 9229必须和--inspect后面指定的端口一样;没指定则默认 9229 - Docker 场景下,
address不能是"localhost",得改成"0.0.0.0",且容器启动时要暴露端口:-p 9229:9229 - Windows WSL 用户常见问题:Node 在 WSL 里跑,VS Code 在 Windows 上,
address得填 WSL 的 IP(如172.28.1.1),不能填localhost
真正卡住人的往往不是语法错误,而是调试器和运行时之间那层看不见的契约:source map 路径对不对、端口暴露没暴露、变量作用域能不能被求值——这些细节漏掉一个,断点就成摆设。










