[英]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.