我应该如何配置工作箱以支持第三方请求的离线缓存?

How should I configure workbox to support offline caching of third party requests?

我目前正在使用 workbox-build 模块,特别是 generateSW 模式,来生成我的服务工作者脚本,以将我的 Web 应用程序部署到 Netlify。我的站点是静态站点。

这是我的工人-config.js:

module.exports = {
    globDirectory: '_site/',
    globPatterns: [
        '**/*.{html,iml,css,xml,eot,svg,ttf,woff,woff2,jpg,webp,png,ico,xcf,js,json,txt}'
    ],
    swDest: 'sw.js',
    ignoreURLParametersMatching: [
        /^utm_/,
        /^fbclid$/
    ],
    offlineGoogleAnalytics: true,
    mode: 'production',
    navigateFallback: '/index.html'
};

此配置适合在线使用。但是,第三方对某些资产(即图像、Javascript 等)的请求未成功预缓存以供离线使用。 Netlify 将经过优化和缩小过程的资产部署到他们的 CloudFront CDN 中。我没有其他可行的选择,只能对 Javascript、HTML 和图像资产使用 Netlify 优化和缩小过程。不幸的是,这些 CDN 资产没有预缓存。因此,在没有网络访问权限的情况下使用我的 Web 应用程序的用户不会发现这些预缓存的 CDN 资产,也不会像其他非 CDN 资产一样加载到缓存中。

在使用 workbox-build 模块时,我需要做什么来确保第三方 CDN 资产被正确预缓存?我绝对想保持简单,我希望解决方法是对 work-config.js 文件进行简单更改。

由于您事先不知道 URL,因此在构建时,您唯一的选择是使用运行时缓存来匹配对 URL 的请求,并应用特定的缓存策略来生成响应。

您可以在“Smarter runtime caching of hashed assets”中阅读一些 gotchas/best 实践,但总结是您需要对运行时缓存采用某种过期策略,以便以避免在添加新 URL 时您的缓存无限期地填满。

以下是如何配置 generateSW 以添加到 runtimeCaching,使用更基本的 ExpirationPlugin 控制缓存大小的方法:

module.exports = {
  // ...other options...
  runtimeCaching: [{
    urlPattern: ({url}) => url.origin === 'https://d33wubrfki0l68.cloudfront.net',
    handler: 'CacheFirst',
    options: {
      cacheName: 'cdn-assets',
      expiration: {
        // Adjust the number of entries to keep as needed.
        maxEntries: 50,
      },
    }
  }],
  clientsClaim: true,
};

您应该注意,使用运行时缓存时,资产不会开始添加到缓存中,直到后续访问,即服务工作人员首次注册后,因为它们中的大部分已经被加载service worker 控制的时间。使用 clientsClaim: true 会导致第一次注册的 service worker 立即控制注册它的页面,这增加了一些在运行时加载的资产可能被缓存的机会,但一般来说,它只是下一个最终将填充缓存的导航。