关于 pwa-development
pwa-development 面向 React 和 Svelte 项目,指导渐进式 Web 应用功能的实现与排查,涵盖服务工作线程、缓存、离线行为、更新和 iOS 特有问题。
主要功能
- 01Manifest 与服务工作线程配置指导
- 02缓存策略建议
- 03离线存储与同步指导
- 04PWA 审核与调试
- 05iOS 特有问题排查
适用场景
- 01为 Web 应用添加离线支持
- 02排查内容过期或缓存异常
- 03修复服务工作线程更新行为
- 04调查 iOS 上的 PWA 问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill pwa-development安装后在 Claude Code 中输入/pwa-development确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/manifest.json.templateoffline-page.htmlservice-worker-workbox.tsupdate-prompt.svelteupdate-prompt.tsxdata/caching-strategies.jsonframework-patterns.jsonios-quirks.jsonmanifest-options.jsonscripts/cache-strategy-advisor.tsmanifest-generator.tspwa-audit.tssw-scaffolder.ts详细介绍
PWA 开发
为 React 和 Svelte 应用实现渐进式 Web 应用功能,包括 Service Worker、缓存策略、离线支持和安装提示。
何时使用此技能
在以下情况下使用此技能:
- 为 Web 应用添加 PWA 功能
- 实现离线支持
- 创建 Service Worker 缓存策略
- 调试 PWA 安装问题
- 处理 iOS 特有的 PWA 问题
在以下情况下不要使用此技能:
- 构建后端 API
- 处理需求/设计(先使用相应技能)
- 需要复杂的离线优先架构(先进行设计)
核心原则
如果事后才考虑离线行为,PWA 就会失败。 PWA 不是“给现有应用添加 Service Worker”,而是关乎数据流、缓存和连接故障的根本性架构决策。
诊断状态
P0:未设置 PWA
症状: 没有 manifest.json,没有 Service Worker,只能在线使用
处理措施:
- 运行
scripts/manifest-generator.ts创建清单 - 在 HTML head 中添加
<link rel="manifest"> - 使用
scripts/sw-scaffolder.ts生成最简 Service Worker
P1:仅有基础清单
症状: 清单存在,但缺少 Service Worker,离线时无法使用
关键问题:
- 哪些内容必须在离线时可用?
- 哪些内容应始终保持最新(网络优先)?
处理措施:
- 使用
scripts/cache-strategy-advisor.ts - 实现应用外壳模式
- 添加离线备用页面
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 问题
症状: 在 Android 上正常运行,在 iOS 上出问题
处理措施:
- 查看
data/ios-quirks.json - 添加 apple-mobile-web-app meta 标签
- 妥善处理存储空间回收
P6:可用于生产环境
指标: Lighthouse PWA 得分为 100、支持离线使用、更新过程顺畅
缓存策略
| 策略 | 适用内容 | 行为 |
|---|---|---|
| 缓存优先 | 静态资源、字体 | 从缓存提供内容,并在后台更新 |
| 网络优先 | API 数据、用户内容 | 尝试访问网络,失败时回退到缓存 |
| 过时内容重新验证 | 半静态内容 | 提供过时内容,并更新缓存供下次使用 |
| 仅网络 | 身份验证、实时数据 | 始终访问网络,不进行缓存 |
可用脚本
| 脚本 | 用途 |
|---|---|
manifest-generator.ts | 生成 manifest.json |
sw-scaffolder.ts | 生成 Service Worker |
cache-strategy-advisor.ts | 推荐缓存策略 |
pwa-audit.ts | 验证 PWA 配置 |
反模式
缓存一切
预缓存每个资源——导致首次下载量巨大。 修复方法: 只预缓存关键的应用外壳内容。运行时再缓存内容。
永不过期的缓存
缓存永不过期——内容会一直过时。 修复方法: 对缓存进行版本管理,在激活时删除旧缓存,并设置最长缓存时间。
静默更新
在不通知用户的情况下强制更新。 修复方法: 通知用户,让他们选择何时刷新。
事后才考虑 iOS
先针对 Chrome 构建,最后才测试 iOS。 修复方法: 尽早测试 iOS,并接受 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 - 在实际设备上测试
相关技能
- requirements-analysis - 确定离线需求
- system-design - PWA 架构决策
- react-pwa - React 专用 PWA 实现