Javascript 如何防止同一服务人员在多个页面上注册?

Javascript 如何防止同一服务人员在多个页面上注册?,javascript,service-worker,Javascript,Service Worker,我有一个服务人员脚本,它在多个站点级别上重复注册 换句话说,同一名服务人员在www.site.ca/、www.site.ca/text-text、www.site.ca/example-example等网站注册 该网站基于php构建,根据内容生成不同的URL,就像API一样。服务人员注册位于这些页面上的原因是,大多数站点流量位于这些页面上,而不是主页上。结果是相同的服务工作者在不同的页面上使用不同的ID注册 是否有人有办法防止同一脚本在多个子级别上多次注册 编辑: 服务工作者的目的是设置通知,即

我有一个服务人员脚本,它在多个站点级别上重复注册

换句话说,同一名服务人员在www.site.ca/、www.site.ca/text-text、www.site.ca/example-example等网站注册

该网站基于php构建,根据内容生成不同的URL,就像API一样。服务人员注册位于这些页面上的原因是,大多数站点流量位于这些页面上,而不是主页上。结果是相同的服务工作者在不同的页面上使用不同的ID注册

是否有人有办法防止同一脚本在多个子级别上多次注册

编辑:

服务工作者的目的是设置通知,即使用户不在站点上。此外,我遇到的问题将对将来更新服务人员的任何尝试产生负面影响,因为将有多个副本需要更新。结果是,当用户在特定页面上再次登录站点时,只有一个副本会被更新。无法保证该服务人员文件的所有副本都会更新。此外,多个副本的结果导致用户从站点获得大量通知,因此这是一个问题

编辑:

以下是我到目前为止所拥有的,据我所知,范围定义了它在哪里注册。但是问题是,它需要能够在任何人进入网站的地方注册,因此范围设置为“/”

我想解决的问题是防止同一服务工作者文件的后续寄存器

Localhost是实际站点的占位符

navigator.serviceWorker.register('localhost/service-worker.js', {scope: './'})
.then(initialiseState);
在Chrome dev tools for debugging中,生成的服务工作者的格式如下:

范围:localhost/url/stuff/
注册ID:110
活动工作人员:
安装状态:已激活
运行状态:已停止
脚本:localhost/service worker.js

范围:localhost/
注册ID:111
活动工作人员:
安装状态:已激活
运行状态:已停止
脚本:localhost/service worker.js

范围:localhost/url
注册ID:112
活动工作人员:
安装状态:已激活
运行状态:已停止
脚本:localhost/service worker.js
...

理想情况下,我希望以某种方式将其保留为一个条目。

根据,
ServiceWorkerContainer.register
方法采用选项的第二个参数:

目前可用的选项有:

  • 作用域:表示定义服务工作者注册作用域的URL的USVString;服务人员可以使用的URL范围是什么 控制这通常是一个相对URL,当 未指定

关于你的最新问题,报告说:

服务工作者注册相同的作用域url时 已存在于用户代理中,导致现有服务工作者 待替换的注册

因此
navigator.serviceWorker.register(url,{scope:'/'})。然后(doSomething)
应该可以工作

问题在于示例中的作用域URL:


/
应该是
/

在具有子目录的站点场景中,如果您希望所有子页面都由同一顶级服务人员控制,我建议使用绝对URL作为服务人员脚本位置,然后依赖于省略
options.scope
时发生的默认行为

请注意,在另一个响应中引用的参数对于默认行为是不正确的。服务工作者要将默认作用域更改为等效于
新URL('./',serviceWorkerScriptUrl).toString()
。(MDN文档具有并且应该是准确的。)

来说明为什么我建议在这个用例中省略<代码>选项.Simule,考虑以下选项,假设您想要一个单一的、共享的服务工作者注册:

  • navigator.serviceWorker.register('/sw.js')
    将为您提供范围为
    /
    的注册,这正是您所需要的
  • navigator.serviceWorker.register('/sw.js',{scope:'/'})
    将为您提供范围为
    /
    的注册,这也是您想要的,但与默认行为相比没有任何好处
  • navigator.serviceWorker.register('/subsite/sw.js',{scope:'/'})
    将无法注册,因为
    /
    的作用域对于位于
    /subsite/sw.js
    的服务人员脚本来说太宽
  • navigator.serviceWorker.register('/subsite/sw.js')
    将为您提供范围为
    /subsite
    的注册,这正是您所需要的
  • navigator.serviceWorker.register('/subsite/sw.js',{scope:'/subsite'})
    可以工作,但与默认行为相比,它没有任何好处
我唯一建议显式设置
options.scope
的值的时候是,您需要显式地将服务工作者的范围限制为小于默认范围


请注意,如果您确实决定为
选项.scope
提供一个值,并且该值是一个相对URL,如
./'
,则该URL将被解释为相对于调用
register()
的脚本/页面的位置<代码>{scope:'./'}被解释为与服务工作者脚本URL的位置相关。有一段时间我对这一点感到困惑,所以花点时间充分理解其中的含义。这就解释了为什么你在最初的问题中有多个注册。

我们怎么知道,而没有看到任何代码?@PHPglue没有包含代码beca