有点标题党了,不过写完这个 WebSocket 插件后我自己逛了一圈,确实目前全网无代餐,大家可以放心食用。而且这个 WebSocket 调试插件全程本地运行,不用担心隐私泄露。那我们开始
开门见山,先说这个插件适合谁?适合任何需要调试 WebSocket 的开发者
因为它提供了 监控、拦截、模拟、收藏 等其他 WebSocket 插件都没有的功能,基本对于之前浏览器 Network 的功能不满意的点,基本都能在这里找到答案。如果各位还有兴趣,下面我介绍核心功能和使用场景
(支持中文/英文,可手动切换语言)
实际演示:
首先,我们进入任意网站并成功建立了一个 WebSocket 连接(这里我使用了 websocketking.com 的测试页面,很好用的测试网站,推荐),然后按 F12 打开 DevTools ,找到 WebSocket DevTools 标签页,可以看到插件自动捕获到了这个连接,并且可以查看连接的详细信息
测试地址使用的是 wss://echo.websocket.org ,功能是回复我们发送的消息
(这里演示使用的是英文,是因为录屏实在太麻烦了,就没有重录了,抱歉。进入插件后会自动检测浏览器语言,也可以手动直接切换语言)
以前调试
WebSocket,最怕的就是“消息丢了”,在WebSocket建连之前忘了打开Network就会错过时机而看不到消息。而我们很好得解决了这个问题
功能亮点: 后台监控 即使 Network 关了也能抓包,不会因为错过时机而需要重新刷新网页(这是我自己的一个痛点😂)
实际演示:
打开消息拦截,比如 拦截接收 消息,那么我们给 echo.websocket.org 发送消息后,回复的下行消息被直接拦截,并且展示在了我们的消息列表里面。这个功能结合下面介绍的模拟功能,可以实现类似于对于 HTTP API 请求的代理功能。
功能亮点: 拦截上下行消息,目前市面上几乎没有类似能力的工具
“每次想测个边界条件,都得等后端配合?不如自己造数据!”
实际演示:
点击右下角的小飞机,打开模拟控制台,然后输入消息,点击发送、接收。
模拟发送,动图中可以看到,可以看到消息被发送到了 echo.websocket.org ,并且收到回复,但是此时 拦截接收 被打开,下行消息被直接拦截。然后我关闭后,再次发送消息,Server 侧成功收到并且回复
对于模拟接收,效果同理。那么此功能打通了加法,流量控制打通了减法,那么你就完全掌控了一个 WebSocket 连接的的行为
模拟消息是不受消息拦截影响的,也就是说,模拟消息不会被拦截。这样更便于开发者调试
有时候,格式化就是生产力
“以前看一坨嵌套 JSON ,脑壳疼。现在自动高亮、折叠,终于能一眼看明白。”
实际演示:
图中可以看到,后端发送了一个嵌套的 JSON,正常的工作流是复制 String 状态的 JSON 到某个三方解析工具格式化,然后查看(当然部分开发已经锻炼出了在字符串中人肉找到所需要值的能力,值得敬佩 👀)。接着,编辑器会提示说检测到这是一个有嵌套的 JSON,可以通过点击/关闭嵌套解析按钮来切换状态。同时,编辑器也支持一键复制、收藏、以及进入模拟控制台面板去编辑发送。(后文会提到收藏)
举个例子
{
"category": "fruits",
"items": [
{
"id": "fruit_001",
"name": "apple",
"type": "pome",
// 👇 这就是一个经典的嵌套 JSON ,非常考验眼力 👀
"origin": "{\"country\":\"USA\",\"regions\":[{\"name\":\"Washington\",\"climate\":\"temperate\",\"altitude\":{\"min\":500,\"max\":1500,\"unit\":\"m\"}},{\"name\":\"California\",\"climate\":\"mediterranean\"}],\"certifications\":{\"organic\":true,\"gmoFree\":true}}",
"varieties": [
{
"id": "apple_var_01",
"name": "Fuji",
"color": "red",
"taste": "sweet",
"season": {
"start": "October",
"end": "March"
}
},
]
}
]
// ... ...
}
看到这里,我相信大家都知道如何使用这个插件了,但是我也多几句。
对于前端开发,比如后端部署还没有完成,我们前端可以直接拦截掉某条消息,然后在模拟控制台中编辑(比如 GIF 中,把USA的字段改为了CHINA),然后再模拟发送回来,这样就可以独立于后端进行测试。对于一些需要测试的边界条件,我们也可以在模拟控制台中编辑,然后模拟发送回来,或者发送出去
对于后端开发,同样的,也可以利用这个在产线环境,进行模拟测试,修改前端的输入来 Debug ,调试刚刚部署好的后端逻辑。总之用处多多
实际演示:
那么基于上述功能,我想到或许某些很复杂的、常用的消息,可以收藏起来,然后直接发送。那么自然,我们的 收藏 功能就孕育而出。
在 收藏 功能中,每条消息都是可以被快速模拟发送、模拟接收的,且可以二次编辑,直接看演示
实际演示:
Network 面板没有对于 系统事件 的监控和调试,现在我们有了一个更专业的面板来展示。
里面可以“模拟”掉 客户端的事件 + 服务端的事件。
在演示里面,我完成了两次 Close 操作,一次是在模拟控制台使用客户端关闭事件 1000,一次是在连接实例处,点击关闭开关完成。
实际演示:
因为插件是在 JS 层进行的
中间人拦截,那么 JS 感知不到的系统事件,我们同样也无法感知。至于为什么在 JS 层拦截,是因为CDP (Chrome DevTools Protocol)这层没有暴露拦截修改的能力。具体的实现原理可以见下面的技术原理章节总之,目前只有
close1000或者大于3000的自定义事件,可以被真实发送给服务端,而服务端的error等事件,也是通过onError等来触发的
其实大家看到所有调试的功能也具备了,那么此时,我们只需要增加一个手动建联的功能,那么我们就可以把其当作一个 WebSocket 客户端来使用。另外已经支持了记录最近 3 次使用的 WebSocket地址,可以一键触达创建连接。
实际演示:
这个其实大家都会哈,但是为了凑一个章节,还是放在这里
Chrome 商店安装
( Edge 也可用)启用扩展
F12 打开开发者工具WebSocket DevTools 标签页
核心实现,在 JS 层做了一次中间人拦截,直接把 new WebSocket 进行了一个替换劫持,这样真实的 WS 做的任何事,只要 JS 层可以感知的,我们都可以感知到,并且转发出去。核心方向确定了,剩下就是事件在 Chrome 插件系统中不同 Context 之间的传递事件的问题了。接着,在此基础上,建构了用户友好的 UI 和功能,比起技术实现,在我这里用户友好是最重要的
其他更多的功能,可以直接访问 GitHub
也可以直接访问 DeepWiki,里面有详细的架构实现,上面的架构图也是出自 DeepWiki
想到这个需求,是因为我们业务重度依赖 WebSocket,那自然上面任何一个痛点我都经历过。我当时最希望的是可以 嵌套解析,可惜每次都需要复制到第三方才能完成。后来在查线上问题的时候,我希望可以模拟后端消息,不然整个 Bug 难以复线,但是我做不到。
还有很多啦,总之,所以这个需求不是 凭空出现 的,是基于我自己的实际需求。然后我花了很多时间把整个产品的 UI 做了个人喜好的偏向,终于完成了。最后,特别是把其作为一个 完整的产品 发布( Chrome Web Store 、官网、Github 、视频教程)这整个过程还是挺有意思的
感谢各位看到这里,如果觉得这个插件对你有帮助,欢迎给个 Star 或者五星支持一下,也欢迎大家提意见,谢谢
完
1
msmmbl 87 天前 赞!公司搞和 ai 聊天用的就是 ws ,调试起来确实麻烦。
|
2
dafei110 87 天前
非常赞,已 Star~
|
3
BlackDoge 87 天前
已安装,支持
|
4
codehz 87 天前
我希望还有类似 network 面板的按速度的流量控制或者延迟控制,也就是类似模拟网络不稳定时的延迟(当然 ws 丢包是不可能的)
然后这个扩展似乎对 WebSocketStream 无效,对 web worker 里的 websocket 也无效 |
5
syntaxj 87 天前
都挺好的 但是数据量多推送频繁的时候感觉界面有点掉帧或者卡卡的
|
9
lqhhh OP @codehz 嗯要做延迟的话,目前只能 Block 后,在打开模拟面板,里面一个一个接收,手动控制延时。我想想。然后 WebSocketStream 确实没有支持,目前只劫持了 new WebSocket 。WebWorker 虽然没有支持,但是 Iframe 里面的支持了
|
12
syntaxj 86 天前
@lqhhh #11 本地 vite 跑的项目, 接的后端的 ws 一秒几十条吧 然后累计到几千条可能就开始有整体掉帧的感觉了,还有滚动也是. 有空可以试下 mock 数据量频/量大的情况测测看
|
14
ioioj5 84 天前
已安装
|