Service Worker和Shared Worker有什么区别?
什么情况下应该使用Service Worker而不是Shared Worker,反之亦然?
Service Worker和Shared Worker有什么区别?
什么情况下应该使用Service Worker而不是Shared Worker,反之亦然?
服务工作者比共享工作者拥有更多的功能,一旦注册,它们可以在给定网页的生命周期之外持久存在。
服务工作者可以响应message
事件,就像共享工作者一样,但它们还可以访问其他事件。处理fetch
事件允许服务工作者拦截任何网络流量(源自受控页面),并采取特定操作,包括从Request
/Response
缓存中提供响应。还有plans计划将push
事件暴露给服务工作者,允许Web应用程序在“后台”接收推送消息。
new SharedWorker
和调用该工作者上的terminate方法来编程确定的;而对于服务工作者,浏览器本身决定工作者实例的生命周期以及何时开始,这取决于已注册的事件侦听器。 - Noah Freitas2022年06月更新
WebKit最近增加了对SharedWorker
的支持,有关解决方案的详细信息,请参见下面提到的问题链接。
2020年11月更新
对于任何对此讨论感兴趣的人来说,一个重要的细节是:SharedWorker
不被WebKit支持(在v6左右被故意删除了)。
WebKit团队明确建议在可能涉及到SharedWorker
的地方使用ServiceWorker
。
对于社区希望将此功能恢复到WebKit中的人,请参见此(目前未解决)问题。
除了之前的优秀回答外,需要补充说明的是ServiceWorker与SharedWorker的主要区别在于ServiceWorker是无状态的(会关闭并在全局范围内重新启动),而SharedWorker将在会话期间保持状态。
但是,仍然有可能请求ServiceWorker在消息处理程序的持续时间内保持状态。
s.onmessage = e => e.waitUntil((async () => {
// do things here
// for example issue a fetch and store result in IndexedDb
// ServiceWorker will live till that promise resolves
})())