改完 sw.js 里的缓存名单,Chrome 里还是旧逻辑,Application 面板显示 waiting,点了跳过等待再打开又回到老版本。乍看像缓存或者权限的锅,追下去往往不是。

location = /sw.js {
  add_header Cache-Control "no-cache";
  expires off;
}

追下去是这么回事:sw.js 默认按普通脚本缓存,服务器给它发了较长的 max-age,浏览器的更新检查拿到的是本地副本,字节比对没有差异。脚本没换,后面的注册和缓存逻辑就都不会执行。

「sw.js 缓存」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,给 sw.js 单独设 Cache-Control: no-cache,允许缓存但每次都回源校验;确认服务器没有把 sw.js 一起塞进静态资源的强缓存规则;改完关掉所有受控标签页再打开,让浏览器重新走一次更新检查。

验收就看一点,修改 sw.js 里的版本号后刷新两次,Application 面板显示的脚本内容是新的一份,状态回到 activated。

作者 9823189