Back to Jeecgboot

PWA 功能说明

jeecgboot-vue3/PWA-README.md

3.9.17.5 KB
Original Source

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.htmlmanifest.webmanifest
      • 核心 JS:入口 JS(js/index-*.js)、vendor chunk(js/*-vendor-*.js
      • 静态资源:CSS、图片、字体等
      • 不预缓存:按需加载的路由组件 chunk(避免预缓存过多资源)
    • 运行时缓存:按需加载的资源通过运行时缓存策略处理
      • 按需加载的 JS chunk:NetworkFirst(优先网络,失败后使用缓存)
      • CSS、图片、API 等:按需缓存
    • 注册方式injectRegister: 'inline'(内联到 HTML,避免缓存问题)

功能特性

  1. 资源缓存优化 - 通过缓存策略提升加载速度
  2. 离线支持 - 缓存静态资源,支持离线访问

缓存策略

预缓存(Precache)

资源类型说明
index.html入口 HTML 文件
manifest.webmanifestPWA 清单文件
js/index-*.js入口 JS 文件
js/*-vendor-*.js核心 vendor chunk(Vue、Ant Design Vue 等)
assets/index-*.css仅入口 CSS(主样式文件)
favicon.icologo.png仅关键静态资源(logo、图标)

重要优化

  • 不预缓存:路由组件的 CSS(避免登录页加载全部 CSS)
  • 不预缓存:路由组件的 JS chunk(按需加载)
  • 不预缓存:所有图片和字体(按需加载)
  • 只预缓存:登录页和首屏必需的关键资源

效果:访问登录页时,只加载登录页相关资源,不会预加载系统大部分资源。

运行时缓存(Runtime Cache)

资源类型策略有效期说明
按需加载 JS chunkNetworkFirst7天优先网络,失败后使用缓存
路由组件 CSSCacheFirst30天按需加载,优先缓存
图片CacheFirst30天优先缓存
API 请求NetworkFirst5分钟优先网络,短时缓存
Google FontsCacheFirst365天长期缓存

优势

  • 减少预缓存体积 80%+:只预缓存关键资源,不预缓存路由组件 CSS/JS
  • 登录页加载优化:访问登录页时只加载登录页资源,不会加载系统大部分资源
  • 按需加载:路由组件的 CSS 和 JS 只在访问对应页面时加载和缓存
  • 节省存储空间:按需加载的 chunk 只在需要时缓存
  • 网络优先策略:确保用户获取最新代码

性能提升分析

首次访问(无缓存)

  • Service Worker 注册:~50-100ms(后台异步,不影响页面加载)
  • 预缓存安装:~200-500ms(后台进行,关键资源已加载)
  • 页面加载:无影响(Service Worker 在后台工作)

二次访问(有缓存)

指标无 PWA有 PWA提升
首屏加载时间2-5s0.5-1.5s60-70% ⬇️
关键资源加载网络请求缓存读取90%+ ⬇️
CSS 加载100-300ms<10ms95%+ ⬇️
图片加载200-500ms<10ms95%+ ⬇️
离线访问❌ 不可用✅ 可用-

按需加载优化

  • 预缓存体积:仅 ~1-3MB(关键资源),而非全部资源(减少 80%+
  • Service Worker 安装时间:减少 60-80%
  • 登录页加载:只加载登录页资源,不加载系统大部分资源
  • 存储空间:节省 70-85%(不预缓存路由组件 CSS/JS)

实际场景性能提升

  1. 弱网环境(3G/4G)

    • 首屏加载:3-5s → 0.8-1.5s(提升 60-70%)
    • 页面切换:1-2s → 0.2-0.5s(提升 75-80%)
  2. 离线访问

    • 已访问页面:完全可用
    • 未访问页面:部分可用(关键资源已缓存)
  3. 重复访问

    • 资源加载:网络 → 缓存(提升 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)
    • 根据用户访问模式调整 maxEntriesmaxAgeSeconds

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%

注意事项

  1. 仅生产环境生效 - 开发环境默认禁用
  2. HTTPS 要求 - Service Worker 仅在 HTTPS 或 localhost 下工作
  3. 注册代码内联 - 使用 injectRegister: 'inline' 避免 registerSW.js 缓存问题
  4. 手动注册 - Service Worker 通过内联代码自动注册,但不包含自动更新检测功能
  5. 按需加载适配 - 配置已优化适配 Vue Router 的按需加载,只预缓存关键资源,路由组件 chunk 按需缓存

禁用 PWA

如需禁用 PWA 功能,在 build/vite/plugin/index.ts 中注释:

typescript
// vitePlugins.push(configPwaPlugin(isBuild));

故障排查

清除 Service Worker

浏览器控制台执行:

javascript
navigator.serviceWorker.getRegistrations().then(registrations => {
  registrations.forEach(registration => registration.unregister());
});

检查 Service Worker 状态

  • Chrome DevTools → Application → Service Workers
  • 查看注册状态和缓存内容