前端开发
为 Web 应用实现 PWA 离线、可安装…
当需要给 React/Svelte 等 Web 应用添加 PWA、离线支持、Service Worker、可安装能力,或修复缓存、更新、离线数据和 iOS 兼容问题时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
为 Web 应用实现 PWA 离线、可安通用
解决思路
- 先做架构决策:把离线行为作为数据流、缓存和连接失败设计的一部分,而不是在现有应用上事后添加 Service Worker。
- P0 无 PWA 设置:运行 `scripts/manifest-generator.ts` 创建 manifest;在 HTML head 添加 `<link rel="manifest">`;用 `scripts/sw-scaffolder.ts` 生成最小 Service Worker。
- P1 仅基础 Manifest:使用 `scripts/cache-strategy-advisor.ts`;实现 app shell 模式;添加离线回退页面。
- P2 缓存问题:用 `scripts/pwa-audit.ts` 审计;按 `data/caching-strategies.json` 将资源映射到策略;添加缓存过期和清理。
- P3 更新问题:适当实现 skipWaiting/clients.claim;添加更新通知 UI(`assets/update-prompt.tsx`);正确处理 waiting 状态。
- P4 离线数据缺口:用 IndexedDB 做离线存储;添加 Background Sync API;创建同步状态 UI。
- P5 iOS 问题:查看 `data/ios-quirks.json`;添加 apple-mobile-web-app meta 标签;优雅处理存储被驱逐。
- P6 生产就绪:以 Lighthouse PWA 100、离线可用、更新干净作为验证标准。
- 缓存策略:静态资源和字体用 Cache First,从缓存提供并在后台更新。
- 缓存策略:API 数据和用户内容用 Network First,先尝试网络,失败回退缓存。
- 缓存策略:半静态内容用 Stale While Revalidate,先返回旧内容,并更新缓存供下次使用。
- 缓存策略:认证和实时数据用 Network Only,始终走网络且不缓存。
- 可用脚本:`manifest-generator.ts` 生成 manifest.json。
- 可用脚本:`sw-scaffolder.ts` 生成 Service Worker。
- 可用脚本:`cache-strategy-advisor.ts` 推荐缓存策略。
- 可用脚本:`pwa-audit.ts` 校验 PWA 配置。
- 反模式修复——Everything Cache:只预缓存关键 app shell,其他内容运行时缓存,避免预缓存所有资源造成巨大初始下载。
- 反模式修复——Immortal Cache:做缓存版本化,在 activate 时删除旧缓存,设置 max age,避免缓存永不过期导致内容永远陈旧。
- 反模式修复——Silent Update:通知用户,让用户选择何时刷新,避免强制更新且不通知。
- 反模式修复——iOS Afterthought:尽早测试 iOS,接受 iOS 限制,不要只为 Chrome 构建、最后才测 iOS。
- React + Vite 安装:运行 `npm i -D vite-plugin-pwa`。
- SvelteKit 安装:运行 `npm i -D @vite-pwa/sveltekit`。
- Next.js 安装:运行 `npm i next-pwa`。
- 配置参考:查看 `data/framework-patterns.json`。
- 调试检查:DevTools > Application > Manifest,检查是否有效。
- 调试检查:DevTools > Application > Service Workers,检查是否注册。
- 调试检查:DevTools > Application > Cache Storage,检查缓存了什么。
- 调试检查:DevTools > Network > Offline,检查离线是否可用。
- 调试检查:Lighthouse > PWA,检查分数和失败项。
- 调试检查:iOS Safari,在真实设备上测试。
适用边界 · 注意事项
- 构建后端 API 时不要用。
- 仍在做需求或设计阶段时不要用;应先使用 requirements-analysis 等技能。
- 需要复杂离线优先架构时不要直接实施;应先做设计。