首页 > 解决方案 > 需要有关在域中使用多服务人员的信息

问题描述

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

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

2)我可以使用一个服务工作者文件并将importscript两个服务工作者中的两个放在上面吗?

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

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

我尝试在网站的根目录中使用一个服务工作者,并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

标签: javascriptpush-notificationservice-workerweb-push

解决方案


我会试着回答你的问题:

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

您只能在指定范围内按站点注册一个服务工作人员:因此范围内只有一个/服务工作人员,但您可以在站点的每个范围内添加一个服务工作人员(即:一对一//user但您可以合并 2 个服务工作人员如果你需要的话,合二为一。

2)我可以使用一个服务工作者文件并将两个服务工作者的两个导入脚本放在上面吗?

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

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

您可以,但 SW 的范围决定了它的执行上下文,因此它将加载到您的计算机/手机上,但只有在其范围内的请求时才有效,如果您在它下面的页面上(website.com/fakewebsite.com/fake/whateverelse)或者如果您调用此范围内的资源 ( website.com/fake/style.css)

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

这取决于你在你的install阶段activate所做的事情。除非您在代码中明确执行,否则安装新软件或其新版本不会清除缓存。


推荐阅读