Javascript 需要有关在域中使用多服务工作程序的信息

Javascript 需要有关在域中使用多服务工作程序的信息,javascript,push-notification,service-worker,web-push,Javascript,Push Notification,Service Worker,Web Push,我有一个PWA网站,有自己的service worker.js文件用于缓存。出于某些原因,我想在我的网站上使用推送通知服务。我应该知道这些问题的答案: 1) 如何在网站根目录中使用多服务工作人员 2) 我可以使用一个服务人员文件并在其上放置两个服务人员的importscript 3) 我可以使用假范围注册服务人员吗?(我的意思是使用范围,但它不在我的网站路径中。) 4) 如果我使用importscript,缓存是否仍可用于我的老用户 我尝试在网站的根目录中使用一个服务人员,并将importscr

我有一个PWA网站,有自己的
service worker.js
文件用于缓存。出于某些原因,我想在我的网站上使用推送通知服务。我应该知道这些问题的答案:

1) 如何在网站根目录中使用多服务工作人员

2) 我可以使用一个服务人员文件并在其上放置两个服务人员的
importscript

3) 我可以使用假范围注册服务人员吗?(我的意思是使用范围,但它不在我的网站路径中。)

4) 如果我使用
importscript
,缓存是否仍可用于我的老用户

我尝试在网站的根目录中使用一个服务人员,并将
importscript
使用到该服务人员文件中,如下所示:

importScripts('https://cdn.onesignal.com/sdks/OneSignalSDKWorker.js');
importScripts('service-worker.js');
我收到了推送通知,一切正常,但我不知道我的旧用户缓存文件仍然可用

此外,我还尝试使用register将它们两个都注册到scope中,但是
navigator.serviceworner.ready
promise
)的订阅始终处于
挂起状态:

navigator.serviceWorker.register('/service worker.js',{scope:'/fake'})
。然后((注册)=>{
console.log('ServiceWorker注册成功',注册)
返回navigator.serviceWorker.ready
})
.catch(错误=>{
console.error('ServiceWorker注册失败',错误)
})
控制台:
navigator.serviceWorker.ready=承诺{}
__承诺
[[PromiseStatus]]:“待定”
[[PromiseValue]]:未定义

我将尝试回答您的问题:

1) 如何在网站根目录中使用多服务工作人员

您只能在指定范围内按站点注册一名服务人员:因此,只能在
/
范围内注册一名服务人员,但您可以在站点的每个范围内添加一名服务人员(即:在
/
上注册一名,在
/user
上注册一名) 但如果需要,您可以将2个服务人员合并到一个服务人员中

2) 我可以使用一个服务人员文件并在其上放置两个服务人员的importscript吗

是的,您可以这样做,您可以放置任意数量的eventListener,它们是按声明顺序执行的,但是要小心,除非javascript中的
要求
,否则所有带有
importScripts()
的脚本导入共享相同的范围,因此如果单个脚本共享某个变量名,它们可能会出现一些问题

3) 我可以使用假范围注册服务人员吗?(我的意思是使用范围,但它不在我的网站路径中。)

您可以,但软件的范围决定了它的执行上下文,所以它将被加载到您的计算机/手机上,但只有当您在它的范围内的页面上(
website.com/fake
website.com/fake/whateverels
),或者如果您在这个范围内调用ressource(
website.com/fake/style.css
),它才有效

4) 如果我使用importscript,缓存是否仍然适用于我的老用户

这取决于您在
安装
激活
阶段所做的工作。除非您在代码中明确地执行此操作,否则安装新软件或其新版本不会清除缓存