navigator.serviceWorker.addEventListener('controllerchange', () => {
  if (refreshing) return;
  refreshing = true; location.reload();
});

点更新后页面白屏,控制台报 ChunkLoadError,刷新一次又恢复正常,日志里同一次会话出现了两个不同的构建号。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:新 worker 立刻接管,但页面还是旧 HTML,里面引用的 chunk 已被新版本覆盖删除。skipWaiting 只切换了控制权,没有让当前页面重新加载。

这次卡住的地方就在「skipWaiting 版本混杂」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:收到 controllerchange 后强制 reload 一次,让 HTML 和资源版本对齐;reload 前加锁,避免多个标签页同时触发造成循环刷新;构建产物保留上一版文件至少一天,给未关闭的页面留回落余地。

确认没问题再收工,点更新后页面只重载一次,控制台不再出现 ChunkLoadError,页面上只有一个构建号。

作者 9823189