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

Need information about using multi service-worker in a domain

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

1) 如何在网站根目录下使用多服务工作者?

2) 我可以使用一个 service worker 文件并在上面放两个 importscript 两个 service worker 吗?

3) 我可以使用假作用域来注册 service worker 吗? (我的意思是使用范围,但它不在我的网站路径中。)

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

我尝试在网站的根目录中使用一个 service-worker,并像这样在这个 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

我会尽量回答你的问题:

1) 如何在网站根目录中使用 multi-service worker?

您只能让一个服务工作者在指定范围内按站点注册:因此在 / 范围内只能有一个服务工作者,但是您可以在站点的每个范围内添加一个服务工作者(即:一个在 //user 上的一个) 但如果需要,您可以将 2 个 service worker 合并为一个。

2) 我可以使用一个 service worker 文件,然后在上面放两个 service worker 的两个 importscript 吗?

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

3) 我可以使用一个虚假的作用域来注册 service worker 吗? (我的意思是使用范围,但它不在我的网站路径中。)

你可以,但是 SW 的范围决定了它的执行上下文,所以它将加载到你的 computer/phone 但它只会在它的范围内根据请求有效,如果你在它下面的页面上( website.com/fakewebsite.com/fake/whateverelse) 或者如果您在此范围内调用资源 (website.com/fake/style.css)

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

这取决于您在 installactivate 阶段所做的事情。安装新的 SW 或它的新版本不会清除缓存,除非您在代码中明确地这样做。