Javascript 'self.Clients.claim()有什么用途`

Javascript 'self.Clients.claim()有什么用途`,javascript,frontend,offline,service-worker,offline-caching,Javascript,Frontend,Offline,Service Worker,Offline Caching,要注册服务人员,我可以打电话 navigator.serviceWorker.register('/worker.js') 每次加载页面时,它都会检查worker.js的更新版本。如果找到更新,则在关闭页面的所有选项卡然后重新打开之前,将不会使用新工作进程。我读到的解决方案是: self.addEventListener('install', function(event) { event.waitUntil(self.skipWaiting()); }); self.addEventLi

要注册服务人员,我可以打电话

navigator.serviceWorker.register('/worker.js')
每次加载页面时,它都会检查
worker.js的更新版本。如果找到更新,则在关闭页面的所有选项卡然后重新打开之前,将不会使用新工作进程。我读到的解决方案是:

self.addEventListener('install', function(event) {
  event.waitUntil(self.skipWaiting());
});
self.addEventListener('activate', function(event) {
  event.waitUntil(self.clients.claim());
});

我可以理解skipWaiting部分,但是
clients.claim()具体做什么?我做了一些简单的测试,即使没有它,它似乎也能像预期的那样工作。

我从一篇文章中摘录了以下内容:

客户。索赔

您可以通过调用
clients.claim()
一旦激活,就在您的服务人员中

上面演示的一个变体,在中调用
clients.claim()
它的激活事件。你应该第一次看到一只猫。我说 “应该”,因为这是时间敏感的。只有在下列情况下,你才会看到一只猫 服务人员激活并
clients.claim()
在之前生效 图像试图加载

如果您使用服务人员加载页面的方式与他们的方式不同 通过网络加载,
客户端。claim()
可能会很麻烦,因为 服务工作者最终控制了一些未加载的客户端 它

注意:我看到很多人,包括客户。claim()作为样板, 但我自己很少这样做。这只在一开始就很重要 加载,由于渐进增强,页面通常正常工作 不管怎样,没有服务人员也很开心


Service worker在注册后从下一页重新加载中获取控件。通过使用
self.skipWaiting()
self.clients.claim()
,您可以要求客户端控制
第一次加载时的服务人员

e、 g

假设我缓存了一个文件
hello.txt
,如果我调用
hello.txt
,即使缓存中有资源,它也会进行服务器调用。这是我不使用
self.clients.claim()
的情况。但是,在下一页重新加载对
hello.txt
进行服务器调用时,它将从缓存中为资源提供服务

为了解决这个问题,我必须结合使用
self.skipWaiting()
self.clients.claim()
,以便服务人员在内容被激活后立即开始提供内容

附言:

下一页重新加载
表示重新访问页面


首次加载
表示第一次访问页面的时刻。

客户端。claim()
使服务人员在您首次注册服务人员时控制页面。如果页面上已经有服务人员,则不会有任何区别<代码>skipWaiting()
使新的服务人员替换旧的服务人员。如果没有它,您将不得不在激活新的服务人员之前关闭页面(以及包含相同范围内页面的任何其他打开的选项卡)。

快速评论:无需调用
registration.update()
来检查更新的服务人员脚本。这已经由浏览器在导航请求后自动完成
registration.update()
允许您无需等待导航请求就可以进行检查,这通常是不必要的。是的,我在写问题时才发现这一点。因此我认为
self.skipWaiting()
将用于立即将更新应用于现有的serviceWorker和
客户端.claim()
将用于在第一次加载时立即控制。因此使用
self.clients.claim
将调用服务器获取文件,即使该文件在缓存中?是这样吗?请您清楚地说明
下一页重新加载
第一次加载
是什么意思?使用
self.clients。如果文件在缓存中,claim
将不会调用服务器。它将从缓存中提供。根据您关于
下一页重新加载
第一次加载
的建议编辑的帖子谢谢您的修改,但我仍然不清楚您将在哪种情况下使用
self.clients.claim()
以及您将不为哪种情况编写此方法?>如果我希望始终从服务器获取文件内容,那么我是否需要编写
self.clients.claim()
,然后它将从缓存中获取。在这种情况下,您不需要,但如果我要求始终从服务器获取一个文件,而其他文件可以从缓存中获取(如果存在),该怎么办,因为我们在
activate
event listener中编写self.client.claims,并且只能使用一个设置进行配置。可以编写,也可以不编写。