内联 SVG 与 SVG 文件性能

Posted

技术标签:

【中文标题】内联 SVG 与 SVG 文件性能【英文标题】:Inline SVG vs SVG File Performance 【发布时间】:2014-06-06 06:27:30 【问题描述】:

我目前正在构建一个针对现代浏览器和移动设备的网站。在性能方面,使用<svg> 直接在html 内内联SVG 更好还是使用<img> 和/或背景图像更好。我在服务器上运行 gzip 以进一步压缩我的内容,并且不想依赖 javascript

【问题讨论】:

我认为您没有标记元素的 html 源代码,因为它们在您的问题中是空白的。 你是对的,谢谢你注意到这一点。 【参考方案1】:

内联的优点:

更少的 http 请求; 您可以使用 css 填充属性并更改颜色; Svg是内容的一部分,所以可以点击,也可以插入文字;

单独文件的优点:

可以缓存Svg文件; 您没有在文件中看到多行不相关的代码; 如果以后需要更改,只需更改一个文件;

【讨论】:

因此,如果我只需要更改 svg 的高度,我可以使用源自 svg 文件的 并更改 img 的高度,还是我做错了? 可以缓存Svg文件; >> HTML 也可以被缓存。您不会在文件中看到多行不相关的代码; >> 你可以让一个文件分离文件给它一个名字,就像你给 svg 一样,并使用 include for php 将它导入你想要的地方。如果您稍后需要更改它,那么您只需更改一个文件; >> 见上文。 @RoyvanWensen html 比图像更频繁地更改,因此最好单独缓存图像。此外,您在不同的 html 页面中使用相同的 svg 图标,因此您只需要缓存一次。 另外,如果您内联您的 SVG,则需要在浏览器获取后续内容之前下载它。而如果它是外部资源,浏览器可以并行下载它并控制优先级。对于微型 SVG,这种区别并不重要。 @JaffaTheCake - 你的意思是类似于 CSS 或 JS,内联 SVG 是阻塞资源吗?【参考方案2】:

没有通用的方法。这实际上取决于很多事情,但这里有一些可以单独使用或组合使用的基本策略。

如果我们有:

少量 SVG,每个文件大小

大量

任意数量的大于 5k 的大 SVG,假设我们不需要通过 CSS 或 JS 访问 SVG 属性。然后<img src="name.svg">

任意数量的 SVG,但我们确实需要使用 CSS 来更改 SVG 属性,或者让一些 SVG 属性设置动画。唯一可行的选择是内联 svg。

如果我们需要 SVG(s) 作为背景,但它们每个都小于 5k:

.bg background: url('data:image/svg+xml;utf8,<svg ...> ... </svg>');

如果我们需要 SVG(s) 作为背景,但它们每个都大于 5k:

.bg background: url('images/file.svg');

我从来没有机会尝试将 SVG sprite 作为背景,但这也是一种选择

【讨论】:

关于 .css 文件中的 SVG,即 ... background: url('data:image/svg ... — 是您建议对 > 5k SVG 不这样做的原因,然后,如果 CSS 更改,所有 > 5k SVG 都将被下载再次与修改后的CSS一起?还是您也有其他原因? — 感谢您的详细回答:-) 15 是不是很小的数字?此外,“任何小数乘以 1k 都比相同数量的附加请求要好,无论是否缓存。”这是否意味着 15 * 1k 比一个 15k 的请求更好?非常感谢。 除非您处于几乎为 0 延迟的实验室网络中,否则即使一个 100K 请求也比 10 个 10K 请求好得多。存在用于 Apache Http 代理和其他模块的模块,它们基本上“内联”源服务器上大量的 href 资源,然后将组合响应传输到用户代理。除非您可以依赖这样的网络设备,否则上面推荐的策略是一个不错的策略。干杯!【参考方案3】:

内联 SVG 会减少 HTTP 请求的数量,因此它应该会在有人第一次访问时加快页面加载速度。但缺点是您的 SVG 不会缓存在浏览器中,因此每次都必须加载它。我会说如果你只使用几个 SVG(比如 10 个左右),内联它们;但如果你有很多,请使用 img+background-image。

您可能还想考虑使用 SVG 定义并使用 SVG use 标签来引用 SVG 定义。这个方法很不错;特别是如果您需要在页面中多次重复 SVG。有关此技术的更多信息:http://css-tricks.com/svg-sprites-use-better-icon-fonts/

My web app 还可以帮助您轻松制作这些 SVG 定义和使用对。

【讨论】:

【参考方案4】:

Claudiu Creanga,您在大多数方面是正确的,但在最后一个方面不是:)

关于文件SRC:“如果您以后需要更改它,则只需更改一个文件;”

该文件也可以是单独的 SVG,也可以是内联文件。例如,只需通过 PHP 包含 XML/文本源:

<?php include_once($_SERVER['DOCUMENT_ROOT'] . '/img/icon-home.svg'); ?>

我使用这种策略是因为我在我的图标上制作 CSS3 动画。这样,您就有了用于在矢量程序中修改的原始参考文件,并且简单的上传将修复所有内联代码。如果您只是重新排列或操作它们,SVG 中的对象和路径 ID 不会改变。

【讨论】:

【参考方案5】:

能够缓存 SVG 是将它们作为图像包含的一个重要原因。我喜欢做的是使用 CSS 掩码将它们包括在内 - 对我来说,这是真实图像和更改图标颜色的能力之间的完美结合,就像它是内联 SVG 一样。这导致图标可以通过 CSS 类轻松控制,可以自定义,并且完全不会使代码臃肿。

此方法的参考:https://equinusocio.dev/blog/accessible-icon-buttons-with-masks-and-svg/

【讨论】:

以上是关于内联 SVG 与 SVG 文件性能的主要内容,如果未能解决你的问题,请参考以下文章

将内联SVG转换为SVG文件

如何将带有css样式的内联SVG从浏览器保存/导出到图像文件

如何将内联 svg(在 DOM 中)绘制到画布上?

为啥 SVG 视图框属性仅适用于内联 SVG?

是否可以使用 CSS 缩放内联 SVG? [复制]

如何使用 webpack 设置内联 svg