Files
JeecgBoot/jeecgboot-vue3/PWA-README.md

7.5 KiB
Raw Blame History

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

功能特性

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

缓存策略

预缓存Precache

资源类型 说明
index.html 入口 HTML 文件
manifest.webmanifest PWA 清单文件
js/index-*.js 入口 JS 文件
js/*-vendor-*.js 核心 vendor chunkVue、Ant Design Vue 等)
assets/index-*.css 仅入口 CSS(主样式文件)
favicon.icologo.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

实际场景性能提升

  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 使用 NetworkFirst3s 超时)
  • 💡 建议:可根据实际网络情况调整 networkTimeoutSeconds
    • 弱网环境可适当增加超时时间5-8s
    • 强网环境可减少超时时间1-2s

3. 缓存策略优化

  • 已实现CSS、图片使用 CacheFirst30天
  • 💡 建议
    • 静态资源logo、图标可延长至 90-180 天
    • 业务图片:保持 30 天,确保内容更新及时

4. 存储空间管理

  • 已实现:按需加载 chunk 限制 100 个7 天过期
  • 💡 建议
    • 监控缓存使用情况Chrome DevTools → Application → Storage
    • 根据用户访问模式调整 maxEntriesmaxAgeSeconds

5. 用户体验优化

  • 已实现Service Worker 后台注册,不阻塞页面加载
  • 💡 建议
    • 添加加载提示(可选):显示"正在准备离线功能"
    • 错误处理Service Worker 注册失败时优雅降级

6. 性能监控

建议监控以下指标:

  • FCPFirst Contentful Paint:目标 < 1.5s
  • LCPLargest Contentful Paint:目标 < 2.5s
  • TTITime 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 中注释:

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

故障排查

清除 Service Worker

浏览器控制台执行:

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

检查 Service Worker 状态

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