如何用Workbox缓存Back4App数据?PWA开发技术求助
回答
1)是否可以使用Workbox缓存Back4App数据?
当然可以!不过得先理清两个不同的场景:
- 对于GET查询请求(也就是你提到的"查询数据"),可以通过Workbox的缓存策略直接缓存接口返回的内容,让离线状态下也能读取缓存的查询结果;
- 对于POST请求,你用到的
workbox.backgroundSync插件并不是用来缓存数据的——它的核心作用是在离线时把POST请求暂存到IndexedDB,等网络恢复后自动重试提交,这和你要的"缓存查询数据"是完全不同的需求,这可能是你之前混淆的关键点。
2)具体实现方案及代码示例
场景一:缓存Back4App的GET查询数据
如果你的核心需求是缓存Back4App返回的查询结果(比如https://parseapi.back4app.com/classes/YourTargetClass这类GET请求),推荐使用StaleWhileRevalidate策略(优先用缓存快速响应,同时后台悄悄更新缓存),如果是不常变化的数据,也可以用CacheFirst策略。需要注意跨域请求的配置,以及确保响应允许被缓存。
// 注册缓存Back4App GET查询请求的路由 workbox.routing.registerRoute( // 精准匹配Back4App的classes GET请求 ({url, request}) => { return url.origin === 'https://parseapi.back4app.com' && url.pathname.startsWith('/classes/') && request.method === 'GET'; }, // 使用StaleWhileRevalidate策略,兼顾响应速度和数据新鲜度 new workbox.strategies.StaleWhileRevalidate({ cacheName: 'back4app-query-cache', // 自定义缓存名称,方便后续调试 plugins: [ // 只缓存HTTP状态码为200的成功响应 new workbox.cacheableResponse.CacheableResponsePlugin({ statuses: [200], }), // 设置缓存过期时间,比如7天自动清理旧缓存 new workbox.expiration.ExpirationPlugin({ maxAgeSeconds: 7 * 24 * 60 * 60, }), ], }), );
场景二:修复POST请求的Background Sync(离线重试)
你之前的代码逻辑方向是对的,但可能因为没触发离线场景或者配置细节问题,导致IndexedDB里没看到队列数据。以下是完善后的代码,同时附上验证方法:
// 初始化Background Sync插件,配置重试规则 const bgSyncPlugin = new workbox.backgroundSync.Plugin('back4app-post-queue', { maxRetentionTime: 24 * 60, // 最多重试24小时 // 可选:添加重试回调,方便调试 onSync: async ({queue}) => { let entry; while (entry = await queue.shiftRequest()) { try { await fetch(entry.request); console.log('Back4App POST请求重试成功'); } catch (error) { console.error('Back4App POST请求重试失败,重新放回队列:', error); await queue.unshiftRequest(entry); throw error; } } }, }); // 注册POST请求的路由,使用networkOnly+Background Sync组合 workbox.routing.registerRoute( ({url, request}) => { return url.origin === 'https://parseapi.back4app.com' && url.pathname.startsWith('/classes/') && request.method === 'POST'; }, new workbox.strategies.NetworkOnly({ plugins: [bgSyncPlugin], // 跨域请求必须配置mode为cors fetchOptions: { mode: 'cors', }, }), );
关键验证与注意事项
- 如何确认缓存生效:
- GET缓存验证:打开Chrome DevTools → Application → Cache Storage,找到你设置的
back4app-query-cache,查看是否有缓存的请求条目; - Background Sync验证:打开Chrome DevTools → Application → IndexedDB → workbox-background-sync → QueueStore,离线状态下发送POST请求后,这里会出现队列条目,恢复网络后会自动执行重试。
- GET缓存验证:打开Chrome DevTools → Application → Cache Storage,找到你设置的
- 运行环境要求:Workbox的Service Worker和Background Sync功能必须在HTTPS环境下运行(localhost开发环境除外);
- 响应头兼容:如果Back4App返回的GET响应带有
no-cache或no-store的Cache-Control头,可能会影响缓存,这时候可以通过CacheableResponsePlugin强制缓存200状态的响应。
内容的提问来源于stack exchange,提问作者nacheal
相关产品推荐
相关产品推荐

