skipFiles是字符串数组形式的绝对路径glob白名单过滤器,必须写为["node_modules/", "<node_internals>/"]等格式,写错类型、路径或未重启调试会话均导致失效。

skipFiles 必须写成数组,路径匹配基于绝对路径
VSCode 的 skipFiles 不是开关,也不是黑名单,它是一个**按文件绝对路径做 glob 匹配的白名单过滤器**。写错格式(比如写成字符串而非数组)、路径不匹配(如带 ./ 前缀)、或用了不稳定的模式(如 **/node_modules/**),都会导致配置静默失效。
-
skipFiles必须是字符串数组,例如:["<node_internals>/**", "node_modules/**"]</node_internals> - 路径不认相对路径:
["./node_modules/**"]❌ 完全无效;["node_modules/**"]✅ 有效(VSCode 自动按工作区根解析) -
**/node_modules/**在部分 VSCode 版本中匹配失败,尤其 pnpm 或 monorepo 场景下更不可靠 - 想确认某文件是否被跳过?在该文件里加
console.log(__filename),看输出的绝对路径再比对规则
只跳内置模块,别误伤 node_modules 里的可调试包
很多人一上来就配 "node_modules/**",结果连自己想 debug 的 zod、axios 源码也进不去——这不是“跳过干扰”,是“跳过目标”。真正需要屏蔽的,往往是 Node.js 内部封装层,比如 fs、events、node:crypto 这类由 V8 加载、路径形如 /path/to/node/out/Release/obj/gen/... 的代码。
- 仅屏蔽内置模块:用
"<node_internals>/**"</node_internals>就够了(VSCode 1.46+ 支持) - 兼容老版本:补上
"**/internal/**"和"**/lib/internal/**" - 想保留某个包(如
my-utils)可调试?别碰skipFiles,改用断点条件:!fileName.includes("node_modules") || fileName.includes("my-utils") - 如果包是 ESM + TypeScript,还要检查
resolveSourceMapLocations是否排除了它的源码路径
justMyCode = true 是默认行为,但它会强制跳过所有非工作区代码
如果你的目标是调试某个 npm 包的原始源码(比如 zod/src),但 F11 总是直接跳过,大概率是 justMyCode 拦住了。这个选项默认为 true,它和 skipFiles 是两套逻辑:前者按“是否属于当前工作区”判断,后者按“路径是否匹配 glob”判断。两者叠加时,justMyCode 优先级更高。
- 要进入第三方包源码,必须设
"justMyCode": false - 同时确保
"sourceMaps": true已启用 - 如果包没提供 sourcemap,或
resolveSourceMapLocations范围太窄(比如写了["!**/node_modules/**"]),即使justMyCode关了也进不去 - 断点打在
node_modules源码里?skipFiles不管用——它只影响自动跳转,不取消你手动设的断点
改完 launch.json 后必须重启调试会话才生效
VSCode 不会热重载调试配置。常见“配置写了但没用”的原因,90% 是因为没重启:
- 点了 Restart Session ❌ —— 这只是重新运行当前 session,不会重读
launch.json - 必须先 Stop → 再 Start Debugging ✅
- 确认左上角选中的调试配置名,和你在
launch.json里编辑的是同一个configurations项 - 如果项目有多个环境(dev/test/prod),容易选错配置;建议给每个
name加明确前缀,比如"Dev: Launch API"
最易被忽略的一点:skipFiles 和 resolveSourceMapLocations 互相影响。比如你设了 "resolveSourceMapLocations": ["!**/node_modules/**"],那即使 skipFiles 写对了,调试器也可能根本找不到源码来跳转。


















