Skip to content
Technical

Optimización SVG para desarrolladores: SVGO, pipelines de build e integración CI/CD

Optimización SVG enfocada en desarrolladores: configurar SVGO, integrar en pipelines webpack/Vite, automatizar con CI/CD y medir el impacto en Core Web Vitals.

Robin Monteiro28 de enero de 202610 de octubre de 202616 min de lectura
Use this article with an AI assistant:
.md
Optimización SVG para desarrolladores: SVGO, pipelines de build e integración CI/CD
R
Robin Monteiro

Founder of VectoSolve

Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.

How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author

Image vectorizationCutting machine filesEmbroidery filesSVG
Free previewNo signupFull-quality output

Key Takeaways

  • SVGO con un svgo.config.js ajustado reduce el tamaño de archivos SVG un 60-85% sin pérdida visual
  • La simplificación de rutas (precisión decimal + nodos redundantes) es la optimización de mayor impacto
  • La optimización agresiva rompe animaciones CSS y currentColor — siempre prueba después de SVGO
  • Gzip reduce otro 70-80%; Brotli exprime un 5-8% más encima
  • Lazy loading con Intersection Observer elimina el costo de renderizado fuera de pantalla
  • La integración en el pipeline de build (Vite, webpack, Next.js) hace la optimización invisible para tu equipo

Los archivos SVG son la columna vertebral de los gráficos web modernos — escalables, estilizables, animables y típicamente más pequeños que las alternativas raster. Pero un SVG mal optimizado exportado desde Figma o Illustrator puede ser más pesado que un PNG y hundir tus Core Web Vitals.

He pasado ocho años enviando SVGs a producción. Esta es la guía que me hubiera gustado tener el primer día.

Flujo de optimización SVG desde la exportación hasta producción
El pipeline completo de optimización SVG: exportar, limpiar, optimizar, comprimir, entregar

Por qué la optimización SVG es una partida del presupuesto de rendimiento

Un SVG sin optimizar puede contener metadatos del editor, rutas redundantes con 12 decimales de precisión, estilos inline repetidos, definiciones de gradiente/filtro sin usar y XML superfluo como xml:space. Una auditoría real: una ilustración hero de 52KB bajó a 7.8KB tras la optimización — 85% de reducción.

Impacto en Core Web Vitals: La optimización SVG mejora directamente el LCP (Largest Contentful Paint) para SVGs sobre el fold y reduce el TBT al recortar nodos DOM. La actualización de Page Experience de Google pondera mucho el LCP — quitar 40KB de un SVG hero puede mover el LCP 200-400ms en 3G. Si sirves SVGs sin optimizar, estás dejando señales de ranking sobre la mesa.

Configuración de SVGO paso a paso

SVGO es el optimizador estándar de la industria. Los valores por defecto dejan rendimiento sobre la mesa. Necesitas una configuración ajustada.

CLI vs API Node

bash
# CLI -- archivos puntuales y scripts CI
npx svgo input.svg -o output.svg --config svgo.config.js

# Optimización por lotes de un directorio
npx svgo -f ./src/icons -o ./dist/icons --config svgo.config.js
javascript
// API Node -- integración en pipeline de build
import { optimize } from 'svgo';
import { readFileSync, writeFileSync } from 'fs';

const result = optimize(readFileSync('icon.svg', 'utf8'), {
  multipass: true,
  plugins: [
    'preset-default',
    'removeDimensions',
    { name: 'removeAttrs', params: { attrs: '(data-.*|class)' } },
  ],
});
writeFileSync('icon.opt.svg', result.data);

svgo.config.js de producción

javascript
module.exports = {
  multipass: true,
  plugins: [
    {
      name: 'preset-default',
      params: {
        overrides: {
          removeViewBox: false,
          convertPathData: { floatPrecision: 2, transformPrecision: 3 },
          mergePaths: { force: true },
        },
      },
    },
    'removeDimensions',
    'sortAttrs',
    { name: 'removeAttrs', params: { attrs: ['xml:space', 'data-name'] } },
  ],
};

Pro Tip: Mejores prácticas de svgo.config.js para producción: Siempre pon removeViewBox: false — quitarlo rompe el escalado responsive. Pon floatPrecision: 2 para iconos, 3 para ilustraciones detalladas. Activa multipass: true para que cada pasada desbloquee más optimizaciones. Commitea tu config en el repo para que cada desarrollador y cada ejecución CI use la misma configuración.

Antes/Después: Eliminando metadatos y peso del editor

Cada herramienta de diseño incrusta su huella:

xml
<!-- ANTES: 680 bytes de desperdicio -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     version="1.1" id="Layer_1" x="0px" y="0px" width="200px" height="200px"
     viewBox="0 0 200 200" style="enable-background:new 0 0 200 200;"
     xml:space="preserve">
  <!-- Generator: Adobe Illustrator 28.0 -->
  <metadata><rdf:RDF><rdf:Description/></rdf:RDF></metadata>
  <defs><linearGradient id="unused_grad">...</linearGradient></defs>
xml
<!-- DESPUÉS: limpio, listo para producción -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">

Eliminados: version, dimensiones fijas, xml:space, enable-background, comentarios del generador, metadatos vacíos, defs sin usar. 680 bytes ahorrados en un icono pequeño — multiplica eso por un sprite de 40 símbolos.

Reducción de nodos de ruta mostrando antes y después
48 puntos de control reducidos a 19 — visualmente idénticos a la resolución de pantalla

A Full Year of Conversions for $49

Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime

Get the Annual Deal

Simplificación de rutas: Reducir nodos sin pérdida visual

Las rutas concentran la mayoría de bytes SVG. Los diseñadores crean rutas con cientos de nodos donde docenas bastan.

xml
<!-- ANTES: precisión de 12 decimales -->
<path d="M10.123456789012 20.987654321098 C15.111111111111 25.222222222222
  30.333333333333 40.444444444444 45.555555555555 50.666666666666"/>

<!-- DESPUÉS: precisión de 2 decimales, visualmente idéntico -->
<path d="M10.12 20.99C15.11 25.22 30.33 40.44 45.56 50.67"/>

¿Diferencia visual a resolución de pantalla? Cero. ¿Ahorro de bytes? 58%. Usa el editor SVG de VectoSolve para inspeccionar visualmente la reducción de nodos.

Comparación de técnicas de optimización

TécnicaReducción de tamañoNivel de riesgoCuándo usar
Eliminar metadatos y comentarios5-15%NingunoSiempre — cero impacto visual
Reducir precisión decimal (2-3)15-30%BajoIconos, elementos UI, logos
Fusionar y simplificar rutas10-25%MedioDespués de verificación visual QA
Eliminar defs y símbolos sin usar5-20%BajoSiempre — código muerto
Colapsar grupos y contenedores3-8%BajoCuando CSS no apunta a grupos
Convertir estilos inline a atributos2-10%BajoPara SVGs inline en HTML
Compresión Gzip (servidor)70-80%NingunoSiempre
Compresión Brotli (servidor)75-85%NingunoCuando el CDN lo soporte

CSS en SVG: Inline vs hojas de estilo externas

xml
<!-- Estilos inline: inflados, pero autocontenidos -->
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>

<!-- <style> consolidado: más ligero, autocontenido -->
<style>.a{fill:#f00;stroke:#000;stroke-width:2}</style>
<path class="a" d="..."/>
<path class="a" d="..."/>

<!-- Atributos de presentación: más ligero, ideal para SVG inline -->
<path fill="#f00" stroke="#000" stroke-width="2" d="..."/>

Para SVGs inline, usa atributos de presentación — sobreescribibles con CSS externo, sin problemas de scope. Para archivos independientes, los bloques <style> funcionan bien.

Warning: La optimización agresiva rompe las animaciones. Si tu SVG usa animaciones CSS, currentColor, listeners JS o SMIL: removeHiddenElems elimina los targets de animación, collapseGroups destruye las transformaciones de grupo, cleanupIds renombra los IDs que tu CSS/JS referencia, y removeUselessStrokeAndFill elimina los strokes de estado hover. Siempre prueba los SVGs optimizados en contexto.

Free SVG Tools for Crafters

Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG

Check Your SVG Free

Estadísticas de compresión Gzip y Brotli

SVG es XML — se comprime espectacularmente:

AssetCrudoSVGOGzipBrotli
Ilustración hero52KB7,8KB2,4KB2,1KB
Sprite de iconos (40 iconos)38KB11KB3,2KB2,8KB
Logo animado18KB9,2KB3,1KB2,7KB
Infografía compleja124KB34KB9,8KB8,6KB

Brotli supera a Gzip un 5-15% en SVG. Cloudflare, Vercel y Netlify lo soportan de serie.

"

Cada kilobyte que envías es un kilobyte que el navegador de tu usuario debe descargar, parsear y renderizar. Los SVGs optimizados no son un nice-to-have — son una partida del presupuesto de rendimiento.

— Addy Osmani

Lazy Loading de páginas con muchos SVGs

Si tu página tiene más de 20 SVGs debajo del fold, no los cargues todos en el primer render:

javascript
const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
}, { rootMargin: '200px' });

