8

我已经使用 Google 的 workbox-build 包将服务工作者集成到使用 ReactJS 构建的单页应用程序中。

我在 index.html 的预缓存方面遇到了一些问题,特别是每次我们发布新版本时,服务工作者都会为过时的 index.html 提供服务。由于它提供过时的 index.html,因此找不到主 JavaScript 文件,因为它是基于构建版本控制的。

</div><script type="text/javascript" src="/static/js/main.fa34a3ce.js"></script>

我还尝试从预缓存中删除 index.html,并将其放在运行时缓存中,并设置为网络优先。但它似乎没有被服务人员缓存。

runtimeCaching: [
  {
    urlPattern: /\/$/,
    handler: 'networkFirst',
    options: {
      cacheName: 'my-cache-index'
    }
  }
]
4

2 回答 2

3

您很可能会遇到常见的双重缓存情况,请参阅此缓存控制和 Chrome Fresher Service Workers中即将发生的更改。

于 2018-07-23T14:56:27.557 回答
0

非常努力地设置网络优先策略进行预缓存,但我失败了。我放弃了尝试并实施了以下策略:首先缓存,但在简单的页面重新加载上应用更新

要实现它,只需将以下选项添加到您的 Workbox 服务工作者构建器(例如 Webpack 插件):

skipWaiting: true

或者,如果您自己编写 Service Worker,请将以下行添加到您的 Service Worker 代码中:

workbox.core.skipWaiting();

此外,您可以在应用程序更新时向用户显示警报,和/或自动重新加载页面:

// Your service worker registration code
// ...

const registration = await navigator.serviceWorker.register(serviceWorkerUrl);

registration.onupdatefound = () => {
  const installingWorker = registration.installing;
  if (installingWorker == null) {
    return;
  }
  installingWorker.onstatechange = () => {
    if (installingWorker.state === 'installed') {
      if (navigator.serviceWorker.controller) {
        if (confirm('App\'s been updated. Restart to apply the update?')) {
          location.reload();
        }
      } else {
        // The service worker has been installed for the first time
      }
    }
  };
};

默认情况下,运行上述代码时会检查更新。您可以通过调用手动触发更新检查:

// An appendix to the previous code block
registration.update();

不幸的是,没有直接的方法可以确定没有更新。

于 2019-12-04T03:53:40.113 回答