mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
7.5 KiB
7.5 KiB
PWA 功能说明
概述
项目集成了 vite-plugin-pwa 插件,适配按需加载,实现资源缓存优化和离线支持。
升级亮点:通过集成 vite-plugin-pwa 实现渐进式 Web 应用,提升了首屏加载速度,同时异步加载系统资源,点击菜单响应更迅速。
核心设计:只预缓存关键资源,按需加载的路由组件 chunk 通过运行时缓存策略处理,避免预缓存过多资源。
核心文件
构建生成的文件
-
sw.js- Service Worker 文件,由vite-plugin-pwa自动生成,包含:- 预缓存资源列表(HTML、CSS、核心 JS、静态资源)
- 运行时缓存策略(JS chunk、CSS、图片、API 等)
- 缓存清理和更新逻辑
-
workbox-*.js- Workbox 运行时库,Service Worker 的核心依赖 -
manifest.webmanifest- PWA 清单文件,定义应用元数据
配置文件
build/vite/plugin/pwa.ts- PWA 插件配置- 预缓存策略:只缓存关键资源
- 入口文件:
index.html、manifest.webmanifest - 核心 JS:入口 JS(
js/index-*.js)、vendor chunk(js/*-vendor-*.js) - 静态资源:CSS、图片、字体等
- 不预缓存:按需加载的路由组件 chunk(避免预缓存过多资源)
- 入口文件:
- 运行时缓存:按需加载的资源通过运行时缓存策略处理
- 按需加载的 JS chunk:NetworkFirst(优先网络,失败后使用缓存)
- CSS、图片、API 等:按需缓存
- 注册方式:
injectRegister: 'inline'(内联到 HTML,避免缓存问题)
- 预缓存策略:只缓存关键资源
功能特性
- 资源缓存优化 - 通过缓存策略提升加载速度
- 离线支持 - 缓存静态资源,支持离线访问
缓存策略
预缓存(Precache)
| 资源类型 | 说明 |
|---|---|
index.html |
入口 HTML 文件 |
manifest.webmanifest |
PWA 清单文件 |
js/index-*.js |
入口 JS 文件 |
js/*-vendor-*.js |
核心 vendor chunk(Vue、Ant Design Vue 等) |
assets/index-*.css |
仅入口 CSS(主样式文件) |
favicon.ico、logo.png |
仅关键静态资源(logo、图标) |
重要优化:
- ❌ 不预缓存:路由组件的 CSS(避免登录页加载全部 CSS)
- ❌ 不预缓存:路由组件的 JS chunk(按需加载)
- ❌ 不预缓存:所有图片和字体(按需加载)
- ✅ 只预缓存:登录页和首屏必需的关键资源
效果:访问登录页时,只加载登录页相关资源,不会预加载系统大部分资源。
运行时缓存(Runtime Cache)
| 资源类型 | 策略 | 有效期 | 说明 |
|---|---|---|---|
| 按需加载 JS chunk | NetworkFirst | 7天 | 优先网络,失败后使用缓存 |
| 路由组件 CSS | CacheFirst | 30天 | 按需加载,优先缓存 |
| 图片 | CacheFirst | 30天 | 优先缓存 |
| API 请求 | NetworkFirst | 5分钟 | 优先网络,短时缓存 |
| Google Fonts | CacheFirst | 365天 | 长期缓存 |
优势:
- ✅ 减少预缓存体积 80%+:只预缓存关键资源,不预缓存路由组件 CSS/JS
- ✅ 登录页加载优化:访问登录页时只加载登录页资源,不会加载系统大部分资源
- ✅ 按需加载:路由组件的 CSS 和 JS 只在访问对应页面时加载和缓存
- ✅ 节省存储空间:按需加载的 chunk 只在需要时缓存
- ✅ 网络优先策略:确保用户获取最新代码
性能提升分析
首次访问(无缓存)
- Service Worker 注册:~50-100ms(后台异步,不影响页面加载)
- 预缓存安装:~200-500ms(后台进行,关键资源已加载)
- 页面加载:无影响(Service Worker 在后台工作)
二次访问(有缓存)
| 指标 | 无 PWA | 有 PWA | 提升 |
|---|---|---|---|
| 首屏加载时间 | 2-5s | 0.5-1.5s | 60-70% ⬇️ |
| 关键资源加载 | 网络请求 | 缓存读取 | 90%+ ⬇️ |
| CSS 加载 | 100-300ms | <10ms | 95%+ ⬇️ |
| 图片加载 | 200-500ms | <10ms | 95%+ ⬇️ |
| 离线访问 | ❌ 不可用 | ✅ 可用 | - |
按需加载优化
- 预缓存体积:仅 ~1-3MB(关键资源),而非全部资源(减少 80%+)
- Service Worker 安装时间:减少 60-80%
- 登录页加载:只加载登录页资源,不加载系统大部分资源
- 存储空间:节省 70-85%(不预缓存路由组件 CSS/JS)
实际场景性能提升
-
弱网环境(3G/4G)
- 首屏加载:3-5s → 0.8-1.5s(提升 60-70%)
- 页面切换:1-2s → 0.2-0.5s(提升 75-80%)
-
离线访问
- 已访问页面:完全可用
- 未访问页面:部分可用(关键资源已缓存)
-
重复访问
- 资源加载:网络 → 缓存(提升 90%+)
- 用户体验:秒开(<100ms)
前端体验优化建议
1. 资源加载优化
- ✅ 已实现:
- 只预缓存关键资源(入口 JS、vendor、入口 CSS、logo)
- 路由组件的 CSS 和 JS 不预缓存,按需加载
- 访问登录页时只加载登录页资源,不会加载系统大部分资源
- 💡 建议:确保静态资源(图片、字体)使用 CDN,配合缓存策略
2. 网络策略优化
- ✅ 已实现:JS chunk 使用 NetworkFirst(3s 超时)
- 💡 建议:可根据实际网络情况调整
networkTimeoutSeconds- 弱网环境:可适当增加超时时间(5-8s)
- 强网环境:可减少超时时间(1-2s)
3. 缓存策略优化
- ✅ 已实现:CSS、图片使用 CacheFirst(30天)
- 💡 建议:
- 静态资源(logo、图标):可延长至 90-180 天
- 业务图片:保持 30 天,确保内容更新及时
4. 存储空间管理
- ✅ 已实现:按需加载 chunk 限制 100 个,7 天过期
- 💡 建议:
- 监控缓存使用情况(Chrome DevTools → Application → Storage)
- 根据用户访问模式调整
maxEntries和maxAgeSeconds
5. 用户体验优化
- ✅ 已实现:Service Worker 后台注册,不阻塞页面加载
- 💡 建议:
- 添加加载提示(可选):显示"正在准备离线功能"
- 错误处理:Service Worker 注册失败时优雅降级
6. 性能监控
建议监控以下指标:
- FCP(First Contentful Paint):目标 < 1.5s
- LCP(Largest Contentful Paint):目标 < 2.5s
- TTI(Time to Interactive):目标 < 3.5s
- 缓存命中率:目标 > 80%
注意事项
- 仅生产环境生效 - 开发环境默认禁用
- HTTPS 要求 - Service Worker 仅在 HTTPS 或 localhost 下工作
- 注册代码内联 - 使用
injectRegister: 'inline'避免registerSW.js缓存问题 - 手动注册 - Service Worker 通过内联代码自动注册,但不包含自动更新检测功能
- 按需加载适配 - 配置已优化适配 Vue Router 的按需加载,只预缓存关键资源,路由组件 chunk 按需缓存
禁用 PWA
如需禁用 PWA 功能,在 build/vite/plugin/index.ts 中注释:
// vitePlugins.push(configPwaPlugin(isBuild));
故障排查
清除 Service Worker
浏览器控制台执行:
navigator.serviceWorker.getRegistrations().then(registrations => {
registrations.forEach(registration => registration.unregister());
});
检查 Service Worker 状态
- Chrome DevTools → Application → Service Workers
- 查看注册状态和缓存内容