【问题标题】:Service Worker expirationService Worker 到期
【发布时间】:2016-12-06 17:01:46
【问题描述】:

安装 Service Worker 后,Chrome 浏览器需要多长时间才能检查它的更新版本?当前的客户端 Service Worker 通常什么时候到期?

我正在尝试找出与 Service Worker 一起开发并将更改推送到 prod 的最佳实践。目前,一旦对 Service Worker 的行为方式进行了更改,如果之前的 Service Worker 已经安装,客户端并不总是能够接受。

这个问题也有点相关:Programmatically update service worker - 理想情况下,一旦对 SW 实施更改,您会希望在所有可能已经拥有以前版本的客户端上强制更新它。

【问题讨论】:

    标签: google-chrome service-worker


    【解决方案1】:

    仔细阅读MDN文档给出了答案:

    https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Updating_your_service_worker

    如果您的 Service Worker 之前已安装,但在刷新或页面加载时有新版本的 Worker 可用,则新版本会在后台安装,但尚未激活。仅当不再加载任何仍在使用旧服务工作者的页面时才会激活它。一旦不再加载此类页面,新的 service worker 就会激活。

    【讨论】:

      【解决方案2】:

      我一直在 Chrome 计算机和 Chrome Android 手机上测试 Service Worker。

      结果是:

      • 一件事是 Service Worker 及其状态。

      • 另一件事是在生产服务器上将文件更新为 html、js 等时的典型缓存问题。

      首先我很困惑,因为我认为 Service Worker + 缓存问题之间的混合只是一团糟。

      我看到的是,如果我更改 .js 文件,导航器不会捕捉到它。所以我解决它的方法是使用脚本调用的版本:

      <script src="jquery-functions.js?ver=1.54"></script>
      

      每次更改文件中的代码时,请确保增加版本(在我的情况下:ver=1.55)

      这仅适用于计算机和 Android,并且 Server Worker 根本不会干扰。它适用于网页版和 webApp 版。

      另一个问题是如何更改或更新 service worker 本身。 我尝试的第一件事是删除对服务工作者文件的脚本调用。这不会删除 service worker。

      我寻找删除服务工作者的代码,这似乎在 Chrome 计算机和 Android 版 Chrome 上正常工作。

      // REMOVE ALL SERVICE WORKERS
      navigator.serviceWorker.getRegistrations().then(
          function(registrations) {
              for(let registration of registrations) {
                  registration.unregister();
              }
      });
      
      // AND REMOVE ALL CACHES 
      caches.keys().then(function(names) {
          for (let name of names)
              caches.delete(name);
      });
      

      在电脑上: 一旦在没有 service worker 脚本的情况下应用此代码,它仍会运行,但会显示以下控制台消息:domain.name - 已删除。 在第二次重新加载后,服务工作者的状态有这样的消息:'# Status isredundant'。 (这似乎没问题;Service Worker 已被移除)

      如果我再次运行服务工作者,如果我在 chrome 控制台上向下滚动,我可以看到另一个服务工作者正在运行;所以它似乎工作正常;这是杀死 Service Worker 并唤醒他们的方法。

      在 Android 手机上启动 webApp 主屏幕图标时: 首次打开时一如既往:服务人员似乎继续正常工作。 (行为与 Chrome 计算机相同)

      我第二次尝试使用“飞行模式”打开 webApp 主屏幕图标(以测试 Service Worker 的功能)时,当没有互联网连接时,我得到了导航器的典型错误。我理解这种行为是正确的,因为 Service Worker 已被杀死。

      我认为这是对 Service Workers 有一点信心的第一步,但如果您有更多信息或测试,请将您的反馈发送给我。

      使用带有“应用程序”->“服务工作者”选项卡的 Chrome 控制台很重要,这样您就可以看到后面发生的事情。

      作为一个小奖励,当用户没有互联网连接时,最好通知用户无法保存更改。这就是我所做的简单方法:

      setInterval(() => {
          if (!navigator.onLine) { niceAlert("No Internet connection detected. Your changes will not be saved"); }
      },5000);
      

      【讨论】:

        【解决方案3】:

        默认情况下,Service Worker 会在 24 小时后过期。但最好的方法是使用 ma​​x-age = 0 标头。因为我们希望我们的更改尽快反映。我不知道强制更新,但是当它们没有缓存服务工作人员文件并且没有为以前的服务工作人员打开选项卡时,新的服务工作人员将自动安装。

        请参阅此链接了解更多信息 https://jakearchibald.com/2016/caching-best-practices/

        【讨论】:

        • 您能否详细说明它的到期时间?我所能找到的只是它会在约 24 小时后尝试自我更新,但如果未使用或其他原因,它不会过期。我猜只有当服务器没有响应新的服务工作者(在这 24 小时结束并尝试更新之后)时,它才会自行过期?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多