SVG → React: del archivo bruto al componente listo para usar

SVG → React: del archivo bruto al componente listo para usar

Convierte iconos SVG en componentes React/JSX, optimízalos con SVGO e intégralos con limpieza en tu design system.

21.07.2026
10 min de lectura
Compartir este artículo:
SVG
react
jsx
frontend
components
Tutorial

Por qué pasar del SVG en bruto al componente React

Pegar un SVG inline en JSX suele romper en el primer build: atributos HTML (`class`, `stroke-width`) incompatibles, etiquetas `<style>` difíciles de mantener, tamaño de archivo inflado por una exportación de Figma. El convertidor SVG a JSX en línea transforma un archivo `<svg>` en un componente React listo para copiar — con renombrado de atributos (`className`, `strokeWidth`), nombre de componente personalizable y opción TypeScript. Todo el workflow se ejecuta en el navegador en el hub de herramientas SVG, sin cuenta ni subida al servidor. Para el contexto de optimización, consulta también el artículo SVGO presets explicados.

Conversión SVG → componente funcional React en un clic
Atributos SVG mapeados a la sintaxis JSX (className, fillRule…)
Opciones: nombre del componente, export default, TypeScript
Optimiza primero con optimize-svg, convierte después
Procesamiento 100 % local — ideal para assets de clientes sensibles

Ejemplo: icono UI en un design system

Antes / después en el repo

Un icono 24×24 exportado desde Figma puede pesar 3–6 KB en SVG en bruto. Tras optimize default, a menudo 1–2 KB — el componente JSX generado puede ser un poco más pesado (~2 KB) por el wrapper React. El JSX sigue siendo legible gracias al embellecedor SVG en línea sobre el markup intermedio si necesitas auditar los paths.

Before optimization

Tamaño de archivos
SVG fuente ~4,8 KB

After optimization

Tamaño de archivos
optimize ~1,9 KB · componente JSX ~2,1 KB
Impacto del bundler (contexto ligero)

Cada componente de icono importado se incluye en el chunk JavaScript de tu app — a diferencia de un archivo `.svg` servido como estático. Es el trade-off habitual de React; el minificador JavaScript en línea ilustra la compresión del lado JS, pero la primera línea de defensa sigue siendo un SVG fuente ligero antes de convertir.

Buenas prácticas: props, className y accesibilidad

Styling con className y currentColor

El convertidor mapea `class` → `className` y los atributos kebab-case SVG a camelCase React. Para un theming coherente, edita el SVG fuente o el JSX para usar `fill="currentColor"` y controlar el color vía CSS/Tailwind en el componente padre.

Preferir `currentColor` a hex fijos para iconos UI
width/height → clases utilitarias en lugar de píxeles fijos
Spread props: `<svg {...props} className={cn('h-5 w-5', props.className)}>`
No contar con los `<style>` internos — se excluyen del JSX
beautify-svg para releer el markup tras ediciones manuales
Accesibilidad: decorativo vs informativo

Un icono solo junto a una etiqueta de texto es decorativo → `aria-hidden="true"` en el `<svg>`. Un icono que porta el sentido (p. ej. estado de error sin texto) debe conservar `<title>` / `<desc>` o un `aria-label` explícito. FastMinify conserva title/desc en optimize; comprueba que sobrevivan a la conversión.

Decorativo: `aria-hidden` + texto adyacente visible
Informativo: title/desc o aria-label en el componente
validate-svg sobre el SVG fuente antes de jsx
Artículo: accesibilidad SVG (hub SVG)
No eliminar viewBox — requerido para el escalado responsive
Trampas habituales tras la conversión

Nombres de componente inválidos (`icon-arrow`) → repliegue silencioso a `SvgIcon` (la herramienta señala el fallback). XML inválido o varias raíces → error de parsing. IDs duplicados si inlineas varias veces el mismo componente sin sprite.

Siempre PascalCase para componentName
Una sola raíz `<svg>` por archivo
Probar el renderizado en la página destino, no solo en Storybook
Versionar el `.svg` fuente + el `.tsx` generado
Reconvertir tras cada cambio de diseño, no parchear el JSX a mano

Cuándo basta la herramienta del navegador

Casos de uso frecuentes

No hace falta instalar SVGR para convertir un icono recibido por Slack o una exportación puntual de Figma.

Prototipar un componente de icono antes de añadirlo al repo
Desbloquear a un dev front sin acceso a Node / CI
Comparar el JSX generado con una exportación SVGR existente
Formar a un diseñador sobre lo que llega a producción
One-shot antes de un PR de design system

Límites: SVGR y plugins del bundler

Lo que el navegador no sustituye

La conversión en línea es ideal para explorar y entregar unos cuantos componentes. El import automático `import Icon from './icon.svg'` en cada build, el batch sobre una carpeta `icons/` y las plantillas SVGR custom siguen siendo cosa de `@svgr/cli`, `@svgr/webpack` o `vite-plugin-svgr`.

Generar cientos de componentes desde una carpeta de assets
Plantilla custom (memo, forwardRef, index barrel)
Hook pre-commit: svg → tsx en cada modificación
Config de equipo versionada en svgr.config.js
Plugins fuera de las opciones FastMinify (svgo inline en SVGR)
Alinear preview del navegador y pipeline

Valida nombre, export y estructura JSX en svg-to-jsx, luego reproduce las mismas convenciones en SVGR. Optimiza con el mismo preset SVGO que en CI — consulta el artículo SVGO presets y la guía de optimización SVG.

Documentar componentName y export en el README de icons
Mismo preset optimize en local y en CI
Tests snapshot para iconos críticos
No mezclar jsx generado a mano y SVGR sin convención
Hub SVG como referencia de herramientas para el equipo

