有什么用`self.Clients.claim()的'
要注册服务工作者,我可以叫有什么用`self.Clients.claim()的'
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()
办?我已经做了一些简单的测试,并且即使没有它,它也可以按预期工作。
我摘录从guide to the service worker lifecycle如下:
clients.claim
您可以不受控制的客户控制致电服务人员中
clients.claim()
一旦它被激活。Here's上述演示的变体,其中调用
clients.claim()
在 其激活事件。你应该第一次看到一只猫。我说 “应该”,因为这是时间敏感。如果 服务工作人员激活,并且clients.claim()
在图像尝试加载之前 生效,则只会看到一只猫。如果你用你的服务人员以不同的方式加载页面比他们通过网络倒是 负载,
clients.claim()
可能会很麻烦,因为你 服务人员最终控制某些客户端,如果没有 加载它。注意:我看到很多人包括clients.claim()作为样板, 但我很少这样做自己。它只在第一个 负载真的很重要,并且由于渐进式增强,页面通常无需服务工作者就愉快地工作 。
所以我认为'self.skipWaiting()'将用于立即将更新应用于现有的serviceWorker,'clients.claim()'将用于在第一次加载时立即进行控制。 – BonsaiOak
服务人员在注册后接受next page-reload
的控制。通过使用self.skipWaiting()
和self.clients.claim()
,您可以要求客户端控制first load
本身的服务人员。
e.g
比方说,我缓存文件hello.txt
,再如果我拨打电话的hello.txt
就会有使服务器的呼叫,即使我在高速缓存中具有资源。这是我不使用self.clients.claim()
时的场景。然而,在下一页上的服务器调用hello.txt
重新加载时,它将从缓存中提供资源。
要解决此问题,我必须使用self.skipWaiting()
和self.clients.claim()
的组合,以便服务人员在激活后立即开始提供内容。
P.S:
next page-reload
意味着页面回访。
first load
表示页面第一次被访问的时刻。
所以使用'self.clients.claim'会调用服务器的文件,即使该文件在缓存中?是对的吗?你能否清楚地说明'下一页重新加载'或'首次加载'意味着什么? –
如果文件位于该缓存中,则使用'self.clients.claim'将不会调用服务器。它将从缓存中提供。根据您关于'下一页重新加载'和'首次加载'的建议编辑帖子 –
感谢您的修改,但仍然不清楚,对于哪种情况,您将使用'self.clients.claim()',并为此你不会写这个方法吗? >如果我想从服务器获取文件内容,那么我是否需要编写'self.clients.claim()',然后它将从缓存中获取。 –
快速评论:调用'registration.update()'不是必需*来检查更新的服务工作者脚本。浏览器在导航请求后自动完成。 'registration.update()'允许你在不需要等待导航请求的情况下进行检查,而且通常没有必要。 –
是的,自从我写这个问题以来我就发现了这一点。 – BonsaiOak