核心是控制Service Worker生命周期和更新逻辑:监听waiting/installed状态变化,主动调用registration.update()检查更新,用户确认后通过postMessage触发skipWaiting()并claim接管,同时确保SW文件绕过缓存。

要让 PWA 在用户下次打开时自动检查并提示更新,核心是控制 Service Worker 的生命周期和更新逻辑,而不是依赖页面刷新或手动重载。
监听 Service Worker 更新事件
在注册 Service Worker 后,需监听 waiting 和 installed 状态变化,判断是否有新版本等待激活:
- 当新 SW 安装完成但未激活(处于
waiting状态),说明有可用更新 - 通过
navigator.serviceWorker.controller判断当前是否使用旧版 SW - 推荐在页面加载后立即检查:
navigator.serviceWorker.getRegistration()获取注册实例,再监听其waiting和updatefound事件
主动触发更新检查
默认情况下浏览器只在页面加载时静默检查更新,需主动调用 registration.update() 强制检查:
- 适合放在用户进入首页、点击“检查更新”按钮等场景
- 注意:频繁调用可能被节流,建议加防抖或限制频率(如每小时最多一次)
- 检查后若返回新 registration,可通过
registration.waiting判断是否就绪
安全可靠地提示用户并激活新版本
不能直接 skipWaiting(),应由用户确认后再激活,避免中断正在进行的操作:
立即学习“Java免费学习笔记(深入)”;
- 检测到
waitingSW 后,弹出轻量级 UI 提示(如顶部横幅或对话框) - 用户点击“立即更新”后,调用
waiting.postMessage({type: 'SKIP_WAITING'}) - 在 SW 脚本中监听该消息并执行
self.skipWaiting(),随后触发clients.claim()让新 SW 接管页面 - 为防止白屏,可在激活后 reload 页面,或使用
postMessage通知页面重新 fetch 关键资源
确保更新逻辑不被缓存干扰
Service Worker 本身和关键 JS 文件必须绕过 HTTP 缓存,否则浏览器可能加载旧版 SW:
- 注册时传入
{ updateViaCache: 'none' }(Chrome 支持,Firefox 需配合响应头) - 在服务器响应头中设置
Cache-Control: no-cache, must-revalidate给 SW 文件(如sw.js) - 避免在
workbox.precaching中缓存 SW 文件自身;更新逻辑代码也不应被 CDN 或代理缓存


