SVGR y ecosistema React

Herramientas complementarias

FastMinify svg-to-jsx cubre el caso pegar → copiar JSX con tres opciones. El ecosistema npm ofrece más flexibilidad para la automatización.

@svgr/cli

Línea de comandos SVGR — referencia para batch y CI.

Ventajas:
Batch de un directorio entero
Plantillas y config `.svgrrc`
Integración pre-commit nativa
Inconvenientes:
Instalación Node requerida
Curva de aprendizaje de config/plugins

vite-plugin-svgr / @svgr/webpack

Importar SVG como componente React en la compilación.

Ventajas:
Automático en cada import
Coherente con el workflow del bundler
Sin paso manual para los devs
Inconvenientes:
Menos visible para comparar el JSX en bruto
Depurar la conversión es más difícil sin herramienta en línea

FastMinify optimize-svg + svg-to-jsx

Cadena en el navegador optimize → convert, sin instalación.

Ventajas:
Privacy-local, cero config
Opciones componentName / TypeScript explícitas
Perfecto para one-shot y revisión visual
Inconvenientes:
Sin batch de cientos de archivos
Edición manual para spread props y a11y avanzada

SVG inline, `<img>` o componente React?

Tres formas de mostrar un SVG

La elección impacta el styling, la accesibilidad y el tamaño del bundle JavaScript. Un componente React encaja con iconos reutilizados en un design system; el inline puntual o `<img src="icon.svg">` sigue siendo válido para casos simples.

Inline en bruto: rápido pero atributos no React, difícil de versionar
`<img>` / asset estático: sin `currentColor`, caché HTTP simple
Componente React: props, theming, tree-shaking con el bundler
Sprite `<symbol>`: bueno para decenas de iconos estáticos
Componente + optimize SVGO: mejor ratio tamaño / mantenibilidad
Cuándo un componente React merece la pena

Iconos UI (botones, navegación), logos tematizables (`fill="currentColor"`), o assets compartidos entre varias apps React/Next.js. El componente encapsula el markup y evita duplicar 200 líneas de `<path>` en cada página.

Design system con variantes de color / tamaño
Iconos animados o interactivos (hover vía className)
Biblioteca interna `@company/icons`
Storybook para preview aislada
Exportar desde Figma → optimize → svg-to-jsx → PR
Lo que la conversión no sustituye

svg-to-jsx produce JSX a partir del markup existente. No resuelve los imports `@use` Sass, los partials multiarchivo ni la generación automática en cada commit — para eso, SVGR en CI sigue siendo pertinente. La herramienta en línea destaca para prototipar, corregir una exportación u onboardear a un diseñador.

Sin resolución de `@import` entre archivos SVG
Las etiquetas `<style>` embebidas se ignoran en la exportación JSX
Se requiere un único elemento raíz `<svg>`
El parámetro `props` se genera pero no se fusiona en el `<svg>` — edición manual si hace falta
Complementar con validate-svg para title/desc antes de entregar

Workflow FastMinify: optimize y luego svg-to-jsx

Paso 1 — Limpiar y optimizar el SVG fuente

Una exportación de Illustrator o Figma suele incluir metadatos y una precisión excesiva. Pasa primero por el optimizador SVGO en línea (preset safe o default para iconos UI), o el minificador SVG para una limpieza solo de espacios. Reduces el tamaño del componente final sin tocar el workflow React.

optimize-svg: presets safe / default / aggressive
minify-svg: espacios y comentarios únicamente
beautify-svg: releer el markup antes de convertir
Conservar title/desc si el icono es informativo
Comparar las stats before/after en la herramienta
Paso 2 — Convertir con svg-to-jsx

Pega el SVG optimizado en la herramienta SVG a JSX. Elige el nombre del componente (debe empezar por mayúscula — si no, se usa `SvgIcon`), export default o nombrado, y TypeScript si tu codebase está en `.tsx`.

componentName: p. ej. `ChevronIcon`, `LogoMark`
exportDefault: `true` para import default, `false` para export nombrado
typescript: añade las anotaciones `React.SVGProps` / `JSX.Element`
Pegar o cargar un archivo (límite mostrado en la herramienta)
Copiar el JSX y pegarlo en tu repo
Paso 3 — Integrar en el design system

Tras copiar, envuelve si hace falta: fusiona `props` en el `<svg>` (`{...props}`), añade `aria-hidden` para iconos decorativos, o `role="img"` + `aria-label` para los informativos. Valida con validate SVG en línea sobre el markup fuente antes de convertir.

Spread `{...props}` en la raíz `<svg>` para className/size
Sustituir fill fijo por `currentColor` si hay theming
Quitar width/height fijos → sizing CSS (`className="h-5 w-5"`)
Probar renderizado en Storybook + snapshot visual
Hub SVG para los pasos siguientes (Data URI, viewer…)

Conclusión

El camino más seguro hacia un componente React mantenible: optimizar el SVG fuente, convertir a JSX con opciones explícitas y luego ajustar props y accesibilidad en tu design system. FastMinify encadena optimize-svg y svg-to-jsx enteramente en el navegador — ideal para prototipar antes de fijar SVGR en CI.

Convierte tu SVG en un componente React

Optimize (safe/default) antes de svg-to-jsx en las exportaciones de Figma
PascalCase para componentName — evitar el repliegue SvgIcon
Fusionar props y aria en el `<svg>` después de copiar
validate-svg en los iconos informativos
SVGR en CI una vez validado el componente en el navegador
Compartir este artículo
Compartir este artículo: