当前位置: 首页 > news >正文

ServiceWorker 的生命周期包含6种核心状态

Service Worker 规范中明确定义的 6 种内部状态(internal states)

这些状态描述了 Service Worker 线程在其生命周期中的不同阶段。以下是基于规范(如 W3C 和 WHATWG 标准)整理的表格,准确对应这六种状态:

序号状态(英文)状态(中文)说明
1parsed已解析浏览器成功解析注册的 Service Worker 脚本,但尚未开始安装。这是注册后的初始状态。
2installing安装中正在执行install事件。开发者通常在此阶段缓存静态资源。若脚本未改变,此状态可能跳过。
3installed已安装安装成功完成,但尚未激活。此时 Service Worker 处于“等待”状态(waiting),尤其当已有旧版正在控制页面时。
4activating激活中正在执行activate事件。通常用于清理旧缓存或迁移数据。
5activated已激活Service Worker 已激活并开始控制其作用域内的页面(仅对新导航或刷新后的页面生效),可拦截fetch、处理推送等事件。
6redundant已失效(冗余)Service Worker 被废弃。可能原因包括:安装失败、被新版本取代、注册被注销(unregister),或脚本内容与已安装版本不一致导致回退。

补充说明:

  • 这些状态是Service Worker 内部状态(internal state),可通过ServiceWorker.state属性读取(例如navigator.serviceWorker.controller?.state)。
  • 状态转换是单向的(除异常情况外):
    parsedinstallinginstalledactivatingactivated
    或在任一阶段失败/被取代 →redundant
  • 开发者可通过监听statechange事件跟踪状态变化:

此六状态模型是理解 Service Worker 生命周期和调试更新行为的核心依据。


Service Worker 生命周期

阶段状态说明
1. 注册(Registration)installing(若首次注册)通过navigator.serviceWorker.register()注册 Service Worker 脚本。浏览器下载脚本并准备安装。
2. 安装(Installing)installing触发install事件。在此阶段可缓存静态资源(如通过 Cache API)。若安装成功,进入“已安装”状态;若失败(如缓存失败),则进入“冗余(redundant)”状态。
3. 已安装 / 等待激活(Installed / Waiting)waiting安装成功但尚未激活。如果已有旧版 Service Worker 正在控制客户端,则新版本会等待(除非调用skipWaiting())。
4. 激活(Activating)activating触发activate事件。通常用于清理旧缓存或执行迁移逻辑。激活后,Service Worker 开始控制页面(仅对新打开/刷新的页面生效)。
5. 已激活(Activated)activeService Worker 处于活跃状态,可拦截fetchpushsync等事件,处理网络请求和后台任务。
6. 冗余(Redundant)redundantService Worker 被废弃,原因可能包括:安装失败、被新版本取代、或注册被注销。此时不再接收事件。

💡补充说明

  • 页面必须通过 HTTPS(或 localhost)才能使用 Service Worker。
  • Service Worker 的作用域(scope)由注册时的路径决定。
  • 只有当所有受控页面关闭或新版本接管后,旧 Service Worker 才会被替换。

该生命周期确保了 Web 应用更新的平滑过渡与离线能力的可靠实现。


完整的注册函数

