我有一个PWA网站,并且有自己的service-worker.js
文件用于缓存。由于某些原因,我想在我的网站上使用推送通知服务。我应该知道这些问题的答案:
1)如何在网站根目录中使用多服务工作者?
2)我可以使用一个服务工作者文件,并在其中放置两个importscript
,两个服务工作者吗?
3)我可以使用伪造的范围注册服务工作者吗? (我的意思是使用范围,它不在我的网站路径中。)
4)如果我使用importscript
,旧用户仍然可以使用缓存吗?
我试图在网站的根目录中使用一个service-worker,并使用importscript
到该服务工作程序文件中,如下所示:
importScripts('https://cdn.onesignal.com/sdks/OneSignalSDKWorker.js');
importScripts('service-worker.js');
我有一个推送通知,一切正常,但是我不知道我的旧用户缓存文件仍然可用吗?
此外,我尝试将两个注册都与在范围内注册一起使用,但是navigator.serviceWorker.ready
(promise
)的订阅始终在pending
中:
navigator.serviceWorker.register('/service-worker.js', {scope: '/fake'})
.then((registration) => {
console.log('ServiceWorker registration successful.', registration)
return navigator.serviceWorker.ready
})
.catch(error => {
console.error('ServiceWorker registration failed.', error)
})
console:
navigator.serviceWorker.ready = Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "pending"
[[PromiseValue]]: undefined
答案 0 :(得分:1)
我会尽力回答您的问题:
1)如何在网站根目录中使用多服务工作者?
您只能在指定范围内按站点注册一个服务工作者:因此,在/
范围中只能注册一个服务工作者,但是您可以在站点的每个范围中添加一个服务工作者(即:在{{1 }}和/
上的一个)
但是如果需要,您可以将2个服务人员合并为一个。
2)我可以使用一个服务工作者文件,并在其中放两个服务工作者的两个importscript吗?
是的,您可以放置任意数量的eventListener,它们按声明顺序执行,但是要小心,除非javascript中的/user
,所有脚本都以require
导入共享相同的作用域,因此如果单个脚本共享某个变量名,它们可能会遇到问题。
3)我可以使用伪造的范围注册服务工作者吗? (我的意思是使用范围,它不在我的网站路径中。)
您可以,但是SW的范围决定了它的执行上下文,因此它将被加载到您的计算机/电话上,但是只有在其下一页({{1} }或importScripts()
),或者如果您在此范围内调用资源(website.com/fake
)
4)如果我使用importscript,旧用户仍然可以使用缓存吗?
这取决于您在website.com/fake/whateverelse
和website.com/fake/style.css
阶段所做的工作。除非您在代码中明确进行安装,否则安装新的SW或新版本的SW不会清除缓存。