繁体   English   中英

使用 workbox.js 对 index.html 进行网络第一次缓存

[英]Network first caching of index.html using workbox.js

我使用 Google 的 workbox-build 包将 service worker 集成到我们使用 ReactJS 构建的单页应用程序中。

我在 index.html 的预缓存方面遇到了一些麻烦,特别是每次我们发布新版本时,Service Worker 都会提供过时的 index.html。 因为它提供了一个过时的 index.html,所以找不到主要的 JavaScript 文件,因为它是基于构建的版本。

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

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

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

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

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

要实现它,只需将以下选项添加到您的 Workbox Service Worker 构建器(例如 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();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM