因此,我们正在构建一个渐进式Web应用程序,当然我们正在使用很棒的服务人员。

每当我们发布应用程序的新版本时,我们都会更新sw.js文件中的版本号。在页面加载时,浏览器检测到sw.js发生了更改,并触发“安装”和“激活”事件,这些事件依次缓存了正确的资源以供脱机使用。

这很好。但是据我了解,它只会在页面加载时触发。因此,如果用户将应用程序添加到主屏幕上并始终使用此快捷方式访问该应用程序,则“刷新”事件将不会被频繁触发,因此这些用户将不会像使用更新时那样频繁地看到更新非SPA网络应用。

所以我的问题是,您将如何更新使用sw.js作为更新过程的单页渐进式Web应用程序?

我想到了几种解决方案,其中包括超时,该超时将查询服务器以查找新版本并将其与本地版本进行比较。但这似乎有些奇怪。

最佳答案

every navigation request上检查新版本的sw.js会发生在服务 worker 作用域下的页面上。因此,您是正确的,如果SPA无限期保持打开状态,并且没有“真实”的导航发生,则不会对sw.js更新进行任何检查。

大多数浏览器最终都会从内存中卸载后台页面,然后在您将后台页面带回到前台时重新加载它们,从而在某种程度上减轻了这种负担。但这不是确定性的事情,您可以指望。

您可以使用 ServiceWorkerRegistration.update() 方法强制浏览器检查对sw.js的更新,就像在导航时一样。

由您决定要多久调用一次该方法。如果要匹配通过“真实”导航获得的行为,则可以执行以下操作:

function spaNavigate(url) {
  // Do what you'd normally do to update page content,
  // use the History API to change the location to `url`, etc.

  // Then, force a service worker update check:
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.ready.then(function(registration) {
      registration.update();
    });
  }
}

关于service-worker - 渐进式Web应用程序:在单页应用程序上更新sw.js,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41105591/

10-12 17:12
查看更多