充值成功后页面余额还是原来的数字,手动刷新三次才变,Network 面板里 /api/balance 显示来自 Service Worker,状态码 200。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,缓存路由用了统配的同源判断,把 /api 下的 GET 请求一起收进了 stale-while-revalidate。接口响应被当成静态资源存下来,页面读到的自然是上一次的数据。

碰到「接口被 SW 缓存」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。报错里带路径的,先去看那个路径在不在、权限对不对。

registerRoute(
  ({url}) => url.origin === location.origin && !url.pathname.startsWith('/api'),
  new StaleWhileRevalidate()
);

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,在路由判断里显式排除 /api 前缀,接口一律走网络;确实要离线读的接口单独列白名单,并设置很短的有效期;检查 caches.keys() 里是否已有旧接口缓存,清掉再验证。

最后用这个标准收尾,充值后不刷新页面,余额数字当场变化,Network 里 /api/balance 不再标记为来自 Service Worker。

作者 9823189