Service Worker 似乎在某个时刻自动停止。此行为无意中关闭了在激活时建立的 WebSocket 连接。
什么时候停止,为什么停止?我如何以编程方式禁用此意外操作以保持 Service Worker 保持运行?
最佳答案
您看到的是预期的行为,不太可能改变。
Service Worker 有意让生命周期很短。它们是响应特定事件(install
、activate
、message
、fetch
、push
等),执行他们的任务,然后很快“死”。生命周期通常足够长,可以在 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/