如何预缓存 css 字体规则使用的字体,该规则在其 URL 值中包含查询参数?

How to precache a font that is used by css font-face rule that includes a query parameter in its URL value?

我正在使用 Workbox(V5),在我的 workbox-config.js 中,我预先缓存了字体 (.woff.woff2 格式),这是我正在使用的第 3 方 CSS 样式所需的,通过为 globPatterns 属性 指定:

// workbox-config.js

module.exports = {
  globDirectory: './',
  globPatterns: [
    '**/*.{html,ico,woff,woff2}',
  ],
  globIgnores: [
    'node_modules/**/*',
    '{.,_}*/**/*',
    '**/*.{md,txt}',
    'Gemfile*',
    'package*',
  ],
  additionalManifestEntries: [
    {
      url: './manifest.webmanifest',
      revision: null, // I have also precached my manifest file like this. Is it the best practice?
    },
  ],
  swDest: './sw.js',
  sourcemap: false,
};

现在在第 3 方的 .css 文件中,我可以看到所需的字体正在使用 @font-face 规则在其 URL 值中包含一个查询参数:

@font-face {
  font-family: "bootstrap-icons";
  src: url("./fonts/bootstrap-icons.woff?4601c71fb26c9277391ec80789bfde9c") format("woff"),
       url("./fonts/bootstrap-icons.woff2?4601c71fb26c9277391ec80789bfde9c") format("woff2");
}

好吧,如果我删除已添加到 URL 的生成的哈希,当我 运行 我的 PWA 离线时,预缓存的字体显示得很好......但是当样式正在调用带有哈希的字体,预缓存的字体将不会显示!

我还尝试在 HTML 文件的 head 标记中预缓存字体,并为 .woff 和 [=30 执行 运行timeCaching =].woff2 格式而不是通过 globPatterns 属性 预缓存它们,但仍然没有运气!

<link rel="preload" as="font" href="./assets/styles/vendor/fonts/bootstrap-icons.woff" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="./assets/styles/vendor/fonts/bootstrap-icons.woff2" type="font/woff2" crossorigin="anonymous">

所以我想知道我们该如何解决这个问题?

非常感谢, 阿里

您可以在生成 Service Worker 时使用 ignoreURLParametersMatching 配置选项来告诉 workbox-precaching 在检查缓存匹配时可以忽略某些 URL 参数。

该参数采用 RegExp 的数组,默认为 [/^utm_/, /^fbclid$/],匹配一些常见的分析跟踪参数。

在您的特定情况下,听起来您想忽略的值都是 32 个十六进制字符,因此以下配置应该有所帮助:

// workbox-config.js

module.exports = {
  ignoreURLParametersMatching: [/^[0-9a-f]{32}$/],
  // ...other options go here...
};