基于Vue的PWA如何启动时预缓存Firebase Storage图片并留存3天?
解决方案
方案1:启动全量预缓存(符合你最初的思路)
适合图片总体积较小的场景,实现步骤如下:
- 第一步:整理所有图片的访问URL列表
你可以在打包环节自动扫描项目中用到的所有Firebase Storage图片地址,生成一个静态的imageList.json文件,或者通过后端接口返回全量图片URL清单,PWA启动时优先拉取这个清单。 - 第二步:配置Service Worker缓存规则
不管你用的是Vue CLI的PWA插件还是Vite PWA插件,都可以通过Workbox配置针对Firebase Storage图片的缓存策略:// vite-plugin-pwa 配置示例(Vue CLI配置逻辑完全一致) import { VitePWA } from 'vite-plugin-pwa' export default defineConfig({ plugins: [ VitePWA({ workbox: { // 配置启动时预缓存的图片资源 additionalManifestEntries: await fetch('/imageList.json').then(res => res.json()), // 针对Firebase Storage域名的缓存规则 runtimeCaching: [ { urlPattern: /^https:\/\/firebasestorage\.googleapis\.com\/.*/i, handler: 'CacheFirst', options: { cacheName: 'firebase-images', expiration: { // 缓存留存3天,单位为秒 maxAgeSeconds: 3 * 24 * 60 * 60, // 最多缓存图片数量,可按需调整 maxEntries: 200, }, cacheableResponse: { statuses: [0, 200] } } } ] } }) ] }) - 第三步:解决刷新缓存丢失问题
你之前刷新后缓存丢失是因为用的是内存缓存,配置上述Service Worker持久化缓存后,只要用户不主动清除浏览器站点数据,缓存就会保留3天,刷新页面不会丢失。
方案2:懒加载+临近视口预加载(更优,适合图片量大的场景)
如果你的图片总大小超过50MB,启动时全量预缓存会占用用户带宽、拖慢PWA启动速度,更推荐这个方案:
- 用
vue-lazyload或者原生IntersectionObserver实现图片懒加载,同时设置预加载距离:比如当图片距离视口还有2屏高度时就触发加载,用户滚动到对应位置时图片已经加载完成 - 保留上面的Service Worker缓存策略,已经加载过的图片3天内不会重复请求
- 也可以搭配页面级预加载:进入首页时就预加载下一个页面的所有图片,跳转后直接读取缓存
额外优化点
- 你当前的Firebase Storage的
cacheControl配置没问题,保持即可,CDN层也会缓存你的图片,进一步降低回源时间 - 建议给所有图片加webp/avif格式的降级适配,同画质下体积减少50%以上,加载速度更快
- 如果是缩略图场景,可以提前生成不同尺寸的缩略图存在Firebase Storage,列表页加载小图,详情页再加载大图
内容的提问来源于stack exchange,提问作者Владимир Озеранский
相关产品推荐
相关产品推荐

