【问题标题】:Service worker update delayService Worker 更新延迟
【发布时间】:2017-01-28 20:08:17
【问题描述】:

我有一个正在运行的网络应用程序,它依靠服务人员来检查所有缓存的文件并确保用户使用的是正确的应用程序版本。

我们的客户目前希望设备在特定点检查更新(重新打开应用程序时)等,因为目前当您打开应用程序时,设备可能需要长达 5 分钟才能意识到它是过时的版本。

我是否可以强制设备检查服务人员是否有任何新更改,而不是等待应用检查我?

谢谢!

【问题讨论】:

    标签: javascript web progressive-web-apps service-worker auto-update


    【解决方案1】:

    为了即时更新您的 SW,您应该改进两个要点。

    很快

    1. 在比您应用的索引页面更频繁访问的页面中致电您的sw.js也。
    2. 使用skipWaiting() 方法立即激活您的软件。

    详细说明

    1)navigator.serviceWorker.register方法调用

    您应该注意,更新版本的软件只能通过navigator.serviceWorker.register() 调用进行检查。

    通常register() 方法只会在您的一个页面中被调用。如果是这种情况,您应该将该命令添加到所有页面。因为如果用户只是打开另一个应用程序而不关闭您的 PWA,然后在 2 小时后返回您的应用程序,他们将避开您的 register() 调用可能所在的应用程序的索引页面。

    所以,我的建议是把它放到很多页上,如果不是每页的话。缺点是客户将拨打更多电话到sw.js。好处是客户将在不浪费时间的情况下检索最新版本的软件。

    2) 激活服务工作者

    当 SW 不再有任何活动的 clients 时,将调用 Service Worker 的 activate 事件。因此,只有在应用程序的每个实例但一个关闭后才会激活新版本,并且刷新剩余的选项卡/重新打开一个选项卡。此事见quote from MDN:

    ..新版本已在后台安装,但尚未激活。 它仅在不再加载任何页面时激活 仍在使用旧的服务人员。只要没有更多 此类页面仍在加载,新的 service worker 将激活。

    解决这个问题的方法是结合使用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 部分与您的情况无关。但是您在#2 上实施了解决方案吗?如果是这样,那么可能会发生其他事情。当您更新缓存时,它将再次重新安装整个缓存内容。因此,如果您缓存了很多文件,并且客户端连接速度较慢,则下载所有资产需要一段时间。只有在所有项目都下载并插入缓存后,软件才会被激活。如果以上都不是,我可能会看看你的 PWA(如果它是公开的)。
    【解决方案2】:

    资产服务器上.htaccess 中的到期指令

    确保资产服务器上.htaccess 文件设置的浏览器缓存到期指令 设置为非常短的持续时间,甚至设置为无 as explained here . 否则,将导致浏览器在一段时间内看不到manifest.json 和service-worker.js 的任何变化。

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2018-06-27
      • 2020-06-20
      相关资源
      最近更新 更多