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,并且只能使用一个设置进行配置。可以编写,也可以不编写。