讲师中心 微信公众号
AI工具推荐 视频效率加速

如何利用 SharedWorker 维护全局长连接心跳减少多标签页网络唤醒

阿浩同学_5193

阿浩同学_5193

发布时间:2026-05-14 15:29:26

|

175人浏览过

|

来源于php中文网

原创

SharedWorker 是唯一能实现多标签页共用单心跳连接的机制——所有页面共享一条 WebSocket,由 SharedWorker 内 setInterval 每 30 秒发 ping,服务端需响应 pong;Worker 收到后重置时间戳,连续两次超 45 秒未收到则 close 并指数退避重连(初始 1s,上限 30s),重连前清除旧定时器;状态变更通过 port.postMessage 单向广播,页面仅监听不轮询,避免 BroadcastChannel 唤醒开销;必须严格绑定心跳、重连、清理逻辑,否则比单页更耗资源。

如何利用 sharedworker 维护全局长连接心跳减少多标签页网络唤醒

SharedWorker 是唯一能避免多标签页各自心跳唤醒、把心跳逻辑收束到单点执行的机制——所有页面共用一条连接,心跳只发一次,不依赖页面是否在前台。

SharedWorker 内必须自己发 ping,不能靠页面定时器

页面切后台后,主线程的 setInterval 会大幅降频甚至暂停(Chrome 通常降到 1s 以上,Firefox 可能完全冻结),导致心跳失效、服务端误判断连。SharedWorker 不受页面活跃状态影响,只要还有同源页面打开,它就持续运行。

  • 在 SharedWorker 脚本中用 setInterval(() => ws.send('ping'), 30000) 发心跳,不要传参、不依赖页面传来的 timer ID
  • 服务端必须响应 'pong',Worker 收到后重置本地“最后收到 pong 时间戳”
  • 连续两次未在 45s 内收到 pong(即超时 + 重试窗口),主动调用 ws.close() 并触发重连
  • 别在 ws.onmessage 里直接处理 pong —— 要先判断 event.data === 'pong',否则业务消息可能被误判

心跳失败后必须指数退避重连,且禁止多页面并发触发

如果每个页面都监听自己的 onclose 并立刻重连,几十个标签页会在断连瞬间同时发起连接请求,服务端可能触发频控或连接拒绝。

  • 重连逻辑必须全在 SharedWorker 内:检查 ws?.readyState === WebSocket.CLOSED 后才执行 new WebSocket(url)
  • 使用 setTimeout 实现退避,避免 setInterval 积压未清除的定时器:setTimeout(connect, delay),delay 初始为 1000,每次失败翻倍,上限 30000
  • 重连前清空旧心跳定时器:clearInterval(pingIntervalId),重连成功后再重新 setInterval
  • 页面不能监听 onclose 后自行重连 —— 它们只该监听 Worker 发来的 { type: 'status', state: 'reconnecting' } 做 UI 提示

心跳与连接状态必须跨页面同步,但不能靠轮询

用户可能在 A 标签页看到“已连接”,却在 B 标签页看到“断开”,这种状态不一致源于各页面独立维护连接状态。SharedWorker 要承担状态广播职责,但广播本身不能成为新唤醒源。

  • Worker 每次状态变更(connecting / open / reconnecting / closed)都调用 port.postMessage({ type: 'status', state, timestamp: Date.now() })
  • 页面收到后更新本地状态,但不做任何定时轮询或主动拉取 —— 状态变更只由 Worker 单向推送
  • 避免用 BroadcastChannel 同步状态:它会在每个页面触发事件,反而增加不必要的 JS 执行和潜在唤醒
  • Worker 自身用 self.clients.matchAll() 不可用(SharedWorker 不支持),所以必须靠 port 列表逐个推送,确保无遗漏

最容易被忽略的是:心跳不是发了就完事,它必须和重连、状态清理、端口生命周期绑定。一个没清理的 setInterval 会在所有页面关闭后继续跑 30 秒,而一个没校验 readyState 的重连会反复 new WebSocket 导致内存泄漏。这些细节不处理,所谓“全局心跳”反而比单页更耗资源。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

4726

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

1169

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

4664

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

920

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

1836

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

3365

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

4373

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2860

2023.09.20

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
誉天教育RHCE视频教程
誉天教育RHCE视频教程

共9课时 | 1.7万人学习

尚观Linux RHCE视频教程(二)
尚观Linux RHCE视频教程(二)

共34课时 | 6.9万人学习

尚观RHCE视频教程(一)
尚观RHCE视频教程(一)

共28课时 | 5.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn