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.

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
Key Takeaways
-
SVGO con un
svgo.config.jsajustado 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.
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
# 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
// 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
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:
<!-- 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>
<!-- 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.
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 DealSimplificació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.
<!-- 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écnica | Reducción de tamaño | Nivel de riesgo | Cuándo usar |
|---|---|---|---|
| Eliminar metadatos y comentarios | 5-15% | Ninguno | Siempre — cero impacto visual |
| Reducir precisión decimal (2-3) | 15-30% | Bajo | Iconos, elementos UI, logos |
| Fusionar y simplificar rutas | 10-25% | Medio | Después de verificación visual QA |
| Eliminar defs y símbolos sin usar | 5-20% | Bajo | Siempre — código muerto |
| Colapsar grupos y contenedores | 3-8% | Bajo | Cuando CSS no apunta a grupos |
| Convertir estilos inline a atributos | 2-10% | Bajo | Para SVGs inline en HTML |
| Compresión Gzip (servidor) | 70-80% | Ninguno | Siempre |
| Compresión Brotli (servidor) | 75-85% | Ninguno | Cuando el CDN lo soporte |
CSS en SVG: Inline vs hojas de estilo externas
<!-- 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 FreeEstadísticas de compresión Gzip y Brotli
SVG es XML — se comprime espectacularmente:
| Asset | Crudo | SVGO | Gzip | Brotli |
|---|---|---|---|---|
| Ilustración hero | 52KB | 7,8KB | 2,4KB | 2,1KB |
| Sprite de iconos (40 iconos) | 38KB | 11KB | 3,2KB | 2,8KB |
| Logo animado | 18KB | 9,2KB | 3,1KB | 2,7KB |
| Infografía compleja | 124KB | 34KB | 9,8KB | 8,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.
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:
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.
Integración en pipeline de build: Webpack, Vite, Next.js
La optimización manual no escala. Conecta SVGO a tu herramienta de build.
Vite
import svgLoader from 'vite-svg-loader';
export default defineConfig({
plugins: [svgLoader({
svgoConfig: { multipass: true, plugins: ['preset-default', 'removeDimensions'] },
})],
});
Webpack
{ test: /\.svg$/, use: [
{ loader: 'svg-url-loader', options: { limit: 8192 } },
{ loader: 'svgo-loader', options: { configFile: './svgo.config.js' } },
]}
Next.js
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 DealLa checklist de optimización completa
- Exporta limpio desde tu herramienta de diseño
- Ejecuta SVGO con una config commiteada — o optimiza con VectoSolve para un flujo visual
- Verifica visualmente — compara antes/después, especialmente animaciones
- Activa la compresión — Gzip mínimo, Brotli si el CDN lo soporta
- Lazy load los SVGs debajo del fold con Intersection Observer
- 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ón | Reducción de tamaño típica | Nivel de riesgo |
|---|---|---|
| SVGO con config ajustada | 60–85% | Bajo (con pruebas) |
| Reducción de precisión decimal (8 → 2) | 20–40% | Bajo para gráficos simples |
| Eliminar metadatos del editor | 10–30% | Ninguno |
| Simplificación de rutas | 15–50% | Medio (puede alterar curvas) |
| Compresión Brotli (servidor) | 75–90% tamaño de transferencia | Ninguno (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