1. Componentes SVG en línea
Convertir cada icono en un componente (el enfoque que automatiza este sitio) te da control total: los iconos heredan el color mediante currentColor, aceptan props como size y className y se pueden animar con CSS o con una librería de animación. Los bundlers eliminan los componentes no usados (tree shaking), así que solo envías los iconos que importas.
La contrapartida es que el marcado pasa a formar parte del bundle de JavaScript. Con unas decenas de iconos pequeños es insignificante; con cientos de ilustraciones complejas, no.
2. Etiquetas img y fondos CSS
<img src="/logo.svg" alt="Empresa"> es la opción más sencilla y el navegador puede almacenar el archivo en caché. Sin embargo, el SVG queda aislado de tu CSS, así que no puedes cambiar su color al pasar el ratón ni en modo oscuro. Úsalo para logotipos e ilustraciones que no cambian.
3. SVGR y loaders en tiempo de compilación
SVGR (mediante @svgr/webpack o vite-plugin-svgr) convierte los imports de .svg en componentes al compilar. Es cómodo para carpetas de iconos grandes, pero añade configuración al build y puede comportarse de forma distinta según el bundler o con Turbopack. Convertir una vez con esta herramienta produce el mismo tipo de componente como código fuente que puedes versionar.
4. Sprites SVG y 5. librerías de iconos
Un sprite reúne muchos elementos <symbol> en un archivo y los referencia con <use href="#icono">. Mantiene el HTML ligero, pero complica el renderizado en servidor. Librerías como Lucide, Heroicons o Phosphor ofrecen componentes ya hechos y son ideales cuando su estilo encaja con tu diseño.
Elijas el método que elijas, sigue estas reglas de accesibilidad:
- Los iconos decorativos junto a un texto llevan aria-hidden="true".
- Los iconos independientes, como un botón que solo tiene icono, necesitan un nombre accesible mediante aria-label en el botón o un <title> dentro del SVG.
- Mantén el viewBox y dimensiona los iconos en em o rem para que escalen con el tamaño de letra del usuario.
- Asegura una relación de contraste de al menos 3:1 en los iconos con significado (WCAG 1.4.11).