我有一个正在运行的Web应用程序,并依赖服务工作人员来检查所有缓存的文件,并确保用户使用正确版本的应用程序。
我们的客户当前希望设备检查特定点(重新打开应用时)等时的更新,因为当前打开应用时,设备最多可能需要5分钟才会在过期版本上实现。< / p>
我是否可以强制设备检查服务工作者是否有任何新的更改,而不是等待应用程序检查我?
谢谢!
答案 0 :(得分:1)
您应该优化两个要点,以便即时更新SW。
<强>不久强>
sw.js
。skipWaiting()
方法立即激活您的SW。详细
1)navigator.serviceWorker.register
方法调用
您应该注意,SW的新版本只能通过navigator.serviceWorker.register()
电话进行检查。
通常只在您的某个网页中调用register()
方法。如果是这种情况,则应将该命令添加到所有页面。因为如果用户只是在没有关闭PWA的情况下打开另一个应用程序,然后在2小时之后返回到您的应用程序,他们将避开应用程序的register()
呼叫的索引页面。
所以,我的建议是把它放到很多页面,如果不是每一页。下行是客户将拨打更多sw.js
的电话。上行是客户将在不浪费时间的情况下检索最新版本的SW。
2)激活服务人员
当SW不再有任何有效clients时,将调用服务工作者的activate
事件。因此,新应用程序仅在应用程序的每个实例之后激活,但一个已关闭,其余选项卡将刷新/一个选项卡重新打开。有关此事,请参阅quote from MDN:
..新版本在后台安装,但尚未激活。 只有在不再加载任何页面时才会激活它 仍在使用旧的服务工作者。一旦没有更多 这些页面仍然加载,新服务工作者激活。
对此问题的解决方案是将skipWaiting()
方法与Clients.claim()
从MDN获取的用法示例。 Click to see more about it on that page:
self.addEventListener('install', function(event) {
event.waitUntil(self.skipWaiting());
});
self.addEventListener('activate', function(event) {
event.waitUntil(self.clients.claim());
});
答案 1 :(得分:0)
.htaccess
中的到期指令确保您的资产服务器上的 .htaccess
文件设置的浏览器缓存到期指令设置为非常短的持续时间,甚至设置为无 { {3}}。
如果不这样做,将导致浏览器在一段时间内看不到 manifest.json
或 service-worker.js
中的任何变化。