|
| 1 | +# 版本更新指南 |
| 2 | + |
| 3 | +## 自动缓存清理机制 |
| 4 | + |
| 5 | +当发布新版本时,Service Worker 会自动清理旧缓存并提示用户更新。 |
| 6 | + |
| 7 | +## 工作流程 |
| 8 | + |
| 9 | +```mermaid |
| 10 | +sequenceDiagram |
| 11 | + participant User as 用户 |
| 12 | + participant Page as 页面 |
| 13 | + participant SW as Service Worker |
| 14 | + participant Cache as 缓存 |
| 15 | +
|
| 16 | + User->>Page: 访问网站 |
| 17 | + Page->>SW: 检查更新 |
| 18 | + SW->>SW: 发现新版本 |
| 19 | + SW->>Cache: 删除旧缓存 |
| 20 | + SW->>Page: 发送更新消息 |
| 21 | + Page->>User: 显示"正在更新..." |
| 22 | + SW->>SW: 激活新版本 |
| 23 | + Page->>Page: 自动刷新 |
| 24 | + User->>Page: 看到最新版本 |
| 25 | +``` |
| 26 | + |
| 27 | +## 更新步骤 |
| 28 | + |
| 29 | +### 1. 修改版本号 |
| 30 | + |
| 31 | +**更新 Service Worker 版本**: |
| 32 | +```javascript |
| 33 | +// public/sw.js |
| 34 | +const CACHE_NAME = 'weiz-nav-v4'; // v3 → v4 |
| 35 | +const RUNTIME_CACHE = 'weiz-nav-runtime-v4'; |
| 36 | +const IMAGE_CACHE = 'weiz-nav-images-v4'; |
| 37 | +``` |
| 38 | + |
| 39 | +**更新版本信息**: |
| 40 | +```json |
| 41 | +// public/version.json |
| 42 | +{ |
| 43 | + "version": "1.0.4", |
| 44 | + "buildTime": "2024-11-18T12:00:00.000Z", |
| 45 | + "cacheVersion": "v4", |
| 46 | + "changelog": [ |
| 47 | + "新功能描述", |
| 48 | + "Bug 修复", |
| 49 | + "性能优化" |
| 50 | + ] |
| 51 | +} |
| 52 | +``` |
| 53 | + |
| 54 | +### 2. 提交和部署 |
| 55 | + |
| 56 | +```bash |
| 57 | +# 提交更改 |
| 58 | +git add public/sw.js public/version.json |
| 59 | +git commit -m "chore: 发布 v1.0.4" |
| 60 | +git push |
| 61 | + |
| 62 | +# Cloudflare Pages 自动部署 |
| 63 | +``` |
| 64 | + |
| 65 | +### 3. 用户体验 |
| 66 | + |
| 67 | +**用户访问网站时**: |
| 68 | +1. Service Worker 检测到新版本 |
| 69 | +2. 后台下载新的 Service Worker |
| 70 | +3. 显示提示:"发现新版本,正在更新..." |
| 71 | +4. 自动删除旧缓存 |
| 72 | +5. 激活新版本 |
| 73 | +6. 自动刷新页面 |
| 74 | +7. 显示:"应用已更新到最新版本!" |
| 75 | + |
| 76 | +**整个过程约 2-3 秒,用户几乎无感知** |
| 77 | + |
| 78 | +## 缓存清理策略 |
| 79 | + |
| 80 | +### 自动清理 |
| 81 | + |
| 82 | +Service Worker 激活时会自动清理: |
| 83 | +```javascript |
| 84 | +// 保留当前版本的缓存 |
| 85 | +const keepCaches = [CACHE_NAME, RUNTIME_CACHE, IMAGE_CACHE]; |
| 86 | + |
| 87 | +// 删除所有其他缓存 |
| 88 | +caches.keys().then((cacheNames) => { |
| 89 | + cacheNames.forEach((cacheName) => { |
| 90 | + if (!keepCaches.includes(cacheName)) { |
| 91 | + caches.delete(cacheName); // 删除旧缓存 |
| 92 | + } |
| 93 | + }); |
| 94 | +}); |
| 95 | +``` |
| 96 | + |
| 97 | +### 清理的内容 |
| 98 | + |
| 99 | +1. **旧版本的静态资源缓存** |
| 100 | +2. **旧版本的运行时缓存** |
| 101 | +3. **旧版本的图片缓存** |
| 102 | + |
| 103 | +### 保留的内容 |
| 104 | + |
| 105 | +1. **LocalStorage 数据**(用户的导航链接) |
| 106 | +2. **用户设置**(主题、搜索引擎等) |
| 107 | +3. **当前版本的缓存** |
| 108 | + |
| 109 | +## 版本检查机制 |
| 110 | + |
| 111 | +### 定期检查 |
| 112 | + |
| 113 | +```javascript |
| 114 | +// 每小时检查一次更新 |
| 115 | +setInterval(() => { |
| 116 | + registration.update(); |
| 117 | +}, 60 * 60 * 1000); |
| 118 | +``` |
| 119 | + |
| 120 | +### 手动检查 |
| 121 | + |
| 122 | +用户可以通过以下方式手动检查更新: |
| 123 | +1. 刷新页面(F5) |
| 124 | +2. 硬刷新(Ctrl+Shift+R) |
| 125 | +3. 清除缓存后刷新 |
| 126 | + |
| 127 | +## 版本回滚 |
| 128 | + |
| 129 | +如果新版本有问题,可以快速回滚: |
| 130 | + |
| 131 | +### 1. 回滚代码 |
| 132 | + |
| 133 | +```bash |
| 134 | +# 回滚到上一个版本 |
| 135 | +git revert HEAD |
| 136 | +git push |
| 137 | +``` |
| 138 | + |
| 139 | +### 2. 用户端清理 |
| 140 | + |
| 141 | +用户需要: |
| 142 | +1. 清除浏览器缓存 |
| 143 | +2. 刷新页面 |
| 144 | +3. 或等待 Service Worker 自动更新 |
| 145 | + |
| 146 | +## 测试更新流程 |
| 147 | + |
| 148 | +### 本地测试 |
| 149 | + |
| 150 | +```bash |
| 151 | +# 1. 构建当前版本 |
| 152 | +pnpm build |
| 153 | +pnpm serve:static |
| 154 | + |
| 155 | +# 2. 访问 http://localhost:3000 |
| 156 | +# 3. 打开 DevTools → Application → Service Workers |
| 157 | + |
| 158 | +# 4. 修改版本号(v3 → v4) |
| 159 | +# 5. 重新构建 |
| 160 | +pnpm build |
| 161 | + |
| 162 | +# 6. 刷新页面 |
| 163 | +# 7. 观察 Service Worker 更新过程 |
| 164 | +``` |
| 165 | + |
| 166 | +### 生产测试 |
| 167 | + |
| 168 | +```bash |
| 169 | +# 1. 部署到测试环境 |
| 170 | +git push origin test |
| 171 | + |
| 172 | +# 2. 访问测试网站 |
| 173 | +# 3. 观察更新提示 |
| 174 | +# 4. 确认缓存已清理 |
| 175 | +# 5. 验证功能正常 |
| 176 | + |
| 177 | +# 6. 部署到生产环境 |
| 178 | +git push origin main |
| 179 | +``` |
| 180 | + |
| 181 | +## 监控更新状态 |
| 182 | + |
| 183 | +### 浏览器控制台 |
| 184 | + |
| 185 | +```javascript |
| 186 | +// 查看当前 Service Worker 版本 |
| 187 | +navigator.serviceWorker.getRegistration().then((reg) => { |
| 188 | + console.log('当前版本:', reg.active?.scriptURL); |
| 189 | +}); |
| 190 | + |
| 191 | +// 查看所有缓存 |
| 192 | +caches.keys().then((keys) => { |
| 193 | + console.log('缓存列表:', keys); |
| 194 | +}); |
| 195 | + |
| 196 | +// 查看缓存大小 |
| 197 | +navigator.storage.estimate().then((estimate) => { |
| 198 | + console.log('已使用:', estimate.usage, 'bytes'); |
| 199 | + console.log('配额:', estimate.quota, 'bytes'); |
| 200 | +}); |
| 201 | +``` |
| 202 | +
|
| 203 | +### Service Worker 状态 |
| 204 | +
|
| 205 | +``` |
| 206 | +DevTools → Application → Service Workers |
| 207 | + |
| 208 | +状态说明: |
| 209 | +- installing: 正在安装 |
| 210 | +- installed: 已安装,等待激活 |
| 211 | +- activating: 正在激活 |
| 212 | +- activated: 已激活,正在运行 |
| 213 | +- redundant: 已废弃 |
| 214 | +``` |
| 215 | +
|
| 216 | +## 常见问题 |
| 217 | +
|
| 218 | +### Q: 用户会丢失数据吗? |
| 219 | +
|
| 220 | +**A**: 不会! |
| 221 | +- LocalStorage 数据不会被清理 |
| 222 | +- 只清理缓存的静态资源 |
| 223 | +- 用户的导航链接、设置都会保留 |
| 224 | +
|
| 225 | +### Q: 更新需要多长时间? |
| 226 | +
|
| 227 | +**A**: 通常 2-3 秒 |
| 228 | +- 下载新 Service Worker: ~1 秒 |
| 229 | +- 清理旧缓存: ~0.5 秒 |
| 230 | +- 刷新页面: ~0.5 秒 |
| 231 | +
|
| 232 | +### Q: 用户必须刷新页面吗? |
| 233 | +
|
| 234 | +**A**: 会自动刷新 |
| 235 | +- Service Worker 激活后自动刷新 |
| 236 | +- 用户无需手动操作 |
| 237 | +- 显示友好的更新提示 |
| 238 | +
|
| 239 | +### Q: 如果用户不在线怎么办? |
| 240 | +
|
| 241 | +**A**: 下次在线时更新 |
| 242 | +- Service Worker 会在后台等待 |
| 243 | +- 用户下次访问时检查更新 |
| 244 | +- 离线期间使用旧版本 |
| 245 | +
|
| 246 | +### Q: 可以强制用户更新吗? |
| 247 | +
|
| 248 | +**A**: 可以,但不推荐 |
| 249 | +```javascript |
| 250 | +// 强制刷新(不推荐) |
| 251 | +if (newWorker.state === 'installed') { |
| 252 | + newWorker.postMessage({ type: 'SKIP_WAITING' }); |
| 253 | + window.location.reload(); // 立即刷新 |
| 254 | +} |
| 255 | +``` |
| 256 | +
|
| 257 | +推荐使用当前的友好提示方式。 |
| 258 | +
|
| 259 | +## 版本命名规范 |
| 260 | +
|
| 261 | +### 语义化版本 |
| 262 | +
|
| 263 | +``` |
| 264 | +v主版本.次版本.修订版本 |
| 265 | + |
| 266 | +例如:v1.2.3 |
| 267 | +- 主版本:重大更新,可能不兼容 |
| 268 | +- 次版本:新功能,向后兼容 |
| 269 | +- 修订版本:Bug 修复,向后兼容 |
| 270 | +``` |
| 271 | +
|
| 272 | +### 缓存版本 |
| 273 | +
|
| 274 | +``` |
| 275 | +weiz-nav-v{number} |
| 276 | + |
| 277 | +例如:weiz-nav-v3 |
| 278 | +- 每次更新递增 |
| 279 | +- 简单明了 |
| 280 | +- 易于识别 |
| 281 | +``` |
| 282 | +
|
| 283 | +## 最佳实践 |
| 284 | +
|
| 285 | +### 1. 版本号管理 |
| 286 | +
|
| 287 | +- ✅ 使用语义化版本 |
| 288 | +- ✅ 在 version.json 中记录 |
| 289 | +- ✅ 在 CHANGELOG.md 中记录 |
| 290 | +- ✅ Git tag 标记版本 |
| 291 | +
|
| 292 | +### 2. 测试流程 |
| 293 | +
|
| 294 | +- ✅ 本地测试更新流程 |
| 295 | +- ✅ 测试环境验证 |
| 296 | +- ✅ 生产环境灰度发布 |
| 297 | +- ✅ 监控错误日志 |
| 298 | +
|
| 299 | +### 3. 用户体验 |
| 300 | +
|
| 301 | +- ✅ 友好的更新提示 |
| 302 | +- ✅ 自动刷新页面 |
| 303 | +- ✅ 保留用户数据 |
| 304 | +- ✅ 快速更新过程 |
| 305 | +
|
| 306 | +### 4. 回滚准备 |
| 307 | +
|
| 308 | +- ✅ 保留上一个版本的代码 |
| 309 | +- ✅ 准备回滚脚本 |
| 310 | +- ✅ 监控用户反馈 |
| 311 | +- ✅ 快速响应问题 |
| 312 | +
|
| 313 | +## 更新检查清单 |
| 314 | +
|
| 315 | +发布新版本前,确认: |
| 316 | +
|
| 317 | +- [ ] 更新 Service Worker 版本号 |
| 318 | +- [ ] 更新 version.json |
| 319 | +- [ ] 更新 CHANGELOG.md |
| 320 | +- [ ] 本地测试更新流程 |
| 321 | +- [ ] 测试环境验证 |
| 322 | +- [ ] 代码审查通过 |
| 323 | +- [ ] 准备回滚方案 |
| 324 | +- [ ] 通知用户(如果是重大更新) |
| 325 | +
|
| 326 | +## 示例:发布 v1.0.4 |
| 327 | +
|
| 328 | +```bash |
| 329 | +# 1. 更新版本号 |
| 330 | +# 编辑 public/sw.js |
| 331 | +const CACHE_NAME = 'weiz-nav-v4'; |
| 332 | + |
| 333 | +# 编辑 public/version.json |
| 334 | +{ |
| 335 | + "version": "1.0.4", |
| 336 | + "cacheVersion": "v4" |
| 337 | +} |
| 338 | + |
| 339 | +# 2. 提交 |
| 340 | +git add . |
| 341 | +git commit -m "chore: 发布 v1.0.4 |
| 342 | +
|
| 343 | +- 新增功能 A |
| 344 | +- 修复 Bug B |
| 345 | +- 优化性能 C" |
| 346 | + |
| 347 | +# 3. 打标签 |
| 348 | +git tag v1.0.4 |
| 349 | +git push origin v1.0.4 |
| 350 | + |
| 351 | +# 4. 部署 |
| 352 | +git push origin main |
| 353 | + |
| 354 | +# 5. 监控 |
| 355 | +# 查看 Cloudflare Pages 部署日志 |
| 356 | +# 监控用户反馈 |
| 357 | +# 检查错误日志 |
| 358 | +``` |
| 359 | +
|
| 360 | +## 总结 |
| 361 | +
|
| 362 | +✅ **自动化**:版本更新完全自动化 |
| 363 | +✅ **无感知**:用户几乎无感知更新 |
| 364 | +✅ **安全**:保留用户数据 |
| 365 | +✅ **快速**:2-3 秒完成更新 |
| 366 | +✅ **可靠**:自动清理旧缓存 |
| 367 | +
|
| 368 | +--- |
| 369 | +
|
| 370 | +**享受无缝的版本更新体验!** 🚀 |
0 commit comments