链接预加载不能避免字体加载重复

Posted

技术标签:

【中文标题】链接预加载不能避免字体加载重复【英文标题】:The link preload is not avoiding the font loading duplication 【发布时间】:2019-06-28 14:59:37 【问题描述】:

我阅读了link preload documentation。在 htmlhead 部分,我有

<link rel="preload" href="/css/fonts/XRXV3I6Li01BKofINeaB.woff2" as="font">

稍后,我加载了一个font.css 文件,其中加载了完全相同的字体文件(检查url):

@font-face 
  font-family: 'Nunito';
  font-style: normal;
  font-weight: 400;
  src: local('Nunito Regular'), local('Nunito-Regular'), url("/css/fonts/XRXV3I6Li01BKofINeaB.woff2") format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;

Chrome 上的错误?

但 Chrome 控制台会发出警告

资源https://autocosts.work/css/fonts/XRXV3I6Li01BKofINeaB.woff2 已使用链接预加载进行预加载,但在窗口加载事件后的几秒钟内未使用。请确保它具有适当的as 值并且是有意预加载的。

实际上浏览器会两次加载同一个文件(第 1 行和第 3 行是指同一个文件)!

如何通过避免文件加载重复来使预加载工作?

【问题讨论】:

假设你的 font.css 在“几秒钟”内被加载,它可能是crbug.com/653088 @wOxxOm 感谢您的回复。似乎字体是一种特殊情况,必须提供跨域。 因此,警告消息和两次字体加载无关,即使字体加载一次并且在合理的时间内未使用,您也会收到此警告 【参考方案1】:

我解决了添加type="font/woff2" crossorigin="anonymous"的问题

<link rel="preload" href="/css/fonts/XRXV3I6Li01BKofINeaB.woff2" as="font" type="font/woff2" crossorigin="anonymous">

Fonts are indeed a special case

如果您的网站的 CORS 设置正确,只要您在元素上设置了 crossorigin 属性,就可以成功预加载跨域资源。

一个有趣的例子是字体文件,即使提取不是跨域的。由于各种原因,这些必须使用匿名模式 CORS 来获取(如果您对所有细节感兴趣,请参阅字体获取要求)。

【讨论】:

以上是关于链接预加载不能避免字体加载重复的主要内容,如果未能解决你的问题,请参考以下文章

使用“预加载”链接指令在 Chrome 中预加载字体

预加载字体真棒

使用 rel preload 预加载字体

我们如何在 Angular 中预加载字体?

预加载、缓存 gif 图像以避免在 React Native 中闪烁

link预加载