javascript - 防止 Service Worker 自动停止

标签 javascript service-worker

Service Worker 似乎在某个时刻自动停止。此行为无意中关闭了在激活时建立的 WebSocket 连接。

什么时候停止,为什么停止?我如何以编程方式禁用此意外操作以保持 Service Worker 保持运行?

最佳答案

您看到的是预期的行为,不太可能改变。

Service Worker 有意让生命周期很短。它们是响应特定事件(installactivatemessagefetchpush 等),执行他们的任务,然后很快“死”。生命周期通常足够长,可以在 worker 死了,但它最终会死。这就是为什么不要依赖脚本中的任何全局状态,并在 service worker 启动时通过 IndexedDB 或缓存存储 API 引导所需的任何状态信息非常重要。

Service Worker 是有效的后台进程,每当您访问某些网页时就会安装这些进程。如果允许这些后台进程无限期运行,则会增加对设备/计算机的电池和性能产生负面影响的风险。为了减轻这种风险,您的浏览器只会在知道有必要时运行这些进程,即响应事件。

WebSockets 的一个用例是让您的客户端监听来自服务器的一些数据。对于该用例,使用 WebSockets 的服务 worker 友好替代方法是使用 Push Messaging API并让您的服务人员响应 push 事件。请注意,在当前的 Chrome 实现中,您必须在处理 push 事件时显示用户可见的通知。目前不支持“静默”push 用例。

如果您不是从服务器监听数据,而是使用 WebSockets 作为从客户端向服务器发送数据的方式,那么不幸的是,没有很好的服务 worker 友好的方式来做到这一点。在未来的某个时候,可能有一种方法可以注册你的服务 worker ,通过周期性/基于时间的事件唤醒,此时你可以使用 fetch() 将数据发送到服务器,但目前在任何浏览器中都不支持。

P.S.:当您打开其 DevTools 界面时,Chrome(通常)不会杀死服务 worker ,但这只是为了简化调试,而不是您应该依赖于真实应用程序的行为。

关于javascript - 防止 Service Worker 自动停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741922/

相关文章:

php - 告诉从哪里包含了 .php 文件?

javascript - 为什么返回 Object.keys() 一个对象(看起来像数组)?

javascript - Google map v3 - 限制功能可以工作的区域

javascript - Service Worker 中的哈巴狗模板引擎

javascript - Service Worker - 使用 skipWaiting() 在新版本上更新缓存

javascript - 通过 service-worker 的请求完成了两次

javascript - 是否可以对 ES6 map 对象进行排序?

javascript - 在 Three.js 场景中使用 div 和 canvas 元素有什么区别?

logging - 使用 workbox-webpack-plugin 时启用日志记录

javascript - 当浏览器在后台运行时收到通知时使用 Firebase 播放声音