1. Composants SVG en ligne
Convertir chaque icône en composant (l’approche que ce site automatise) offre un contrôle total : les icônes héritent de la couleur via currentColor, acceptent des props comme size et className et peuvent être animées en CSS ou avec une bibliothèque d’animation. Les bundlers éliminent les composants inutilisés (tree shaking), vous n’envoyez donc que les icônes importées.
En contrepartie, le balisage fait partie de votre bundle JavaScript. Pour quelques dizaines de petites icônes, c’est négligeable ; pour des centaines d’illustrations complexes, ça ne l’est plus.
2. Balises img et arrière-plans CSS
<img src="/logo.svg" alt="Entreprise"> est l’option la plus simple, et le navigateur peut mettre le fichier en cache. En revanche, le SVG est isolé de votre CSS : impossible de changer sa couleur au survol ou en mode sombre. Réservez-la aux logos et illustrations qui ne changent jamais.
3. SVGR et loaders au moment du build
SVGR (via @svgr/webpack ou vite-plugin-svgr) convertit les imports .svg en composants au moment du build. C’est pratique pour de gros dossiers d’icônes, mais cela ajoute de la configuration et peut se comporter différemment selon les bundlers ou avec Turbopack. Une conversion unique avec cet outil produit le même type de composant, versionné comme du code source.
4. Sprites SVG et 5. bibliothèques d’icônes
Un sprite regroupe de nombreux éléments <symbol> dans un fichier et les référence avec <use href="#icone">. Il allège le HTML mais complique le rendu côté serveur. Les bibliothèques comme Lucide, Heroicons ou Phosphor fournissent des composants prêts à l’emploi, idéaux si leur style correspond à votre design.
Quelle que soit la méthode choisie, respectez ces règles d’accessibilité :
- Les icônes décoratives placées à côté d’un texte reçoivent aria-hidden="true".
- Les icônes autonomes, comme un bouton composé uniquement d’une icône, ont besoin d’un nom accessible via aria-label sur le bouton ou d’un <title> dans le SVG.
- Conservez un viewBox et dimensionnez les icônes en em ou rem pour qu’elles suivent la taille de police de l’utilisateur.
- Garantissez un rapport de contraste d’au moins 3:1 pour les icônes porteuses de sens (WCAG 1.4.11).