self.addEventListener('fetch', (e) => {
  if (e.request.mode === 'navigate') {
    e.respondWith(fetch(e.request).catch(() => caches.match(e.request)));
  }
});

后台改了主导航,桌面浏览器立刻更新,手机上还是上周的结构,清浏览器缓存也没用。关掉 PWA 插件后恢复正常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:Service Worker 把 HTML 也放进了 cache-first 策略,导航跟着整页一起被缓存。后台更新菜单不会触发 SW 更新,旧缓存一直命中。

「Service Worker 菜单缓存」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:把 HTML 请求改成 network-first 只缓存静态资源;菜单更新后 bump 一次缓存版本号 触发 activate 清理;在 SW 里跳过带登录 cookie 的请求。

确认没问题再收工,手机刷新后看到新菜单,断网时仍能打开上一次缓存的页面。

作者 9823189