SharedWorker 不能直接共享 WebSocket 实例,但可作为连接中枢统一管理:Worker 内创建唯一 WebSocket,各页面通过 MessagePort 发送指令(如 send、subscribe)并接收广播数据;需处理重连、状态同步、消息缓存与端口清理。

不能直接用 SharedWorker 共享 WebSocket 实例,因为 WebSocket 对象本身不可跨线程传递(它不是可转移对象,也不支持结构化克隆)。但可以用 SharedWorker 作为“连接中枢”,由它统一管理 WebSocket 连接,多个标签页通过 MessagePort 与之通信,实现多页共用一个底层连接。
核心思路:SharedWorker 做连接代理
所有标签页不自己创建 WebSocket,而是连接到同一个 SharedWorker;Worker 内部维护唯一 WebSocket 实例,并负责收发消息、重连、状态同步等。各页面只负责发送指令(如 send、subscribe)和接收广播数据。
SharedWorker 端(shared-worker.js)
需处理连接生命周期、多端消息分发、错误恢复:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 用
self.onconnect接收页面连接,保存每个port并建立初始握手 - WebSocket 创建在 Worker 全局作用域,只初始化一次(检查
ws === null) - 收到页面发来的
{ type: 'send', data: ... }时,调用ws.send() - WebSocket
onmessage触发后,遍历所有活跃 port,用port.postMessage()广播给所有页面 - 监听
onclose和onerror,自动重连(带退避策略),并通知各页面连接状态变化
页面端使用方式
每个标签页创建 SharedWorker 实例,通过 port 收发消息:
- 初始化:
const sw = new SharedWorker('shared-worker.js'); - 监听消息:
sw.port.addEventListener('message', e => console.log(e.data)); - 启动通信:
sw.port.start(); - 发送指令:
sw.port.postMessage({ type: 'send', data: JSON.stringify({ action: 'ping' }) }); - 可约定协议字段如
type: 'subscribe'或'auth',由 Worker 解析并透传或拦截
注意事项与常见坑
SharedWorker 的行为受浏览器限制,实际落地要注意:
- 必须通过
http://localhost、https://或file://(部分浏览器允许)加载,http://127.0.0.1可能被当作不同源而隔离多个 Worker 实例 - 同一域名+协议+端口下,所有页面共享同一个 SharedWorker 实例;换域名或端口会新建,无法互通
- 页面关闭时不会自动终止 Worker,Worker 会持续运行直到所有引用页面关闭且无活跃端口(可监听
port.onclose清理) - WebSocket 断开后,Worker 需缓存待发送消息,待重连成功后再 flush,否则页面发的消息会丢失
- 避免在 Worker 中直接
console.log调试——要用self.console.log,且 DevTools 需打开 “Application > Shared Workers” 面板查看