document.querySelectorAll('img[data-src$=".svg"]').forEach(img => observer.observe(img));

El rootMargin de 200px da ventaja al navegador. Cero layout shift, cero ancho de banda desperdiciado.

Desarrollador integrando SVGs en un pipeline de build
SVGO se ejecuta automáticamente en cada commit a través del pipeline de build

Integración en pipeline de build: Webpack, Vite, Next.js

La optimización manual no escala. Conecta SVGO a tu herramienta de build.

Vite

javascript
import svgLoader from 'vite-svg-loader';
export default defineConfig({
  plugins: [svgLoader({
    svgoConfig: { multipass: true, plugins: ['preset-default', 'removeDimensions'] },
  })],
});

Webpack

javascript
{ test: /\.svg$/, use: [
  { loader: 'svg-url-loader', options: { limit: 8192 } },
  { loader: 'svgo-loader', options: { configFile: './svgo.config.js' } },
]}

Next.js

javascript
config.module.rules.push({
  test: /\.svg$/,
  use: ['@svgr/webpack', {
    loader: 'svgo-loader',
    options: { configFile: './svgo.config.js' },
  }],
});

Con la integración en el pipeline, la optimización ocurre en tiempo de build. Sin pasos manuales, sin archivos olvidados.


A Full Year of Conversions for $49

Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime

Get the Annual Deal

La checklist de optimización completa

  1. Exporta limpio desde tu herramienta de diseño
  2. Ejecuta SVGO con una config commiteada — o optimiza con VectoSolve para un flujo visual
  3. Verifica visualmente — compara antes/después, especialmente animaciones
  4. Activa la compresión — Gzip mínimo, Brotli si el CDN lo soporta
  5. Lazy load los SVGs debajo del fold con Intersection Observer
  6. Automatiza en CI — SVGO en tu pipeline para que nada se envíe sin optimizar

¿Necesitas convertir imágenes raster a SVG optimizado? VectoSolve gestiona la vectorización y la optimización en un solo paso. O usa el editor SVG para control detallado de rutas y calidad de salida.


¿Preguntas o historias de guerra de optimización? Escríbenos a contact@vectosolve.com.


Técnica de optimizaciónReducción de tamaño típicaNivel de riesgo
SVGO con config ajustada60–85%Bajo (con pruebas)
Reducción de precisión decimal (8 → 2)20–40%Bajo para gráficos simples
Eliminar metadatos del editor10–30%Ninguno
Simplificación de rutas15–50%Medio (puede alterar curvas)
Compresión Brotli (servidor)75–90% tamaño de transferenciaNinguno (sin pérdida)

Fuentes y lecturas adicionales

  • web.dev: Image Optimization — Guía de referencia de Google sobre optimización SVG y compresión para rendimiento web
  • MDN Web Docs: SVG — Referencia técnica sobre sintaxis de rutas SVG y atributos de elementos objetivo de la optimización
  • CSS-Tricks: Optimizing SVG — Tutoriales prácticos de configuración SVGO y ejemplos de optimización antes/después
  • W3C SVG 2 Specification — Especificación oficial para entender qué atributos SVG son seguros de eliminar
Tags:
svg
optimización
rendimiento web
frontend
tutorial
Share:

Try VectoSolve Now

Convert your images to high-quality SVG vectors with AI

AI-Powered Vectorization

Ready to vectorize your images?

Convert your PNG, JPG, and other images to high-quality, scalable SVG vectors in seconds.