You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Workbox CacheFirst策略缓存Giphy GIF离线访问失败求助

解决Giphy GIF在Workbox CacheFirst策略下离线无法加载的问题

这不是Workbox的Bug,问题根源在于跨域资源的缓存处理逻辑。Giphy的GIF属于跨域资源,当Service Worker尝试缓存它时,浏览器会返回一个「opaque响应」(这是浏览器对无CORS头的跨域资源的特殊处理方式),而Workbox默认不会将这种响应视为可缓存的有效资源——哪怕你在线时看起来缓存成功了,离线时也无法正确读取它。

修复方案

修改你的Workbox路由配置,添加workbox.cacheableResponse.Plugin插件,明确允许缓存状态码为0的opaque响应:

workbox.routing.registerRoute(
  /.*\.(?:png|jpg|jpeg|svg|webp|gif)/,
  new workbox.strategies.CacheFirst({
    cacheName: "images",
    plugins: [
      // 新增:允许缓存opaque响应(状态码0)和成功响应(状态码200)
      new workbox.cacheableResponse.Plugin({
        statuses: [0, 200]
      }),
      new workbox.expiration.Plugin({
        maxEntries: 60,
        maxAgeSeconds: 2592000,
        purgeOnQuotaError: false
      })
    ]
  }),
  'GET'
);

原理说明

  • 对于没有配置CORS的跨域资源,浏览器会将其响应标记为opaque,状态码显示为0(而非常规的200)。
  • Workbox的缓存策略默认只缓存状态码为200的响应,所以需要显式添加0到允许的状态列表中,让它认可这种opaque响应是可缓存的。
  • 添加这个配置后,在线时Service Worker会正确缓存Giphy的GIF,离线时就能从images缓存中读取并返回资源了。

最后检查一下:确保你的Service Worker在HTTPS环境下运行(本地开发用localhost是例外),并且在线刷新页面后,能在Chrome DevTools的Application > Cache Storage中看到Giphy的GIF条目已经被缓存。

内容的提问来源于stack exchange,提问作者David Dal Busco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:58:52