VS Code 调试 TypeScript 断点不生效?source map 配置与排查指南
简介这份资源面向希望在 Visual Studio Code 中高效调试 TypeScript 的开发者尤其适合刚接触 TS 调试配置、需要打通断点与源码映射环节的初中级前端或 Node.js 工程师。内容围绕 tsconfig.json 编译选项、.vscode/launch.json 调试配置、断点设置、变量监视以及 Chrome 前端调试等核心场景展开帮助读者理解 sourceMap 在源码级调试中的作用。资源包共 10 个文件以 5 个 json 配置与依赖清单、2 个 ts 示例源码为主另含 readme 说明、LICENSE 与 .gitignore整体约 5KB结构轻量可直接作为调试配置模板参考。目前已有 1979 人学习下载。通过其中的示例工程与配置读者能快速对照搭建可运行的调试环境掌握断点、调用栈、作用域查看与 Console 执行等实用技巧并迁移到自己的本地应用或 Web 项目中。1. 在 VS Code 里调试 TypeScript为什么你的断点总是灰的很多人第一次在 VS Code 里给 TypeScript 打断点看到的是一个空心灰圈鼠标悬停提示 “Breakpoint set but not yet bound”。代码明明在跑日志也照常输出断点就是不生效。这不是玄学是调试器根本没把编译后的 JavaScript 和你的.ts源文件对上号。这个标题要解决的就是这件事让 VS Code 的调试器真正停在你的 TypeScript 源码行上能看变量、能单步、能看调用栈。它适合两类人——刚把项目从 JS 迁到 TS、发现console.log已经不够用的开发者以及接手了一个 TS 工程、想搞清楚 launch.json 里那一堆字段到底在干什么的人。核心链路只有一条VS Code 通过调试适配器启动 NodeNode 执行编译产物source map 把执行位置映射回.ts。这条链上任何一环断了断点就灰。下面按“先跑通最小例子再拆配置再排坑”的顺序讲。2. 先跑通一个最小可调试的 TypeScript 工程2.1 三个文件就能验证整条链路不要一上来就在大项目里调先建一个空目录只放三个文件。这样出问题时变量最少能快速定位是配置问题还是工程问题。mkdir ts-debug-demo cd ts-debug-demo npm init -y npm install --save-dev typescript ts-node types/node npx tsc --inittsc --init会生成tsconfig.json。默认生成的配置里sourceMap是注释掉的这是后面断点变灰的头号原因先手动打开。接着建源码文件// src/index.ts interface User { id: number; name: string; } function greet(user: User): string { const label user-${user.id}; // 在这行打断点 return ${label}: ${user.name}; } const u: User { id: 7, name: A同学 }; console.log(greet(u));然后在.vscode/launch.json里写第一版配置{ version: 0.2.0, configurations: [ { name: Debug TS (ts-node), type: node, request: launch, runtimeArgs: [-r, ts-node/register], args: [${workspaceFolder}/src/index.ts], cwd: ${workspaceFolder}, sourceMaps: true, skipFiles: [node_internals/**] } ] }按 F5程序应该跑起来并在const label那行停住。如果停住了说明链路是通的可以往下看配置细节如果没停先检查tsconfig.json里sourceMap是否为true这是最高频的原因。2.2 ts-node 方案和预编译方案怎么选上面用的是ts-node/register它在运行时即时编译 TS省去了手动tsc的步骤。优点是改完代码直接 F5适合开发期快速迭代。缺点是启动稍慢且某些依赖原生模块或特殊 loader 的场景会出兼容问题。另一种常见做法是先编译再调试配置长这样{ name: Debug TS (compiled), type: node, request: launch, program: ${workspaceFolder}/dist/index.js, preLaunchTask: tsc: build, outFiles: [${workspaceFolder}/dist/**/*.js], sourceMaps: true }preLaunchTask指向.vscode/tasks.json里定义的一个 tsc 构建任务每次 F5 前自动编译。outFiles告诉调试器去哪里找编译产物和对应的.map文件这个字段不写source map 可能加载不上。选哪个我的习惯是日常开发用 ts-node省事需要调试构建产物行为、或者项目本身构建流程复杂比如有 bundler时用预编译方案因为它更接近真实运行环境。两者不要混用混用容易出现“源码改了但调试的是旧产物”的翻车现场。2.3 tsconfig 里和调试强相关的四个字段tsconfig.json字段很多但直接影响调试的其实就几个配错了断点必灰。字段推荐值作用配错的后果sourceMaptrue生成 .js.map 映射文件断点无法绑定到 .tsoutDir./dist编译产物目录产物和源码混在一起outFiles 难写inlineSourcestrue把源码内容嵌进 map调试时看不到源码只能看编译结果rootDir./src源码根目录map 里的路径错位映射失败inlineSources容易被忽略。默认情况下 source map 只记录路径调试器需要自己去磁盘读.ts文件。如果路径对不上比如构建机器和本地目录结构不同就看不到源码。打开inlineSources后源码内容直接写进 map路径问题就绕过去了。3. launch.json 里那几个必调参数到底在干什么3.1 type、request、program 三件套type: node表示用 Node 调试适配器这是内置的不需要额外装扩展。request有两个值launch是自己启动一个进程来调试attach是连到一个已经在跑的进程。新手先用launchattach后面讲。program指向入口 JS 文件。用 ts-node 方案时它不写program而是用runtimeArgs加args组合用预编译方案时program指向dist/index.js。这里有个常见误解有人把program直接指向.ts文件然后不加 ts-node结果 Node 报语法错误——Node 本身不认识 TS 语法必须有个编译环节。3.2 sourceMaps 和 outFiles 的配合关系sourceMaps: true是开关outFiles是告诉调试器去哪里扫描.map文件。用 ts-node 时编译在内存里发生map 也是即时的所以outFiles可以不写。用预编译方案时outFiles必须写而且 glob 要能匹配到实际的.js文件。outFiles: [${workspaceFolder}/dist/**/*.js]如果产物目录是build而不是dist这里要同步改。outFiles写错的表现是程序能跑断点也能停但停的位置错位——比如你打在.ts第 10 行它停在编译后.js的第 8 行。这就是 map 没被正确关联调试器退回到了按 JS 行号定位。3.3 skipFiles 和 smartStep 减少无谓单步调试时最烦的是单步进入 Node 内部或第三方库。skipFiles用 glob 指定跳过的文件skipFiles: [ node_internals/**, ${workspaceFolder}/node_modules/** ]node_internals/**是内置变量代表 Node 核心模块。加上这两条后F11 单步不会跳进fs.js或某个 npm 包的源码里。smartStep: true是另一个省事开关它会自动跳过那些没有对应 source map 的编译代码。比如你用了一个编译过的第三方库单步进去只能看到编译结果smartStep会直接跨过去。这两个参数不配也能调试但配上之后体验差别很大属于“用过就回不去”的那类。4. 断点不生效、映射错位、attach 连不上排查清单4.1 断点灰色不绑定现象断点是空心灰圈程序跑完也不停。原因调试器没有拿到有效的 source map无法把.ts行号映射到运行中的 JS。解决按顺序检查——tsconfig.json里sourceMap是否为truelaunch.json里sourceMaps是否为true预编译方案下outFiles是否匹配到实际产物产物目录里是否存在.js.map文件。四步走完基本能解决。4.2 断点停在了错误的行现象断点绑定了但停的位置和源码对不上偏移几行。原因通常是outFiles配置错误或者存在多份 map 文件冲突。比如dist目录里有上次构建的旧 map和新编译的混在一起。解决先清空产物目录重新构建排除旧文件干扰。然后确认outFiles的 glob 只匹配当前构建产物。如果用了 bundler如 esbuild、webpack检查它是否生成了正确的 source map有些 bundler 默认不生成或生成的是eval形式的 mapNode 调试器认不出来。4.3 attach 模式连不上进程现象用request: attach时提示连接被拒绝或超时。原因目标进程没有以调试模式启动或者端口不匹配。解决attach 要求目标进程启动时带上--inspect参数。比如node --inspect9229 dist/index.js然后launch.json里对应配置{ name: Attach to Node, type: node, request: attach, port: 9229, restart: true }restart: true表示目标进程重启后自动重新连接适合配合 nodemon 这类热重载工具使用。端口默认 9229如果被占用可以改成别的但两边要一致。4.4 ts-node 下断点偶尔失效现象同样的配置有时能停有时不能重启 VS Code 后又好了。原因ts-node 的编译缓存和 VS Code 的调试会话状态不同步属于偶发问题。解决在tsconfig.json里打开ts-node: { transpileOnly: true }跳过类型检查加速编译减少缓存不一致的概率。另外在launch.json里加outputCapture: std确保输出被正确捕获。如果还是偶发在 F5 前手动删掉node_modules/.cache下的 ts-node 缓存目录这是血泪经验换来的土办法但确实管用。5. 把调试配置推进到多文件工程和远程场景5.1 多入口和 monorepo 下的配置拆分单入口工程一个配置就够了但真实项目往往有多个入口——比如一个 CLI 加一个服务端。这时候在launch.json的configurations数组里写多个配置用name区分F5 时下拉选择。monorepo 场景下每个子包有自己的tsconfig.json和产物目录。常见做法是在根目录的launch.json里用${workspaceFolder}变量配合子路径{ name: Debug pkg-a, type: node, request: launch, program: ${workspaceFolder}/packages/pkg-a/dist/index.js, outFiles: [${workspaceFolder}/packages/pkg-a/dist/**/*.js], sourceMaps: true, cwd: ${workspaceFolder}/packages/pkg-a }关键是cwd要设到子包目录否则程序运行时读取相对路径的配置文件会找不到。outFiles也要精确到子包不要用根目录的大 glob否则不同子包的 map 会互相干扰。5.2 用条件断点和日志点替代 console.log断点打多了每次 F5 都停反而拖慢节奏。两个进阶技巧条件断点和日志点。条件断点右键断点 → “编辑断点” → 输入表达式比如user.id 7。只有条件为真时才停。适合在循环里定位特定一次迭代。日志点右键断点 → “添加日志点” → 输入id is {user.id}。它不会暂停程序只是在调试控制台打印一条消息。本质上是不改代码的console.log调试完不用删代码也不会污染提交记录。这个功能用过之后我在开发期几乎不再往代码里写临时console.log了。5.3 验证调试配置是否正确的三个检查动作配置写完别急着说“应该没问题”做三个动作验证第一在源码里打一个断点F5确认能停。第二停在断点后在调试侧边栏看调用栈确认显示的.ts文件名和行号正确而不是.js。第三在调试控制台输入一个变量名确认能打印出值。三个都通过说明 source map、断点绑定、变量作用域三条链路都正常。如果第三步打印出来是undefined但代码逻辑上该有值检查是不是被编译优化掉了——某些 bundler 在 production 模式下会做 tree-shaking 或变量重命名调试时要用 development 模式构建。5.4 一个我常犯的错误早期我总把launch.json当成一次性配置写完就不管了。后来发现项目结构一变——比如改了outDir、换了构建工具、加了路径别名——调试配置就得跟着改否则断点又开始变灰。现在我的习惯是每次调整tsconfig.json的outDir或rootDir顺手检查一遍launch.json里的program和outFiles是否还对得上。路径别名paths尤其容易出问题因为 Node 运行时不认识 TS 的paths需要额外配tsconfig-paths或在 bundler 里处理否则调试时模块解析会失败。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

