sharedworker 是多窗口消息同步最直接有效的原生方案,需同源、https/localhost、绝对路径脚本及新版本 safari 支持;通过 clientid 注册/注销管理连接,按 targetclientid 或 topic 路由消息;构造失败时降级为 broadcastchannel + localstorage 选举主控页维持一致性。

SharedWorker 是实现多窗口即时消息同步最直接有效的原生方案,核心在于让所有同源页面共享一个后台线程,统一处理连接、路由和分发,避免重复建连与状态错乱。
必须满足的基础条件
不是所有环境都能用 SharedWorker,上线前务必确认:
- 所有页面必须严格同源——协议、域名、端口完全一致
- 只能运行在安全上下文:https 或 localhost,file:// 协议下会静默失败
- SharedWorker 脚本路径需为绝对 URL(如 /js/sw.js),相对路径易因页面路径不同而加载失败
- Safari 用户需 iOS 16.4+ 或 macOS 13.3+,旧版本需降级 fallback
连接与身份管理
多个窗口共用连接,但消息不能混发,必须靠唯一标识做隔离:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 每个页面初始化时生成 clientID,推荐使用 crypto.randomUUID()
- 连接 SharedWorker 后立即发送 { type: "register", clientId } 指令
- Worker 内用 Map 存储 clientId → MessagePort 映射关系
- 页面关闭前主动发 { type: "unregister", clientId },Worker 及时清理,防止脏数据和内存泄漏
消息分发逻辑
消息不简单广播,而是按需路由:
- 服务端推送消息中需携带 targetClientId 或 topic 字段
- Worker 收到后查 Map,只将消息 postMessage 给匹配的 port
- 全局通知(如系统公告)可遍历所有 port 广播
- 页面端仅监听自己的 port.onmessage,收到后直接更新 UI 或触发 Notification,无需重复申请权限
容错与降级策略
SharedWorker 构造失败不会报错,必须主动检测并兜底:
- 创建后检查 worker.port 是否存在,不存在则 fallback 到 BroadcastChannel + localStorage 时间戳选举主控页
- 主控页负责建 WebSocket 连接,其余页面监听 BroadcastChannel 消息复用该连接
- 主控页每 20 秒刷新 localStorage 时间戳,从属页超时(如 >35 秒)自动重新竞拍
- 所有降级路径都要保证消息不丢失、不重复、能正确路由,尤其注意页面刷新后的状态重建










