页面 frozen 时 websocket 需在 freeze 事件中主动关闭、清监听器、存上下文;resume 时基于 sessionstorage 智能重建连接并同步消息,禁用 visibilitychange/pagehide 关闭、避免复用实例,并为 discarded 场景兜底。

页面进入 frozen 状态时,JavaScript 执行被系统级暂停——定时器停摆、fetch 中断、WebSocket 的 onmessage/onclose 回调不再触发,但连接本身可能仍处于 TCP open 状态,持续消耗后台心跳、电量和服务器资源。此时不能靠“主动关闭”,而要借助生命周期信号,在冻结前安全挂起,在恢复后精准续连。
冻结前:用 freeze 事件触发 WebSocket 主动降级
freeze 是唯一可靠、可执行 JS 的最后时机。此时连接尚存、内存未清、DOM 可读,必须立刻做三件事:
- 调用
websocket.close(1001, "going frozen")主动关闭连接(1001 表示 “going away”,语义明确,服务端可识别为预期下线) - 清除所有绑定的事件监听器(
websocket.removeEventListener),避免 resume 后重复触发 - 保存必要上下文到
sessionStorage,如:lastMessageId、authTokenExpiry、reconnectDelay等轻量字段
恢复时:用 resume 事件重建连接而非重连
resume 触发不代表页面重启,而是 JS 执行环境“解冻”。此时 DOM 和旧 WebSocket 实例已失效,但你可以基于保存的状态智能重建:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 检查
sessionStorage中是否有有效 token 和未确认消息 ID;若 token 过期,先静默刷新再建连 - 新建 WebSocket 实例,并在
onopen后立即发送同步请求(如{"type":"sync","from_id":lastMessageId})拉取断连期间的增量消息 - 不自动重放未送达的本地消息——先和服务端对账,避免重复投递
避免常见误操作
很多实现卡在“以为连接还在”,结果 resume 后发消息失败却不感知。关键要守住两条边界:
- 不依赖
visibilitychange或pagehide关闭 WebSocket:它们可能不触发,或触发时连接已不可控 - 不在
freeze中发起新 fetch 或尝试读取websocket.bufferedAmount:该值在冻结前可能已失真,且读取操作本身可能被中断 - 不把 WebSocket 实例存在全局变量里等 resume 时复用:它已被浏览器标记为 closed,强行调用 send 会抛错
补充:Discarded 场景需单独兜底
如果页面被彻底丢弃(document.wasDiscarded === true),resume 不会触发。此时需在页面加载初期就检查该标志:
- 若为 true,清空旧连接状态,走完整初始化流程(含鉴权、首次同步)
- 配合服务端支持“断点续传式”消息协议(如带 sequence id 的消息流),确保不漏、不重、不乱序
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