async function registerServiceWorker() { if (!('serviceWorker' in navigator)) { console.warn('当前浏览器不支持 Service Worker'); return; } try { const registration = await navigator.serviceWorker.register('./js/serviceWorker.js', { //scope: '/', // 控制范围 updateViaCache: 'none' // 控制更新行为 }); console.log('Service Worker 注册成功,作用域:', registration.scope); // 监听生命周期 trackServiceWorkerLifecycle(registration); // 监听控制器变化 navigator.serviceWorker.addEventListener('controllerchange', () => { console.log('页面控制器已变更,可能需要刷新页面'); }); return registration; } catch (error) { console.error('Service Worker 注册失败:', error); throw error; } } function trackServiceWorkerLifecycle(registration) { const logState = (worker, label = 'Worker') => { if (!worker) return; const log = (message) => console.log(`${label}: ${message}`); log(`初始状态: ${worker.state}`); worker.addEventListener('statechange', () => { log(`状态变为: ${worker.state}`); switch (worker.state) { case 'installed': if (registration.waiting) { log('已安装,等待激活'); // 可以在这里提示用户刷新页面 } break; case 'activated': log('已激活,可以控制页面'); break; case 'redundant': log('已废弃,被新版本替换'); break; } }); }; // 监听现有 worker if (registration.installing) logState(registration.installing, 'Installing'); if (registration.waiting) logState(registration.waiting, 'Waiting'); if (registration.active) logState(registration.active, 'Active'); // 监听新 worker 安装 registration.addEventListener('updatefound', () => { console.log('开始安装新版本的 Service Worker'); logState(registration.installing, 'New Installing'); }); } // 使用示例 window.addEventListener('load', () => { registerServiceWorker().then(registration => { // 可以在这里添加更多逻辑 }); });

更新检查

// 检查 Service Worker 更新 function checkForUpdates() { if (!navigator.serviceWorker || !navigator.serviceWorker.controller) { return; } navigator.serviceWorker.ready.then((registration) => { registration.update().then(() => { if (registration.waiting) { console.log('有新的 Service Worker 等待激活'); // 可以提示用户刷新页面 showUpdateNotification(); } }); }); } // 提示用户刷新 function showUpdateNotification() { if (confirm('有新的版本可用,是否立即刷新?')) { navigator.serviceWorker.controller.postMessage({ type: 'SKIP_WAITING' }); window.location.reload(); } }
http://www.jsqmd.com/news/124036/

相关文章:

  • 毕业季必看!8款免费AI写论文神器一站式服务,选题到降重全搞定!
  • AnythingLLM完整指南:打造私有ChatGPT的终极解决方案
  • 5个超实用技巧:用AlwaysOnTop窗口置顶工具彻底改变你的多任务工作方式
  • 音频格式转换工具使用指南:3种方法轻松解密NCM音乐文件
  • vivado安装失败?一文说清所有报错原因
  • 猫抓Cat-Catch:网页媒体资源捕获终极解决方案
  • 5个高效技巧:如何用AlwaysOnTop窗口置顶工具彻底告别多任务混乱
  • NCM音频格式解密完全手册:解锁网易云音乐播放限制
  • 终极指南:如何用Python脚本5分钟搞定大麦网自动抢票
  • RePKG实用指南:快速掌握Wallpaper Engine资源管理技巧
  • 2025年口碑好的电饭锅库存小家电主流选择榜 - 品牌宣传支持者
  • NCM音乐格式转换终极指南:轻松解锁网易云加密音乐
  • QGIS二次开发识别不出来要素问题
  • ncmdump:终极音乐格式转换工具,轻松解锁加密音频
  • 【Android】常见的架构模式:MVC, MCP, MVVM - 指南
  • Google Drive文件下载高效方法:Python脚本一键搞定
  • 如何快速提升网课效率:WELearn助手终极免费指南
  • 联想拯救者工具箱:解锁笔记本隐藏性能的智能管家
  • 【Open-AutoGLM开源实战手册】:掌握这7个关键步骤,快速构建专属GLM模型
  • Bypass Paywalls Clean完整使用教程:轻松解锁150+新闻网站付费内容
  • ESP32引脚控制继电器实践:项目应用案例
  • NCM格式音乐文件解密转换全攻略
  • 手慢无!Open-AutoGLM最新邀请码获取路径,速领仅剩名额
  • 【终极盘点】颗粒图像分析仪主流品牌推荐:选哪个品牌不踩坑? - 品牌推荐大师1
  • 5分钟掌握浏览器媒体探测神器:告别网页视频下载难题
  • 2025年知名的管网铺设水泥管最新TOP品牌厂家排行 - 品牌宣传支持者
  • MySQL学习笔记
  • HID示例项目解析:自制简易自定义设备教程
  • Chrome付费墙绕过工具终极指南:简单5步解锁全网付费内容
  • 终极指南:如何快速配置Bypass Paywalls Clean解锁数字内容