# PWA 缓存优化指南 ## 📊 当前应用的App Shell模型评估 ### ✅ 符合App Shell模型的方面 1. **核心架构** - 拥有独立的HTML shell (`index.html`) - 实现了内容与框架的分离 - 使用Vue Router进行路由懒加载 - 具备完整的PWA manifest配置 2. **Service Worker实现** - 使用Workbox框架进行缓存管理 - 实现了预缓存和运行时缓存 - 支持离线检测和状态管理 - 实现了推送通知功能 3. **用户体验优化** - 自定义加载界面 - 离线页面支持 - 网络状态实时检测 - 背景图片预加载 ## 🚀 已实施的优化 ### 1. App Shell缓存策略优化 ```javascript // 为App Shell HTML使用CacheFirst策略 { urlPattern: /^\/$|\/index\.html$/, handler: 'CacheFirst', options: { cacheName: 'app-shell-cache', expiration: { maxEntries: 10, maxAgeSeconds: 7 * 24 * 60 * 60, // 7天 }, }, } ``` ### 2. 关键资源预缓存 - 预缓存`loader.css`和`logo.png` - 确保离线页面始终可用 ### 3. 独立的离线页面 - 创建了包含内联CSS的独立离线页面 - 自动检测网络恢复并重新加载 - 优雅的UI设计,支持深色模式 ## 📈 进一步优化建议 ### 1. **关键CSS内联** 建议将关键CSS内联到`index.html`中: ```html ``` ### 2. **资源优先级优化** ```html ``` ### 3. **缓存版本控制** 实现缓存版本控制机制: ```javascript // 在service-worker.ts中 const CACHE_VERSION = 'v1.0.0'; const CACHE_NAMES = { appShell: `app-shell-${CACHE_VERSION}`, static: `static-resources-${CACHE_VERSION}`, api: `api-cache-${CACHE_VERSION}`, }; ``` ### 4. **智能预取策略** 基于用户行为预取资源: ```javascript // 预取下一个可能访问的页面 if ('requestIdleCallback' in window) { requestIdleCallback(() => { const nextPageChunk = '/assets/dashboard-chunk.js'; if ('link' in document.createElement('link')) { const link = document.createElement('link'); link.rel = 'prefetch'; link.href = nextPageChunk; document.head.appendChild(link); } }); } ``` ### 5. **缓存清理策略** 定期清理过期缓存: ```javascript // 清理超过30天的图片缓存 async function cleanupOldCaches() { const cacheNames = await caches.keys(); const currentCaches = Object.values(CACHE_NAMES); await Promise.all( cacheNames.map(cacheName => { if (!currentCaches.includes(cacheName)) { return caches.delete(cacheName); } }) ); } ``` ## 🔧 性能监控建议 ### 1. **缓存命中率监控** ```javascript // 记录缓存命中率 let cacheHits = 0; let totalRequests = 0; self.addEventListener('fetch', event => { totalRequests++; event.respondWith( caches.match(event.request).then(response => { if (response) { cacheHits++; // 发送统计数据 self.clients.matchAll().then(clients => { clients.forEach(client => { client.postMessage({ type: 'CACHE_STATS', hitRate: (cacheHits / totalRequests * 100).toFixed(2) }); }); }); return response; } return fetch(event.request); }) ); }); ``` ### 2. **离线使用分析** 跟踪用户在离线状态下的行为,优化离线体验。 ## 📱 移动端优化 ### 1. **Add to Home Screen 提示** ```javascript let deferredPrompt; window.addEventListener('beforeinstallprompt', (e) => { e.preventDefault(); deferredPrompt = e; // 在合适的时机显示安装提示 showInstallButton(); }); ``` ### 2. **后台同步** 使用Background Sync API同步离线操作: ```javascript // 注册后台同步 if ('sync' in self.registration) { self.registration.sync.register('sync-data'); } // 处理同步事件 self.addEventListener('sync', event => { if (event.tag === 'sync-data') { event.waitUntil(syncOfflineData()); } }); ``` ## 🎯 最佳实践总结 1. **缓存策略选择** - App Shell: CacheFirst - API数据: NetworkFirst (带超时) - 静态资源: StaleWhileRevalidate - 图片资源: CacheFirst (带过期时间) 2. **缓存大小控制** - 设置合理的maxEntries - 定期清理过期缓存 - 监控缓存使用情况 3. **用户体验** - 提供清晰的离线状态提示 - 实现平滑的在线/离线切换 - 预加载关键资源 4. **性能优化** - 使用导航预加载 - 实施资源优先级策略 - 优化Service Worker启动时间