PWA 更新后用户看不到新内容怎么办?
我用 Workbox 搭了个 PWA,上线后发现用户经常看不到最新版本。明明我已经更新了 service worker,也看到浏览器后台注册了新的 sw.js,但页面还是老的,除非手动清除缓存或者强制刷新。
我现在的策略是用 staleWhileRevalidate 处理 HTML,其他静态资源用 cache-first。是不是 HTML 的缓存策略有问题?试过在 sw 注册时加 { updateViaCache: 'none' } 也没用。
workbox.routing.registerRoute(
({ request }) => request.destination === 'document',
new workbox.strategies.StaleWhileRevalidate()
);
首先检查你的service worker激活逻辑。确保在新的sw.js注册后立即激活它,而不是等到下一次页面加载。可以试试在register时添加这个:
然后在service worker里监听message事件来处理skipWaiting:
另外建议给你的HTML缓存加上版本号或者hash值,这样每次更新都能强制刷新资源。workbox有专门的插件来做这件事,叫workbox-precaching,用起来比staleWhileRevalidate更稳妥些。
最后提醒一下,缓存策略要综合考虑用户体验和资源更新需求,别为了追求极致性能把用户都搞懵了。这活儿真不容易啊,我也折腾了不少次才摸清楚门道。