【问题标题】:Performance of Font Awesome字体真棒的表现
【发布时间】:2021-10-16 07:42:51
【问题描述】:

一家网络开发公司为我开发了一个网站,它使用了 Font Awesome 5.15.3 中的 12 个图标。他们使用 SVG 和 JavaScript。使用 Google PageSpeed Insights 后,我发现 Font Awesome JavaScript 成为了性能瓶颈。

然后我找到"Performance & Font Awesome"。但这并没有提供有关每种方法的太多信息。我尝试联系支持人员,但现在没有收到任何回复。所以我自己尝试用这些方法进行测试,比如 SVG Sprites 和单独的 SVG 图标,同时分享我对每种方法在性能上的优缺点的理解。

注意:我只会考虑我host Font Awesome on my own server的情况。

  1. SVG with JavaScript:根据我在 Chrome DevTools 中的调试,似乎 javascript 代码只是找到类似的模式并将它们替换为相应的 svg 图标。如果整个页面的 DOM 树很大,这将非常耗时。另外,如果可以手动将 SVG 图标插入该位置,为什么还要费心让 JavaScript 来完成这项任务呢?我想有3个原因:

一个。 <i class="fas fa-camera"></i> 很短(仅 29 个字符)并且比使用单个 SVG 图标(通常为 500 字节)或 SVG Sprites(3 行共 88 个字符)更方便使用。 湾。它不会使源 HTML 页面膨胀太多。 C。只有多次使用同一个图标才好,如下所示:

  1. 带有 CSS 的网页字体

在这种方法中,需要包含带有@font-face 规则的Font Awesome 字体文件。而大的 Font Awesome 字体文件的下载将成为性能的瓶颈。据我所知,如果我只使用 1000 个图标中的 16 个图标,则无法创建仅包含现有图标中的 16 个图标的新字体文件。

  1. SVG Sprites:这种方法对我来说似乎很棒。我可以创建一个只包含我需要的 16 个图标的小 svg 文件。然后使用以下方式将其包含在 HTML 页面中:
        <svg>
          <use xlink:href="fa-brands.svg#facebook"></use>
        </svg>

虽然它需要 3 行而不是 1 行(带有 JS 的 SVG)。即使图标被多次使用,它仍然很短。我想这种方法的缺点是一个计划使用很多图标,例如 100 个图标。在这种情况下,svg文件会很大,下载时会成为性能瓶颈。

另一个缺点可能是在 SVG Sprite 文件中搜索,这需要一些时间,因为 SVG Sprite 文件中的各个图标没有以任何方式被索引。

  1. 单个 SVG 图标:将 SVG 图标数据嵌入 HTML 源代码将是提高性能的最有效方式。但是每个 SVG 图标文件大约 500 字节到 3KB,这会使 HTML 文件大大膨胀。另外,在页面中多次使用图标也是不好的,这样的话,HTML源会变得很大。

此外,“浏览器无法缓存内联 SVG,因为它会缓存常规图像资源,因此在加载包含图像的第一页后,包含图像的页面将不会更快地加载。”基于https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Adding_vector_graphics_to_the_Web

  1. SVG + CSS:这个方法在 Font Awesome 中没有提到,但是被广泛使用。请参阅 https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Adding_vector_graphics_to_the_Web 了解将 SVG 添加到网页的不同方法,包括 SVG + CSS。

请告知我的理解是否正确。非常感谢!

更新:

我在他们的网站上发现了一个有趣的比较:Web Fonts vs SVG

更新 2

我添加了另一种使用 SVG + CSS 的流行方法

【问题讨论】:

  • 老实说,我会选择 svg sprites。即使你有一百个图标,它也只是纯文本,如果它在一个单独的文件中,它将被缓存,等等......
  • @AmauryHanser,非常感谢您分享您的意见。

标签: javascript css svg fonts font-awesome


【解决方案1】:

根据我自己的个人经验,我可以告诉你,我更喜欢使用 12 个图标的方法,而不是其他任何方法。当并非所有主要浏览器都很好地执行 svg 标准时,Web 字体是很好的解决方案。但是今天,当你只使用 12 个图标时,使用臃肿的图标字体是无稽之谈。如果您希望能够衡量离开字体并改用 svg 图标的影响,请查看我自己的网站的性能和速度https://www.simbiosis-dg-apps.com。我告诉你,除了我和我的搭档的 2 张照片之外,你会看到的其他所有东西都是 svg。有时嵌入到 html 中,大部分时间通过 img 标签调用。对于图标,我使用了一种类似的方法,例如用于从图标字体设置图标但使用我自己的 css 系统的方法。如果想要更好的图片,请参阅此答案How to Replace the Web Font with SVG icon in CSS(Font Awesome)?

【讨论】:

  • alancc,我直到现在才意识到这两个问题都是你问的。请放心,使用 svg 方法将比任何其他方法好一千倍
  • 非常感谢。在这种情况下,我应该使用 SVG Sprites 还是直接将单个 SVG 图标嵌入 HTML 源代码?
  • 使用精灵是一个很好的解决方案(我不喜欢它,因为定位每个图标的额外工作,也可能是资源消耗,因为整个 svg 将被渲染只是为了在某个位置使用单个图标)但我更喜欢使用我所说的通过 i 标签调用的单个图标。在我对你其他问题的回答中看到它,这里有代码示例
  • 非常感谢。你提供的是另一种方法 CSS + SVG Icon,Font Awesome 官网没有提到,但尝试起来很有趣。
  • 这是一种摆脱图标字体及其所有警告的方法。它允许您只使用所需的图标数量。结果:重量更轻,从服务器获取资产时过载更少,性能更快。但是,如果您想继续使用图标字体,这取决于您。至少我可以说我的 PageSpeed Insights 从未显示出我的项目的任何瓶颈。
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
相关资源
最近更新 更多