由 pnpm docs:lessons 生成。教学脚本在 src/data/network-state.json,合同补充在 scripts/generate-network-state.mjs。本页含教师参考答案。
理解作用域、安装、激活和更新。先修按 完整目录 的章节关系;基础操作、原理关系随本课讲解。
registration、waiting、active 与当前页面 controller 是不同关系。
scope 决定哪些页面有资格被控制,注册成功不代表当前页面已受控
新版本可能等待旧客户端退出;skipWaiting 影响等待,clients.claim 影响接管
强制接管有兼容成本;实验中明确选择,线上还需版本升级策略
操作生命周期图观察控制关系。模型不改变真实浏览器设置,不计为实战完成。
- 先预测一个条件变化的结果。
- 只改变一个条件,比较输入与输出。
- 将模型中的关系对应到真实 DevTools。
症状:新 worker 已安装,页面仍读到旧版本或完全没有 controller。
正常结果:本页面 controller 指向目标 worker,受控接口返回 workerVersion=2。
真实机制:每个 token 独立 scope;v1 活动/v2 waiting,或 narrow scope 未覆盖当前页面。
- 从本课准备并打开独立商城;先打开 DevTools,再运行故障。
- Application → Service Workers 对照 installing/waiting/active、scope 与当前受控页面。
- Network 查看 controlled-version.json 是否 from ServiceWorker;记录 navigator.serviceWorker.controller 的 scriptURL。
- 本课 v1/v2 只在会话路径生效;对照后确认返回 2,结束点击「清理本实验」注销自身注册。
- 先保存证据,再应用针对性的对照;错误对照不会通过页面检查。
- 回到教程选择真实证据,完成独立挑战后写下排查与恢复步骤。
解释等待中与活动 worker 的关系。新会话改变输入与故障配置,可能再次抽到同一类型;按实际证据判断。
| 配置 | 原因 | 证据 | 修复/验证 |
|---|---|---|---|
| 配置1 | 新版本在 waiting,当前 controller 仍为旧版 | waiting 是 v2,但受控接口仍由 v1 返回 | 检查等待关系后激活新版本并复测 |
| 配置2 | 注册 scope 没覆盖当前页面 | 存在 active registration,当前 controller 为 null | 注册覆盖当前页面的正确 scope |
| 干扰项 | 只凭界面颜色判断 | 没有对应请求或存储证据 | 同时改变全部条件且不复测 |
- 先区分实际请求、浏览器策略、存储与界面处理,记录第一次偏离的环节。
- Application → Service Workers 对照 installing/waiting/active、scope 与当前受控页面。
- 比较两个候选解释:新版本在 waiting,当前 controller 仍为旧版;注册 scope 没覆盖当前页面。保持其他输入一致再验证。
恢复故障在必要时注销本会话并刷新释放旧 controller。skipWaiting/claim 为教学对照,不建议无条件套到生产升级。
清理与会话约定见 共同合同。请在复盘写下条件、观察对象、实际值、根因、最小修改与恢复设置;将 HTTP 缓存、Cache Storage、内存状态分开。