SVGO
SVG 优化工具,通过清理无用元素、压缩属性和路径来减小 SVG 文件体积
基于 Node.js 的 SVG 文件优化工具,采用插件化架构,默认 preset 包含 20+ 个优化插件,可将设计工具生成的 SVG 文件体积减小 30%-70%,是 SVG 优化领域的事实标准。
SVGO
SVG 优化工具,通过清理无用元素、压缩属性和路径来减小 SVG 文件体积
技术简介说明
SVGO(SVG Optimizer)是一个基于 Node.js 的 SVG 文件优化工具,由 Kir Belevich(又名 deepsweet)创建。它通过移除编辑器产生的无用信息、注释、隐藏元素、冗余属性等,显著减小 SVG 文件的体积。SVG 文件通常包含大量由设计工具(如 Illustrator、Figma、Sketch)生成的冗余数据,SVGO 可以将这些文件体积减小 30%-70%。
SVGO 的核心设计理念是插件化架构。所有的优化操作都由独立的插件完成,用户可以根据需求自由组合和配置插件。默认的 preset-default 包含了 20 多个经过精心调优的插件,覆盖了绝大多数优化场景。用户可以禁用特定插件或添加自定义插件,实现高度定制化的优化流程。
截至 2026 年,SVGO 已发布 v4.0.1 版本,持续活跃维护。它是 SVG 优化领域的事实标准工具,被 webpack、Vite、Parcel、Astro、SVGR 等主流构建工具广泛集成。
基本信息
- 官网:https://svgo.dev/
- GitHub:https://github.com/svg/svgo
- License:MIT
- 最新版本:v4.0.1(2026-03-04);v3.3.3(安全补丁)
- 主要维护者/公司:Seth Falco(v4 主导)、Bogdan Chadkin(v2/v3 主导)、Kir Belevich(原作者)
快速上手
安装
# 全局安装 CLI
npm install -g svgo
# 项目依赖安装
npm install svgo
# 使用 npx 运行(无需安装)
npx svgo input.svg -o output.svg基础配置
创建 svgo.config.js 配置文件:
// svgo.config.js
module.exports = {
multipass: true, // 多次优化迭代
plugins: [
{
name: 'preset-default',
params: {
overrides: {
// 禁用特定插件
removeViewBox: false,
removeTitle: false,
}
}
},
// 添加额外插件
'prefixIds',
{
name: 'removeAttrs',
params: {
attrs: ['data-name', 'fill']
}
}
]
};最小示例
# CLI 基本使用
svgo input.svg
# 指定输出文件
svgo input.svg -o output.svg
# 批量处理目录
svgo -f ./svg-files -o ./optimized
# 指定配置
svgo --config=svgo.config.js input.svg
# 显示优化前后大小对比
svgo --pretty input.svg// JavaScript API 使用
import { optimize } from 'svgo';
import fs from 'fs';
const svgContent = fs.readFileSync('input.svg', 'utf8');
const result = optimize(svgContent, {
plugins: [
'preset-default'
]
});
fs.writeFileSync('output.svg', result.data);
console.log(`优化前: ${svgContent.length} bytes`);
console.log(`优化后: ${result.data.length} bytes`);
console.log(`节省: ${((1 - result.data.length / svgContent.length) * 100).toFixed(1)}%`);核心概念与架构
核心架构
SVGO 采用基于 XAST(XML Abstract Syntax Tree)的插件化架构:
- XML 解析层:使用 SAX 解析器将 SVG 解析为 XAST 树
- 插件执行层:按顺序执行配置的插件,每个插件遍历和修改 XAST 树
- 序列化层:将优化后的 XAST 树序列化为 SVG 字符串
插件系统
SVGO 的核心是其实用 Visitor 模式的插件系统:
// 自定义插件示例
export default {
name: 'myCustomPlugin',
description: '自定义优化插件',
fn: (root, params, info) => ({
// 进入元素节点时调用
element: {
enter: (node, parentNode) => {
// 修改节点属性
if (node.name === 'circle') {
node.attributes.fill = 'none';
}
},
exit: (node, parentNode) => {
// 离开节点时调用
}
},
// 处理注释节点
comment: {
enter: (node) => {
// 删除特定注释
}
},
// 处理文本节点
text: {
enter: (node) => {}
}
})
};工作原理
- 解析阶段:SVG 文本 → SAX 解析 → XAST 树
- 优化阶段:遍历 XAST 树,应用所有插件(可配置多次迭代)
- 序列化阶段:优化后的 XAST 树 → SVG 文本
核心特性
- 插件化架构:20+ 内置插件,按需组合配置
- preset-default:经过调优的默认插件集,开箱即用
- multipass 优化:多次迭代优化,获得更好的压缩效果
- 路径数据优化:压缩 SVG path 的 d 属性(如
M10 10L20 20→M10 10l10 10) - CSS 内联与压缩:将
<style>中的 CSS 内联到元素属性并压缩 - ID 清理和去重:移除无用的 ID,缩短 ID 名称
- 编辑器数据清理:移除 Illustrator、Figma 等工具生成的元数据
- 自定义插件支持:支持编写自定义优化逻辑
- 多版本支持:v2/v3/v4 同时维护,平滑迁移
- 浏览器可用:支持在浏览器中运行(通过
svgo/browser导入)
生态图
关键依赖
| 依赖 | 版本 | 用途 |
|---|---|---|
| css-tree | ^3.0.1 | CSS AST 解析 |
| csso | ^5.0.5 | CSS 优化和压缩 |
| css-select | ^5.1.0 | CSS 选择器匹配 |
| sax | ^1.5.0 | XML/SVG 解析 |
| commander | ^11.1.0 | CLI 命令行解析 |
| picocolors | ^1.1.1 | 终端颜色输出 |
构建工具集成
| 工具 | 集成方式 | 说明 |
|---|---|---|
| webpack | image-minimizer-webpack-plugin | 通过插件集成 SVGO |
| Vite | vite-plugin-imagemin / vite-plugin-svg-icons | Vite 生态支持 |
| Parcel | 内置支持 | @parcel/optimizer-svgo |
| Astro | astro:assets | 内置 SVG 优化 |
| SVGR | @svgr/core | React SVG 组件生成时优化 |
| Rollup | rollup-plugin-svgo | 社区插件 |
相关工具
- SVGOMG:基于 SVGO 的在线可视化工具(https://jakearchibald.github.io/svgomg/)
- SVGR:将 SVG 转换为 React 组件,内部使用 SVGO 优化
- svg-sprite-loader:SVG 雪碧图工具,集成 SVGO
社区生态
- GitHub Stars:约 22,500+
- npm 周下载量:数百万次(2022 年数据:660 万+/周)
- 依赖项目:2,387+ 个 npm 包直接依赖
- 文档站:svgo.dev(Docusaurus 构建)
适用场景
- 设计工具导出优化:清理 Figma、Illustrator、Sketch 导出 SVG 中的冗余数据
- Web 性能优化:减小 SVG 文件体积,提升页面加载速度
- 图标系统:优化图标库中的 SVG 文件,减小打包体积
- React/Vue SVG 组件:配合 SVGR 等工具优化 SVG 组件
- 构建流水线:作为 webpack/Vite/Parcel 构建流程的一部分
- CMS 内容优化:优化用户上传的 SVG 图片
- 批量 SVG 处理:批量优化项目中的 SVG 资源
开发与工程化
开发流程
# 创建自定义插件
mkdir my-svgo-plugin
cd my-svgo-plugin
npm init -y
# 编写插件
cat > index.js << 'EOF'
export default {
name: 'myPlugin',
type: 'perItem', // 或 'full'
fn: (item, params, info) => {
// 优化逻辑
return item;
}
};
EOF配置文件格式
SVGO v3/v4 支持的配置文件格式:
// svgo.config.js(CommonJS)
module.exports = { /* ... */ };
// svgo.config.mjs(ESM)
export default { /* ... */ };
// svgo.config.cjs(强制 CommonJS)
module.exports = { /* ... */ };CI/CD 集成
# GitHub Actions 示例
name: Optimize SVGs
on: [push]
jobs:
optimize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npx svgo -f public/icons -o public/icons-optimized
- run: |
# 检查是否有变化
if git diff --quiet public/icons; then
echo "No changes"
else
echo "SVGs were optimized"
fi工程化最佳实践
- 使用 preset-default:默认预设经过充分测试,覆盖大部分场景
- 启用 multipass:多次迭代优化获得更好效果
- 保留 viewBox:v4 默认保留 viewBox,确保 SVG 可缩放
- 保留 title:v4 默认保留
<title>,确保可访问性 - prefixIds:多个 SVG 合并时,使用
prefixIds插件避免 ID 冲突
性能与安全
性能特点
- 处理速度:单个 SVG 文件处理通常在几毫秒内完成
- multipass:多次迭代会增加处理时间,但压缩效果更好
- 内存占用:极低,SVG 文件通常很小
- 并发处理:CLI 默认并行处理多个文件
安全注意事项
CVE-2026-29074(严重):
- 类型:DoS(拒绝服务)— XML 实体展开攻击(Billion Laughs)
- 影响范围:v2.1.0 至 v4.0.0 之前的所有版本
- 修复版本:v4.0.1、v3.3.3、v2.8.2
- 建议:立即升级至 v4.0.1
# 检查当前版本
svgo --version
# 升级到最新版本
npm install svgo@latest其他安全注意事项
- SVG 中的脚本:SVG 可能包含
<script>标签,SVGO 默认不移除。使用removeScripts插件(v4 新增)清理 - 外部实体:SVG 可能引用外部资源,需要额外处理
- XSS 风险:渲染不受信任的 SVG 时,确保清理脚本和事件处理器
优化建议
// 生产环境推荐配置
module.exports = {
multipass: true,
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false, // 保留 viewBox
removeTitle: false, // 保留 title(可访问性)
}
}
},
'removeScripts', // 移除脚本(v4)
'prefixIds', // ID 前缀(多 SVG 场景)
]
};技术对比
与同类工具对比
| 特性 | SVGO | svgomg | clean-css | cssnano |
|---|---|---|---|---|
| 优化目标 | SVG 文件 | SVG 文件(GUI) | CSS | CSS |
| 处理方式 | AST + 插件 | SVGO 封装 | 正则 + AST | PostCSS 插件 |
| 插件系统 | ✅ 丰富 | ❌ 无 | ❌ 无 | ✅ PostCSS |
| 路径优化 | ✅ 专业 | ✅(基于 SVGO) | ❌ | ❌ |
| CLI 支持 | ✅ | ❌(仅 Web) | ✅ | ✅ |
| 编程 API | ✅ | ❌ | ✅ | ✅ |
| 可视化界面 | ❌ | ✅ | ❌ | ❌ |
与 SVG 压缩方案对比
| 方案 | 压缩率 | 速度 | 安全性 | 可定制性 |
|---|---|---|---|---|
| SVGO | 30%-70% | 极快 | ✅ 经过验证 | ✅ 插件系统 |
| 手动优化 | 高 | 慢(人工) | 取决于操作者 | 完全自定义 |
| 在线工具 | 30%-60% | 快 | 需上传文件 | 有限 |
| 构建工具集成 | 30%-70% | 快 | ✅ | 取决于集成 |
最佳实践
生产环境配置
// svgo.config.js — 生产环境推荐配置
module.exports = {
multipass: true,
plugins: [
{
name: 'preset-default',
params: {
overrides: {
// v4 已默认禁用,显式声明更清晰
removeViewBox: false,
removeTitle: false,
// 如果不需要保留 ID
cleanupIds: true,
}
}
},
// 移除脚本和事件处理器(v4)
'removeScripts',
// 排序属性以获得更好的 gzip 压缩
{
name: 'sortAttrs',
params: {
order: ['id', 'width', 'height', 'x', 'y', 'cx', 'cy', 'd']
}
}
]
};常见陷阱
- 覆盖默认插件集:指定
plugins会完全覆盖默认预设
// 错误:丢失了 preset-default
module.exports = {
plugins: ['prefixIds'] // 只有 prefixIds,其他优化全丢
};
// 正确:包含 preset-default
module.exports = {
plugins: [
{ name: 'preset-default' },
'prefixIds'
]
};- 过度优化:移除 viewBox 导致 SVG 无法正确缩放
- ID 冲突:多个 SVG 合并时 ID 重复
- 忽略可访问性:移除
<title>和aria属性
图标优化模式
// 图标优化推荐配置
module.exports = {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false,
cleanupIds: {
remove: true,
minify: true
}
}
}
},
// 移除所有 fill 和 stroke(通过 CSS 控制颜色)
{
name: 'removeAttrs',
params: {
attrs: ['fill', 'stroke', 'style']
}
},
// 设置默认 viewBox
{
name: 'addAttributesToSVGElement',
params: {
attributes: [
{ 'aria-hidden': 'true' }
]
}
}
]
};技术局限与边界
已知限制
- 不处理 SVG 动画:不支持 SMIL 动画优化
- 不修改路径形状:只压缩路径数据表示,不改变图形
- 字体处理有限:不能嵌入或优化 SVG 中的字体
- 光栅化不支持:不能将 SVG 转换为位图
- 复杂 CSS 支持有限:对于复杂的 CSS 选择器和动画可能处理不当
不适用场景
- SVG 动画优化:需要使用专门工具
- SVG 到 PNG/JPG 转换:需要 Cairo、librsvg 等渲染引擎
- 实时 SVG 编辑:SVGO 是优化工具,不是编辑器
- 非标准 SVG 处理:某些非标准 SVG 扩展可能不被正确处理
权衡取舍
- 压缩率 vs 可读性:高度压缩的 SVG 难以手动编辑
- 优化速度 vs 压缩效果:multipass 效果更好但更慢
- 安全性 vs 功能:移除
<script>等可能影响交互功能
迁移注意事项
从 v3 迁移到 v4:
// v3 配置
module.exports = {
plugins: [
{ name: 'preset-default' },
{ name: 'removeScriptElement' } // v3 插件名
]
};
// v4 配置(注意插件重命名)
module.exports = {
plugins: [
{ name: 'preset-default' },
{ name: 'removeScripts' } // v4 重命名,功能增强
]
};学习资源
官方文档
- SVGO 官网:https://svgo.dev/
- GitHub 仓库:https://github.com/svg/svgo
- 插件 API 文档:https://svgo.dev/docs/plugins-api/
- 默认预设文档:https://svgo.dev/docs/preset-default/
- v3→v4 迁移指南:https://svgo.dev/docs/migrations/migration-from-v3-to-v4/
教程
- CSS-Tricks: SVGO 指南:https://css-tricks.com/svgs-and-the-web/
- SVGOMG 在线工具:https://jakearchibald.github.io/svgomg/
- Web.dev SVG 优化:https://web.dev/fast/#optimize-your-images
社区资源
- GitHub Issues:https://github.com/svg/svgo/issues
- GitHub Discussions:https://github.com/svg/svgo/discussions
- Stack Overflow:使用
[svgo]标签提问 - npm 周下载量:数百万次
2026 年现状
最新版本
SVGO 在 2026 年处于活跃开发状态:
- v4.0.1(2026-03-04):修复 CVE-2026-29074 安全漏洞
- v3.3.3:安全补丁分支
- v2.8.2:旧版安全补丁
发展趋势
- 安全性优先:快速响应安全漏洞,多条版本线同步修复
- Node.js 要求提升:v4 要求 Node.js ≥ 16
- ESM 支持完善:完全支持 ESM 和 CommonJS
- 浏览器支持改进:通过
svgo/browser子路径优化浏览器使用
社区活跃度
- GitHub Stars:约 22,500+
- 维护者:Seth Falco 主导 v4 开发
- 安全响应:CVE-2026-29074 在多个版本线快速修复
- 生态集成:webpack、Vite、Parcel、Astro 等主流工具均适配
未来路线图
根据 v4.0.1 发布和 GitHub 活动:
- 持续安全维护:及时修复安全漏洞
- 插件 API 稳定化:提供更稳定的插件开发接口
- 浏览器端优化:改进 WASM 编译支持
- 性能提升:持续优化处理速度和内存占用
SVGO 作为 SVG 优化领域的事实标准,将在 Web 性能优化中继续扮演关键角色。