SVGO logo

SVGO

SVG 优化工具,通过清理无用元素、压缩属性和路径来减小 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/
  • GitHubhttps://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)的插件化架构:

  1. XML 解析层:使用 SAX 解析器将 SVG 解析为 XAST 树
  2. 插件执行层:按顺序执行配置的插件,每个插件遍历和修改 XAST 树
  3. 序列化层:将优化后的 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) => {}
    }
  })
};

工作原理

  1. 解析阶段:SVG 文本 → SAX 解析 → XAST 树
  2. 优化阶段:遍历 XAST 树,应用所有插件(可配置多次迭代)
  3. 序列化阶段:优化后的 XAST 树 → SVG 文本

核心特性

  • 插件化架构:20+ 内置插件,按需组合配置
  • preset-default:经过调优的默认插件集,开箱即用
  • multipass 优化:多次迭代优化,获得更好的压缩效果
  • 路径数据优化:压缩 SVG path 的 d 属性(如 M10 10L20 20M10 10l10 10
  • CSS 内联与压缩:将 <style> 中的 CSS 内联到元素属性并压缩
  • ID 清理和去重:移除无用的 ID,缩短 ID 名称
  • 编辑器数据清理:移除 Illustrator、Figma 等工具生成的元数据
  • 自定义插件支持:支持编写自定义优化逻辑
  • 多版本支持:v2/v3/v4 同时维护,平滑迁移
  • 浏览器可用:支持在浏览器中运行(通过 svgo/browser 导入)

生态图

关键依赖

依赖版本用途
css-tree^3.0.1CSS AST 解析
csso^5.0.5CSS 优化和压缩
css-select^5.1.0CSS 选择器匹配
sax^1.5.0XML/SVG 解析
commander^11.1.0CLI 命令行解析
picocolors^1.1.1终端颜色输出

构建工具集成

工具集成方式说明
webpackimage-minimizer-webpack-plugin通过插件集成 SVGO
Vitevite-plugin-imagemin / vite-plugin-svg-iconsVite 生态支持
Parcel内置支持@parcel/optimizer-svgo
Astroastro:assets内置 SVG 优化
SVGR@svgr/coreReact SVG 组件生成时优化
Rolluprollup-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

工程化最佳实践

  1. 使用 preset-default:默认预设经过充分测试,覆盖大部分场景
  2. 启用 multipass:多次迭代优化获得更好效果
  3. 保留 viewBox:v4 默认保留 viewBox,确保 SVG 可缩放
  4. 保留 title:v4 默认保留 &lt;title&gt;,确保可访问性
  5. 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 可能包含 &lt;script&gt; 标签,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 场景)
  ]
};

技术对比

与同类工具对比

特性SVGOsvgomgclean-csscssnano
优化目标SVG 文件SVG 文件(GUI)CSSCSS
处理方式AST + 插件SVGO 封装正则 + ASTPostCSS 插件
插件系统✅ 丰富❌ 无❌ 无✅ PostCSS
路径优化✅ 专业✅(基于 SVGO)
CLI 支持❌(仅 Web)
编程 API
可视化界面

与 SVG 压缩方案对比

方案压缩率速度安全性可定制性
SVGO30%-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']
      }
    }
  ]
};

常见陷阱

  1. 覆盖默认插件集:指定 plugins 会完全覆盖默认预设
// 错误:丢失了 preset-default
module.exports = {
  plugins: ['prefixIds']  // 只有 prefixIds,其他优化全丢
};
 
// 正确:包含 preset-default
module.exports = {
  plugins: [
    { name: 'preset-default' },
    'prefixIds'
  ]
};
  1. 过度优化:移除 viewBox 导致 SVG 无法正确缩放
  2. ID 冲突:多个 SVG 合并时 ID 重复
  3. 忽略可访问性:移除 &lt;title&gt;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' }
        ]
      }
    }
  ]
};

技术局限与边界

已知限制

  1. 不处理 SVG 动画:不支持 SMIL 动画优化
  2. 不修改路径形状:只压缩路径数据表示,不改变图形
  3. 字体处理有限:不能嵌入或优化 SVG 中的字体
  4. 光栅化不支持:不能将 SVG 转换为位图
  5. 复杂 CSS 支持有限:对于复杂的 CSS 选择器和动画可能处理不当

不适用场景

  • SVG 动画优化:需要使用专门工具
  • SVG 到 PNG/JPG 转换:需要 Cairo、librsvg 等渲染引擎
  • 实时 SVG 编辑:SVGO 是优化工具,不是编辑器
  • 非标准 SVG 处理:某些非标准 SVG 扩展可能不被正确处理

权衡取舍

  • 压缩率 vs 可读性:高度压缩的 SVG 难以手动编辑
  • 优化速度 vs 压缩效果:multipass 效果更好但更慢
  • 安全性 vs 功能:移除 &lt;script&gt; 等可能影响交互功能

迁移注意事项

从 v3 迁移到 v4:

// v3 配置
module.exports = {
  plugins: [
    { name: 'preset-default' },
    { name: 'removeScriptElement' }  // v3 插件名
  ]
};
 
// v4 配置(注意插件重命名)
module.exports = {
  plugins: [
    { name: 'preset-default' },
    { name: 'removeScripts' }  // v4 重命名,功能增强
  ]
};

学习资源

官方文档

教程

社区资源

2026 年现状

最新版本

SVGO 在 2026 年处于活跃开发状态:

  • v4.0.1(2026-03-04):修复 CVE-2026-29074 安全漏洞
  • v3.3.3:安全补丁分支
  • v2.8.2:旧版安全补丁

发展趋势

  1. 安全性优先:快速响应安全漏洞,多条版本线同步修复
  2. Node.js 要求提升:v4 要求 Node.js ≥ 16
  3. ESM 支持完善:完全支持 ESM 和 CommonJS
  4. 浏览器支持改进:通过 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 性能优化中继续扮演关键角色。