服务人员更新延迟

时间:2017-01-28 20:08:17

标签: javascript web service-worker

我有一个正在运行的Web应用程序,并依赖服务工作人员来检查所有缓存的文件,并确保用户使用正确版本的应用程序。

我们的客户当前希望设备检查特定点(重新打开应用时)等时的更新,因为当前打开应用时,设备最多可能需要5分钟才会在过期版本上实现。< / p>

我是否可以强制设备检查服务工作者是否有任何新的更改,而不是等待应用程序检查我?

谢谢!

2 个答案:

答案 0 :(得分:1)

您应该优化两个要点,以便即时更新SW。

<强>不久

  1. 与应用程序的索引页面相比,更常访问的网页中的sw.js
  2. 利用skipWaiting()方法立即激活您的SW。
  3. 详细

    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.jsonservice-worker.js 中的任何变化。