Angular Service Worker间歇性地提供旧版本的应用程序

时间:2019-06-11 14:47:27

标签: angular angular-service-worker

我有一个使用Angular Service Worker(版本7.2.12)的Angular应用程序(版本7.2.2)。

服务工作者间歇性地提供该应用程序的旧版本。刷新时会显示新版本,但是如果用户关闭并重新打开浏览器选项卡,它将恢复为旧版本,直到重新加载下一页。显示旧版本时,“ / ngsw / state”页面也没有错误。

我一直未能成功重现该问题。部分原因是我不确定原因。我经常走了好几个星期而没有服务人员提供旧版本的代码。


我尝试过的一些有希望的潜在解决方案包括:

  • 将角度和服务人员更新到最新版本(当时)。
  • 从ngsw-config.json中删除缓存,以防止哈希不匹配。
  • 添加检查多个代码位置中的更新。
  • 每隔一段时间检查一次更新。
  • 在有可用更新时强制重新加载-有时会发生,但有时需要手动重新加载才能获得新版本。

1 个答案:

答案 0 :(得分:0)

您可能想在这里查看详细信息。简而言之,请注意,服务工作者的注销很慢,并且已在后台完成。为了在开发人员阶段快速往返,您可能需要手动注销并重新加载。

在以下位置查看信息: https://love2dev.com/blog/how-to-uninstall-a-service-worker/

原始GIST指出我们应该在启动之前清理服务人员:

self.addEventListener(“ activate”,function(e){

self.registration.unregister()
  .then(function() {

    return self.clients.matchAll();

  })
  .then(function(clients) {

    clients.forEach(client => client.navigate(client.url));

  });

});

不过,该帖子建议使用此增强版本:

  self.addEventListener("activate", function(e) {

    self.registration.unregister()
      .then(function() {

        return self.clients.matchAll();

      })
      .then(function(clients) {

        clients.forEach(client => {

          if (client.url && "navigate" in client){

            client.navigate(client.url))

      }

  });

});

我还要确保:

  • 检查开发版本是否不会进入构建周期,我已经看到DEVs认为某些东西是在PROD模式下构建的,而不是
  • 确保您使用的是HTTPS,请在本地使用NGROK。为了获得良好的PWA / SW操作,这似乎是强制性的。
  • 确保更改后的文件具有不同的哈希号,我曾见过一些情况,它们没有被重命名,因此您得到的是旧代码。
  • 引入一种合并版本号的方法,直到对操作满意为止。

我希望其中一些建议能使您朝正确的方向前进。