BQL队列控制:用类SQL规则语言治理消息积压与雪崩

BQL队列控制:用类SQL规则语言治理消息积压与雪崩

做后端的人,迟早会跟消息队列的“失控”正面遭遇一次。我这次要拆解的BQL队列控制,是我们在某订单履约系统里从零搭起来的一套队列治理方案,核心思路是用一种类SQL的声明式规则语言,把“何时限流、何时扩并发、哪些任务优先、触发…

2026/10/12 15:54:13 阅读更多 →
HexView实战:ECU刷写文件转换、裁剪与CRC校验避坑指南

HexView实战:ECU刷写文件转换、裁剪与CRC校验避坑指南

简介:HexView(Vector)V1.09.01是一款面向嵌入式开发、软件逆向与数据分析人员的十六进制查看编辑工具,解决二进制文件逐字节查看、数据格式转换、搜索替换等底层处理需求。压缩包共19个文件,大小仅1.93MB,包…

2026/10/12 15:54:13 阅读更多 →
Win 系统 OpenClaw 2.7.9 安装避坑合集:路径报错、Gateway 离线与 TaoToken 通道配置

Win 系统 OpenClaw 2.7.9 安装避坑合集:路径报错、Gateway 离线与 TaoToken 通道配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 15:53:07 阅读更多 →

