SharedWorker 是浏览器端跨页面 WebSocket 状态实时共享的最可靠方案,因其同源标签页共用唯一执行环境与 WebSocket 实例,实现强一致状态同步。

SharedWorker 是目前浏览器端实现跨页面 WebSocket 长连接状态实时共享的最可靠方案。它不依赖页面存活,所有同源标签页共用一个执行环境,WebSocket 实例真正唯一,状态天然同步——不是靠“通知”,而是靠“共用”。
SharedWorker 是状态共享的唯一可行载体
每个页面的 window 对象相互隔离,localStorage 和 BroadcastChannel 只能传递事件或快照,无法让多个页面真正复用同一个 WebSocket 实例。而 SharedWorker 的全局作用域中,变量、定时器、WebSocket 对象全部共享。只要有一个页面打开,Worker 就持续运行;连接建立后,所有页面看到的都是同一套状态(readyState、心跳计时、重连次数等)。
- Worker 内部声明
let ws = null和let connectionState = 'closed',所有页面通过 postMessage 读取的都是这个变量的当前值 - 页面无法直接访问
ws,但可通过{ type: 'get_status' }指令请求 Worker 返回{ state: ws?.readyState, lastPing: Date.now() } - Worker 主动广播状态变更:
port.postMessage({ type: 'status_update', state: 'connecting', ts: Date.now() }),各页面可据此更新 UI 指示器
用端口标识 + 状态快照实现精准状态分发
虽然连接是共享的,但每个页面关心的状态维度不同:A 页面需要“是否已订阅用户消息”,B 页面关注“是否收到最新心跳响应”。Worker 需为每个接入端口维护轻量状态快照,而非只广播全局连接态。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 页面初始化时发送
{ type: 'register', clientId: 'tab-xyz' },Worker 存入Map<clientid subscribedtopics: lastheartbeat:></clientid> - 当服务端下发一条消息,Worker 不仅检查
ws.readyState === WebSocket.OPEN,还比对msg.targetClientId === 'tab-xyz',再决定是否推送给该 port - 页面关闭前发
{ type: 'unregister' },Worker 清理对应条目;若页面异常断开,Worker 可通过port.onclose或定期调用self.clients.matchAll()核对活跃端口
状态同步必须由 Worker 全链路闭环管理
页面主线程不可信——刷新、崩溃、后台冻结都会中断其 JS 执行。所有影响连接状态的关键逻辑,必须在 Worker 内完成,且自成闭环。
立即学习“前端免费学习笔记(深入)”;
- 心跳检测不用
setTimeout,改用setInterval并记录lastReceivedPong时间戳;超时即触发ws.close(),不等待页面指令 - 重连失败时,Worker 更新自身
reconnectAttempt = 3,并广播{ type: 'reconnect_failed', attempt: 3, nextIn: 8000 },各页面可显示倒计时提示 - 连接恢复后,Worker 自动重发所有端口缓存的
subscribe请求,并标记isResubscribing: true,避免页面重复提交
兼容性兜底要覆盖 Safari 旧版本
Safari 在 iOS 16.4 / macOS 13.3 之后才完整支持 SharedWorker。降级方案不能只做“连接失败就报错”,而应无缝切换到状态可同步的替代路径。
- 初始化时先尝试
new SharedWorker(...),捕获DOMException后 fallback 到 BroadcastChannel + localStorage 时间戳主控选举 - 降级模式下,Worker 替换为一个“伪共享”状态中心:主控页把
{ wsState: 'open', pingTs: 1745961200 }写入 localStorage,其他页面监听storage事件同步该对象 - 关键区别在于:降级方案中状态是“最终一致”的(毫秒级延迟),而 SharedWorker 是“强一致”的(内存级同步)——业务需接受这点差异


















