跳到主要内容
ConvertOwl

压缩 SVG:看清每一个字节去了哪里

多数 SVG 优化工具只给你一个数字:小了 42%。而那个数字恰好掩盖了你真正需要知道的事:这些百分点里,有多少来自删掉没人会想念的缩进,又有多少来自四舍五入坐标或丢掉无障碍标签。这个工具会针对你的文件,为每一步报出一个字节数,并允许你关掉其中任何一步。它完全在你自己设备上的一个 Web Worker 里运行,这是我们 SVG 工具里唯一能做到这一点的,因为优化是纯文本处理,中间不涉及任何渲染。不上传任何东西;而且无论你要不要,净化器都会先在每个文件上跑一遍,因为这个工具会把 SVG 源码交还给你,而你接下来会把它粘贴进页面。

如何使用此工具

  1. 放入你的 SVG 文件

    把一个或多个 SVG 拖到上方方框里,每个最大 5 MB。每个文件按内容而非文件名检查;如果它其实不是 SVG,或者携带实体展开攻击载荷,会以明确的理由被拒绝。

  2. 选择要执行哪些步骤

    十二个开关,除一个之外全部默认开启。删除 <title> 元素刻意保持关闭,因为那正是屏幕阅读器为你的图形念出的内容,打开它,面板会就地提醒你,而不是以标签为代价悄悄省下四十个字节。

  3. 设定坐标精度

    滑块控制路径数据中保留多少位小数,默认三位。在编辑器导出的文件上,这往往是单项最大的节省,因为 Illustrator 会把坐标写到八位小数,描述的位置比任何打印机能分辨的还要精细。

  4. 优化并对比

    每个文件都会并排显示原始版本和优化后的版本。如果这两张缩略图有任何差别,就说明某一步破坏了什么,这道视觉检查存在的意义,正是让你永远不必凭信任接受结果。

  5. 复制或下载

    把优化后的源码直接复制到剪贴板以便内联粘贴,或者作为文件下载。转换了多个文件时,可以打包成一个 ZIP 一次取走。

常见问题

我的文件实际上能小多少?

这完全取决于文件从哪里来,其影响远大于画的是什么。我们测了四个:一个 Illustrator 风格的导出从 1,091 字节降到 401 字节,小了 63%。一个 Figma 风格的导出从 730 降到 525,小了 28%。Lucide 的下载图标只有 4%,我们自己的站点徽标更是只有 2%。

为什么那个图标几乎没变小?

因为它在到我们手里之前就已经优化过了。那个 Lucide 文件是 291 字节的纯几何数据,没有注释、没有元数据、没有编辑器属性,坐标也很短,优化器根本找不到任何能在不改变画面的前提下删掉的东西。好的图标库交付的文件本来就已经贴着下限。

哪一步省得最多?

在那个 Illustrator 导出上:删除元数据块省了 216 字节,坐标取整省 131,注释省 94,默认属性省 61,未使用的定义省 51,XML 声明省 38,转换 style 属性省 29。而在 Figma 导出上情况完全不同,省下的 205 字节中,有 141 字节仅仅来自未使用的定义。

为什么 Figma 会在文件里留下这么多没用的东西?

因为它导出的是自己内部使用的图层结构。画框和图层名会变成没有任何东西引用的 id 属性,而为画板定义的剪切路径和渐变,也常常残留在一个根本不指向它们的文件里。这些 id 在文件里就是死重量,删掉它们是 Figma 导出上单项最大的收益。

删除 ID 安全吗?

几乎总是安全的,但有一个例外值得知道。我们只删除文件里没有任何东西引用的 id,并且会检查 url(#…) 的值、href 属性以及 <style> 内部的 CSS。我们看不到的是你页面上针对那个 id 的外部 CSS 或 JavaScript,如果你从外部给一个内联 SVG 设样式或写脚本,请关掉这一步。

我该删除 <title> 元素吗?

通常不该,这也是它成为唯一默认关闭的那一步的原因。<title> 是图形的无障碍名称:屏幕阅读器念出的就是它,没有它,这张图对任何没在看屏幕的人来说就是匿名的。而节省通常只有几十个字节,这笔交易并不划算。

坐标取整会破坏我的图形吗?

对普通图稿而言,三位小数不会。在一个 24 单位的图标上,三位小数相当于其宽度的约四万分之一,任何显示器或打印机都显示不出来。如果在很小的 viewBox 上把滑块拉到零位小数,你会看到形状发生跳变,每个文件旁边的预览正是为了抓住这种情况。

我怎么知道优化后的文件看起来还是一样的?

有两条途径。每个文件都并排显示优化前后的缩略图;此外我们的测试套件会把若干真实导出文件的两个版本都栅格化,逐像素比较,最多只允许几级抗锯齿偏移。任何会改变画面的步骤,在发布之前就会在这项比较中被拦下。

为什么不直接用 svgo?

它的浏览器打包版会拖进一整棵 CSS 解析器和一套我们只会用到十分之一的插件架构,而这些会落到每一位访问本页的用户头上。这里的实现只包含在真实场景中带来大部分收益的那些步骤,别的一概没有,所以整个优化器只在你放入文件时才下载。

这个工具会删掉我 SVG 里的脚本和跟踪代码吗?

会,而且这一步不是可选的。脚本、事件处理器、远程图片引用和外部样式表导入都会从每个文件中剥离,面板会列出它找到了什么。这一点在这里比在我们其他 SVG 工具里更重要,因为这个工具会把源码交还给你,去粘贴进你自己的页面。

有了 gzip,这一切还有意义吗?

有,只是差距会缩小。你的服务器几乎必然会在传输时对 SVG 做 gzip 或 brotli,而压缩确实很擅长处理重复的缩进。它做不到的是删掉一个 216 字节的元数据块,或者缩短八位小数的坐标,那些内容仍然要被压缩和解压,在传输中仍然要花掉字节。

有问题吗? 报告问题

指南与文章