跳到主要内容
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 字节的元数据块,或者缩短八位小数的坐标 - 那些内容仍然要被压缩和解压,在传输中仍然要花掉字节。

有问题吗? 报告问题

指南与文章