VSCode默认不区分代码来源,F11会进入任何函数调用,需通过skipFiles配置绝对路径白名单(如["node_modules/**", "<node_internals>/**"])屏蔽无关路径,并重启调试会话生效。

Step Into 为什么总跳进 node_modules 或内置模块?
因为 VSCode 默认不区分“你的代码”和“别人的代码”,只要光标停在函数调用上,F11 就会尝试进入——不管它来自 lodash、fs 还是 node:crypto。这不是 bug,是默认行为。关键不是禁用 F11,而是告诉调试器哪些路径“不值得进去”。
skipFiles 配置写错是最常见的失效原因
skipFiles 是白名单过滤器,不是黑名单;它匹配的是文件**绝对路径**,不是相对路径或包名。写错格式或范围,调试器要么全放行,要么全屏蔽。
- ✅ 正确写法:
"skipFiles": ["<node_internals>/**", "node_modules/**", "**/*.d.ts"]</node_internals> - ❌ 常见错误:
"skipFiles": "node_modules/**"(不是数组)、"skipFiles": ["./node_modules/**"](带./前缀不匹配) - ⚠️ 特别注意:
**/node_modules/**在部分 VSCode 版本中不稳定,推荐用node_modules/**开头(不加前置**/) - 改完
launch.json必须点 Stop → Start Debugging,重启调试会话才生效
只想跳过内置模块,不想误伤第三方包?
很多人一上来就写 "node_modules/**",结果连自己想调试的 axios 或 zod 源码也进不去。真正需要屏蔽的,其实是 node: 协议模块和 V8 内部封装层。
- 只屏蔽内置模块:用
"<node_internals>/**"</node_internals>就够了(VSCode 1.46+ 支持) - 兼容老版本:补上
"**/internal/**"和"**/lib/internal/**" - 想保留某个包可调试?别碰
skipFiles,改用断点条件:!fileName.includes("node_modules") || fileName.includes("my-desired-pkg") - 不确定某文件是否被跳过?在它里面加一行
console.log(__filename),看输出的绝对路径再比对规则
justMyCode: false 才能 Step Into 第三方包源码
如果你的目标是调试某个 npm 包的原始源码(比如 zod/src),但 F11 总是直接跳过——大概率是 justMyCode 没关。这个选项默认为 true,会强制跳过所有非工作区路径的代码,哪怕你已经配好 sourceMaps 和 resolveSourceMapLocations。
- 必须设为:
"justMyCode": false - 同时确保
"sourceMaps": true已启用 - 如果包是 ESM + TypeScript,还要检查
resolveSourceMapLocations是否指向正确的../node_modules/**路径(注意:是相对于生成后的.js文件位置) - 断点打在
node_modules里?skipFiles不管用——它只影响自动跳转,不取消你手动设的断点
最易被忽略的一点:skipFiles 和 resolveSourceMapLocations 是两套独立逻辑,但会互相干扰。比如你把 resolveSourceMapLocations 设得太宽,调试器可能加载到不该加载的 map,导致跳转路径错乱;而 skipFiles 又恰好把那个路径屏蔽了,结果就是“既没跳进去,也没报错,静默失效”。


