最新新闻

Claude Code 高效配置清单:七个开源工具让 AI 编程从能用变好用,TaoToken 统一 Key 接入

Claude Code 高效配置清单:七个开源工具让 AI 编程从能用变好用,TaoToken 统一 Key 接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:09:49 阅读更多 →
曼哈顿距离中位数选址:从水题到通用解题框架

曼哈顿距离中位数选址:从水题到通用解题框架

1. 从一道“水题”说起:为什么它值得认真拆解“Lunch in Grid City”这个标题,第一次看到的人大概率会愣一下——听起来像是个模拟经营游戏,或者某个城市午餐配送的调度问题。实际上,这是一道出现在算法竞赛训练题单里的经典题目&…

2026/10/12 19:09:49 阅读更多 →
Python JSONDecodeError 报错解析:从 Expecting ‘,‘ delimiter 到防御性编程

Python JSONDecodeError 报错解析:从 Expecting ‘,‘ delimiter 到防御性编程

1. 从一个让人抓狂的报错说起json.decoder.JSONDecodeError: Expecting , delimiter: line 1 column 1780 (char 17——这个报错信息我敢打赌,只要写过 Python 处理 JSON 的人,十有八九都见过。它不像FileNotFoundError那样直白,也不像KeyErr…

2026/10/12 19:09:49 阅读更多 →
企业级源码的门道:授权模式、二次开发与选型避坑指南

企业级源码的门道:授权模式、二次开发与选型避坑指南

创业第三年,我终于弄懂了“企业级源码”的门道创业前两年,我几乎被“企业级源码”这四个字PUA了一整轮。最初听到这个词,脑子里浮现的是高大上的系统架构、严密的权限模型、成熟稳定的底层框架,觉得但凡敢叫“企业级”的源码&…

2026/10/12 19:08:49 阅读更多 →
5G信令分析实战指南:从KPI全绿到精准定位问题

5G信令分析实战指南:从KPI全绿到精准定位问题

简介:在移动网络优化中,KPI指标正常并不代表用户体验良好,信令才是定位问题的原始现场。5G信令分析是网优工程师必须掌握的关键技能,围绕RRC建立、NAS注册、切换流程和QoS承载等核心环节,通过信令跟踪、pcap抓包和字段…

2026/10/12 19:08:49 阅读更多 →
AI Ping 上线免费用:MiniMax-M2.1 与 GLM-4.7 的 API/CLI 部署实操,附 TaoToken 统一 Key 配置

AI Ping 上线免费用:MiniMax-M2.1 与 GLM-4.7 的 API/CLI 部署实操,附 TaoToken 统一 Key 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:08:49 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →