CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
跨平台前端入门/课时/Service Worker
RawBlame
课时目录12 节

跨平台前端入门

  1. 01跨平台前端地图
  2. 02PWA 基础
  3. 03Service Worker
  4. 04Web API
  5. 05Electron
  6. 06Tauri
  7. 07移动 Web 与混合
  8. 08Flutter 概览
  9. 09Ionic 概览
  10. 10Web Components
  11. 11Lighthouse 与 DevTools
  12. 12综合练习

Service Worker

注册、缓存策略、更新。

35 分钟

Service Worker

Service Worker(SW) 是浏览器里的 后台脚本:可拦截网络请求、读写 Cache Storage,实现 离线优先、预缓存、更新策略。PWA 的「断网仍能用」几乎都依赖它——也是跨平台前端里 最容易写错、最难调试 的一环。

学习目标

  • 完成 SW 注册与生命周期(install → activate → fetch)直觉
  • 对比常见缓存策略:Cache First、Network First、Stale-While-Revalidate
  • 理解更新时「新旧 SW 并存」与用户刷新问题

注册最小示例

主线程(如 main.js 或 React 入口):

if ("serviceWorker" in navigator) {
  window.addEventListener("load", () => {
    navigator.serviceWorker.register("/sw.js").catch(console.error);
  });
}

sw.js 骨架:

const CACHE = "crm-v1";
const ASSETS = ["/", "/tracks", "/styles/main.css", "/offline.html"];

self.addEventListener("install", (event) => {
  event.waitUntil(caches.open(CACHE).then((c) => c.addAll(ASSETS)));
});

self.addEventListener("fetch", (event) => {
  event.respondWith(
    caches.match(event.request).then((cached) => cached || fetch(event.request))
  );
});

Scope:默认 SW 只能控制 其路径及以下 的请求;通常把 sw.js 放在站点根目录。

生命周期与更新

install  → 预缓存静态资源(新版本 CACHE 名如 crm-v2)
activate → 删旧 cache、claim 客户端
fetch    → 对每个请求决定走 cache 还是 network

用户 不刷新 时,旧页面可能仍绑旧 SW——常见做法:activate 里 clients.claim(),并在 UI 提示「新版本可用,请刷新」。

缓存策略选型

策略适用风险
Cache First带 hash 的 JS/CSS、字体HTML 若缓存过久会 stale
Network FirstAPI JSON、个性化内容离线时无 fallback 则失败
Stale-While-Revalidate文章、tracks 列表实现稍复杂,体验平滑

与 http-caching、http-app-cache 对照:HTTP 缓存 由浏览器按响应头处理;SW 缓存 由你的 fetch 处理器显式决定——二者可叠加,不要重复缓存同一资源却不设版本策略。

与 React / 工具链

  • 生产构建文件名带 content hash → 适合 Cache First
react-essentials
  • ft-vite / Workbox 插件可生成 SW,避免手写遗漏路由
  • 开发环境 常禁用 SW 或 short-circuit,否则 HMR 被 cache 干扰
  • 调试清单

    • DevTools → Application → Service Workers:Unregister、Update、Offline 模拟
    • Network 勾选 Offline,验证 fallback 页
    • 改 CACHE 版本号后,确认 activate 是否清理旧条目

    练习

    • 为 /tracks 静态页实现 Network First + /offline.html fallback
    • 故意 bump cache 名,观察两次访问是否命中不同 SW
    • 读 http-protocol-essentials 缓存课,写一句 SW 与 Cache-Control 的分工

    小结

    SW = 可编程的离线代理;策略比 API 更重要。 下一课浏览 Web API,扩展浏览器能调用的系统能力。

    加载本节练习…
    ← 上一课PWA 基础下一课 →Web API