前端Network面板调试技巧与性能优化实践

A. 玉银 工具 阅读 1,357
赞 13 收藏
二维码
手机扫码查看
反馈

Chrome DevTools Network面板那些坑

昨天调试一个接口请求问题,折腾了一上午才发现自己Network面板设置有问题。这里记录一下我踩的几个坑,免得以后再犯同样的错误。

缓存导致的问题排查失败

最开始遇到的问题是接口明明返回了新数据,但在Network面板里看到的响应却是旧的。折腾了半天,后来试了下发现是因为浏览器缓存了响应。Chrome默认会缓存一些GET请求,如果请求的URL没变,直接显示缓存的内容。

解决方法很简单,打开DevTools后按F1进入设置页面,在”Disable cache”选项打勾。或者可以直接在Network面板右键选择”Clear browser cache”。我一般习惯在调试时直接禁用缓存,这样看的都是实时数据。

Throttling模式的误用

这里我踩了个坑。为了让测试更接近真实环境,我设置了Fast 3G网络模式进行调试,结果接口响应特别慢,一度以为是后端出了问题。后来才意识到可能是网络限制导致的延迟。

Throttling这个功能确实有用,但要记得在正式调试时把它关掉。常见的预设包括Fast 3G、Slow 3G、Online等。如果不确定当前的网络状态,可以在Network面板顶部查看当前的节流设置。我的经验是日常开发时保持”Online”状态,只有在模拟弱网环境时才切换到其他模式。

Filter功能救了我的命

项目复杂后,Network面板里的请求列表变得很长,想找特定接口就像大海捞针。后来发现了Filter功能,真的是救命稻草。

在Network面板上方的过滤框里可以直接输入关键词筛选,比如输入”/api/user”就能找到相关的用户接口请求。还可以用文件扩展名筛选,像”.js”、”.css”、”.png”等。更高级的是可以用状态码筛选,输入”status-code:500″就能找出所有500错误的请求。

常用的筛选语法我整理了一下:

  • 按请求类型:xhr、fetch、websocket
  • 按状态码:status-code:404、status-code:2xx
  • 按域名:domain:example.com
  • 按大小:size:>100kb、larger-than:1mb

Copy as curl的神奇用途

开发过程中经常需要在Postman或其他工具里复现某个请求,手动构建参数很麻烦。后来发现了”Copy as cURL”功能,简直不要太方便。

在具体的请求上右键,选择”Copy as cURL”,然后粘贴到命令行就能直接发送相同的请求。需要注意的是,如果是HTTPS请求且服务器证书有问题,可能需要加上–insecure参数。

不过这里有个小问题,复制出来的cURL命令可能包含一些敏感信息,比如Authorization header。所以最好检查一下要不要脱敏后再分享给同事。

Preserve log的必要性

调试SPA应用时经常会遇到页面跳转导致Network记录被清空的问题。一开始我还以为请求没发出去,后来才知道是DevTools自动清理了历史记录。

在Network面板顶部勾选”Preserve log”选项后,即使页面刷新或跳转,之前的请求记录也会保留。这个功能对于调试路由变化时的网络请求特别有用。但我发现勾选这个选项后内存占用会增加,所以一般只在需要的时候开启,调试完成后及时关闭。

Response预览的小技巧

Network面板的Preview标签页可以格式化JSON响应,这点很好用。但对于复杂的JSON结构,Preview显示可能不够清晰。这时候可以在Response标签页查看原始数据。

有时候服务器返回的JSON格式有问题,Preview会显示解析错误,但Response里能看到原始内容。我发现这种情况下通常是后端返回了多余的字符,或者编码有问题。可以通过查看Response来定位具体是哪个字符导致的解析失败。

Timing详细分析

当接口响应比较慢时,我习惯点开Timing详情看看具体在哪个阶段耗时最多。这里的几个关键指标很重要:

  • Queueing:排队等待时间
  • Stalled:停滞时间,包括DNS查询等
  • Request/Response:实际的请求响应时间
  • Content Download:内容下载时间

如果Queueing时间长,可能是浏览器对同一域名的并发连接数有限制。Stalled时间长通常是DNS查询或代理问题。Request/Response时间长说明服务器处理慢。Content Download时间长说明响应体太大。

Performance面板联动调试

有时候单纯看Network面板的信息还不够,需要结合Performance面板进行更详细的分析。把两者配合使用,可以同时看到网络请求和JavaScript执行的时间线。

我一般会在Performance面板录制时顺便观察Network面板的变化。这样能够看出网络请求是否影响了页面性能,以及某些请求是否阻塞了页面渲染。虽然这种方法有点复杂,但对于解决性能问题很有帮助。

导出Har文件便于分享

遇到复杂的网络问题需要跟后端同学协作排查时,我会把Network记录导出成Har文件。右键Network面板空白处,选择”Save all as HAR with content”,就能得到完整的请求记录。

Har文件包含了所有请求的详细信息,包括headers、body、timing等。后端同学拿到这个文件后可以在Charles、Wireshark等工具里查看,很方便进行问题定位。不过要注意Har文件可能包含敏感信息,导出前要确认是否需要脱敏处理。

WebSocket调试经验

项目里用了WebSocket,发现Network面板也能监控WebSocket连接。刚开始我还不知道怎么看WebSocket的消息,后来发现点击WebSocket连接后,Frames标签页会显示所有的消息帧。

这里需要注意的是,WebSocket连接的生命周期比较特殊。连接建立后会一直保持,直到显式关闭或超时。在调试时要注意区分心跳消息和业务消息,避免被心跳包干扰。另外,如果WebSocket连接频繁断开重连,可以在Console面板查看是否有相关错误信息。

常见错误排查套路

总结一下我常用的网络问题排查流程:

首先看Status Code,4xx通常表示客户端错误,5xx表示服务端错误。然后看Response内容,看看是不是有错误信息。接着检查Request Headers,确认认证信息是否正确发送。最后看Timing详情,分析性能瓶颈。

对于CORS问题,一般在Headers里能直接看到Access-Control-*相关的错误。对于证书问题,通常会显示安全相关的警告。这些都有固定的模式,见多了自然就有经验了。

以上是我踩坑后的总结,希望对大家有帮助。如果你有更好的Network分析技巧,欢迎评论区交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论