如何让调试线上 JS 报错像调试本地源码一样优雅?

开发 前端
通过Sourcemap,我们可以调试线上报错的时候直接对应到本地源码来断点调试。要让线上代码关联Sourcemap 可以通过 Charles 断点修改对应的响应,加上一行 SourceMappingURL=xxx 的注释。

当线上有报错的时候,大家是怎么定位问题的呢?

断点调试么?

但是这时候代码是被压缩过的,变量名都是 a、b、c、d 这种,根本看不出啥来。

如果调试线上报错能像本地开发的时候一样就好了。

其实这是可以做到的,今天就分享下如何优雅的调试线上报错:

首先,我们准备一段 JS 代码:

图片

这是我随便找的一段 JS 代码,里面抛了一个错误。

然后用 webpack 进行编译:

图片

在 index.html 里引入构建产物:

图片

然后跑个静态服务器 npx http-server .

图片

浏览器访问,就会发现代码确实报错了:

图片

那问题来了,怎么定位错误原因呢?

首先,我们可以使用异常断点,在抛异常的地方断住:

创建一个 vscode 调试配置:

图片

勾选 uncaught exceptions,在未被捕获的异常处断住:

图片

然后启动调试:

图片

你会发现代码在抛异常的地方断住了,这就是异常断点的功能。当你不知道哪里抛的异常的时候,可以用这个。

但现在代码是被压缩过的,看不出啥来:

图片

怎么能直接定位到抛异常的源码呢?

这时候就要用到 sourcemap 了,它就是用于把编译后的源码映射回源码的:

图片

首先要生成 sourcemap,这个配置下 webpack 的 devtool 为 hidden-source-map 即可:

图片

hidden-source-map 的意思是生成 sourcemap 但是不关联。

图片

如果你配成 source-map,代码是关联了 sourcemap 的:

图片

线上代码不会这样做。

关联 sourcemap 需要在文件末尾加上 //# sourceMappingURL=xxx.js.map 的代码。

但现在这个文件是线上的,不能直接改本地文件。我们可以使用 charles 的断点功能来修改它:

charles 默认不代理 127.0.0.1 的请求,我们要配下 hosts:

图片

比如我配了一个 www.guangtest.com 的域名到 127.0.0.1。

试一下:

图片

hosts 配置生效了:

图片

然后我们要让 charles 拦截这个 url 的请求,需要安装一个插件 SwitchyOmega

不过在那之前要指定一个数据目录,也就是浏览器把插件、历史、cookie 等数据保存在哪里:

图片

不指定的话每次调试都会创建一个临时数据目录来跑调试,上次安装的插件就没有了。

chrome 应用商店搜索 switchy omega:

图片

配置下代理服务器,这里我 charles 是在 127.0.0.1:8888 的:

图片

之后配下 auto switch,让 www.guangtest.com 的请求都走我们刚刚配的代理:

图片

之后点击应用选项。

代理方式设置成 auto switch,也就是根据配置的规则自动切换代理:

图片

这个网页的代理配成 charles 之后,在 charles 就可以抓到对应的请求了:

图片

接下来就是断点修改响应的内容了:

点击 Proxy > Breakpoint Settings

图片

添加一个对 guangtest.com 的 dist/index.js 响应的断点:

图片

强制刷下页面,charles 就会断住:

我们可以修改响应的内容,然后点击 execute 来执行修改:

图片

我加上了这样一行 sourcemap 的关联:

图片

在 chrome devtools 里可以看到拿到的响应是被修改过的:

图片

异常断点现在直接在源码处断住了:

图片

接下来就可以直接调试源码了,可以通过作用域、调用栈等信息来定位报错原因:

图片

这样我们就完成了直接本地调试线上报错代码对应的源码!

案例代码在:https://github.com/QuarkGluonPlasma/fe-debug-exercize。

总结

通过 sourcemap,我们可以调试线上报错的时候直接对应到本地源码来断点调试。

要让线上代码关联 sourcemap 可以通过 charles 断点修改对应的响应,加上一行 sourceMappingURL=xxx 的注释。

然后在 VSCode Debugger 里加个异常断点,这样就可以在异常处断住。

这样就可以快速定位线上错误的原因了,体验就和本地开发时一样!

责任编辑:姜华 来源: 神光的编程秘籍
相关推荐

2013-12-17 09:02:03

Python调试

2014-02-27 13:10:57

Visual Stud调试

2022-08-26 08:17:32

Sidekick开源

2017-05-22 10:33:14

PythonJuliaCython

2015-11-06 16:20:36

107

2015-11-09 10:07:11

107

2021-09-07 10:29:11

JavaScript模块CSS

2022-07-31 19:57:26

react项目VSCode

2011-10-24 13:07:00

2013-08-22 10:17:51

Google大数据业务价值

2015-03-16 12:50:44

2009-12-08 18:06:12

戴尔存储动车组

2009-12-08 14:26:13

大型网络运维

2023-04-05 14:19:07

FlinkRedisNoSQL

2021-10-02 10:36:00

YAML编程语言软件开发

2012-10-26 12:33:58

视频会议视频通信华为

2021-04-13 22:30:17

SpringBoot日志微服务

2016-10-08 00:24:53

httptcp实时

2013-07-26 10:15:29

云计算大数据Hadoop

2023-05-23 13:59:41

RustPython程序
点赞
收藏

51CTO技术栈公众号