Optimisation SVG pour développeurs : SVGO, pipelines de build et intégration CI/CD
Optimisation SVG orientée développeur : configurer SVGO, intégrer dans les pipelines webpack/Vite, automatiser avec CI/CD et mesurer l'impact sur les 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 avec un
svgo.config.jsoptimisé réduit la taille des fichiers SVG de 60 à 85% sans perte visuelle - La simplification des chemins (précision décimale + nœuds redondants) est l'optimisation à plus fort impact
-
L'optimisation agressive casse les animations CSS et
currentColor— testez toujours après SVGO - Gzip réduit encore de 70-80% ; Brotli gagne 5-8% supplémentaires
- Le lazy loading avec Intersection Observer élimine le coût de rendu hors écran
- L'intégration dans le pipeline de build (Vite, webpack, Next.js) rend l'optimisation invisible pour votre équipe
Les fichiers SVG sont la colonne vertébrale des graphiques web modernes — scalables, stylisables, animables, et généralement plus légers que les alternatives raster. Mais un SVG mal optimisé exporté depuis Figma ou Illustrator peut être plus lourd qu'un PNG et plomber vos Core Web Vitals.
J'ai passé huit ans à livrer des SVG en production. Voici le guide que j'aurais aimé avoir dès le premier jour.
Pourquoi l'optimisation SVG est un poste du budget performance
Un SVG non optimisé peut contenir des métadonnées d'éditeur, des chemins redondants avec 12 décimales de précision, des styles inline répétés, des définitions de gradient/filtre inutilisées et du XML superflu comme xml:space. Un audit réel : une illustration hero de 52 Ko est tombée à 7,8 Ko après optimisation — 85% de réduction.
Impact sur les Core Web Vitals : L'optimisation SVG améliore directement le LCP (Largest Contentful Paint) pour les SVG au-dessus de la ligne de flottaison et réduit le TBT en diminuant les nœuds DOM. La mise à jour Page Experience de Google pondère fortement le LCP — retirer 40 Ko d'un SVG hero peut faire gagner 200-400 ms de LCP en 3G. Si vous servez des SVG non optimisés, vous laissez des signaux de classement sur la table.
Configuration SVGO pas à pas
SVGO est l'optimiseur standard de l'industrie. Les paramètres par défaut laissent de la performance sur la table. Il vous faut une configuration affinée.
CLI vs API Node
# CLI -- fichiers ponctuels et scripts CI
npx svgo input.svg -o output.svg --config svgo.config.js
# Optimisation par lot d'un répertoire
npx svgo -f ./src/icons -o ./dist/icons --config svgo.config.js
// API Node -- intégration 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 production
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: Bonnes pratiques svgo.config.js pour la production : Toujours mettre removeViewBox: false — le retirer casse le scaling responsive. Mettre floatPrecision: 2 pour les icônes, 3 pour les illustrations détaillées. Activer multipass: true pour que chaque passe débloque d'autres optimisations. Committez votre config dans le repo pour que chaque développeur et chaque exécution CI utilise les mêmes paramètres.
Avant/Après : Suppression des métadonnées et du ballast éditeur
Chaque outil de design intègre son empreinte :
<!-- AVANT : 680 octets de gaspillage -->
<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>
<!-- APRÈS : propre, prêt pour la production -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
Disparus : version, dimensions fixes, xml:space, enable-background, commentaires du générateur, métadonnées vides, defs inutilisés. 680 octets économisés sur une petite icône — multipliez par un sprite de 40 symboles.
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 DealSimplification des chemins : Réduire les nœuds sans perte visuelle
Les chemins concentrent la majorité des octets SVG. Les designers créent des chemins avec des centaines de nœuds là où des dizaines suffisent.
<!-- AVANT : précision à 12 décimales -->
<path d="M10.123456789012 20.987654321098 C15.111111111111 25.222222222222
30.333333333333 40.444444444444 45.555555555555 50.666666666666"/>
<!-- APRÈS : précision à 2 décimales, visuellement identique -->
<path d="M10.12 20.99C15.11 25.22 30.33 40.44 45.56 50.67"/>
Différence visuelle à la résolution d'écran ? Zéro. Économie d'octets ? 58%. Utilisez l'éditeur SVG de VectoSolve pour inspecter visuellement la réduction des nœuds.
Comparaison des techniques d'optimisation
| Technique | Réduction taille | Niveau de risque | Quand utiliser |
|---|---|---|---|
| Supprimer métadonnées & commentaires | 5-15% | Aucun | Toujours — zéro impact visuel |
| Réduire la précision décimale (2-3) | 15-30% | Faible | Icônes, éléments UI, logos |
| Fusionner & simplifier les chemins | 10-25% | Moyen | Après vérification visuelle QA |
| Supprimer defs & symboles inutilisés | 5-20% | Faible | Toujours — code mort |
| Réduire groupes & conteneurs | 3-8% | Faible | Quand le CSS ne cible pas les groupes |
| Convertir styles inline en attributs | 2-10% | Faible | Pour les SVG inline dans le HTML |
| Compression Gzip (serveur) | 70-80% | Aucun | Toujours |
| Compression Brotli (serveur) | 75-85% | Aucun | Quand le CDN le supporte |
CSS dans SVG : Inline vs feuilles de style externes
<!-- Styles inline : gonflés, mais autonomes -->
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>
<!-- <style> consolidé : plus léger, autonome -->
<style>.a{fill:#f00;stroke:#000;stroke-width:2}</style>
<path class="a" d="..."/>
<path class="a" d="..."/>
<!-- Attributs de présentation : le plus léger, idéal pour le SVG inline -->
<path fill="#f00" stroke="#000" stroke-width="2" d="..."/>
Pour les SVG inline, utilisez les attributs de présentation — remplaçables par du CSS externe, pas de problème de scope. Pour les fichiers autonomes, les blocs <style> fonctionnent bien.
Warning: L'optimisation agressive casse les animations. Si votre SVG utilise des animations CSS, currentColor, des listeners JS ou SMIL : removeHiddenElems supprime les cibles d'animation, collapseGroups détruit les transformations de groupe, cleanupIds renomme les IDs référencés par votre CSS/JS, et removeUselessStrokeAndFill supprime les strokes d'état hover. Testez toujours les SVG optimisés en contexte.
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG FreeStatistiques de compression Gzip & Brotli
Le SVG est du XML — il se compresse spectaculairement :
| Asset | Brut | SVGO | Gzip | Brotli |
|---|---|---|---|---|
| Illustration hero | 52 Ko | 7,8 Ko | 2,4 Ko | 2,1 Ko |
| Sprite d'icônes (40 icônes) | 38 Ko | 11 Ko | 3,2 Ko | 2,8 Ko |
| Logo animé | 18 Ko | 9,2 Ko | 3,1 Ko | 2,7 Ko |
| Infographie complexe | 124 Ko | 34 Ko | 9,8 Ko | 8,6 Ko |
Brotli bat Gzip de 5-15% sur le SVG. Cloudflare, Vercel et Netlify le supportent nativement.
"Chaque kilo-octet que vous envoyez est un kilo-octet que le navigateur de votre utilisateur doit télécharger, parser et rendre. Les SVG optimisés ne sont pas un nice-to-have — c'est un poste du budget performance.
Lazy Loading des pages riches en SVG
Si votre page a plus de 20 SVG sous la ligne de flottaison, ne les chargez pas tous au premier rendu :
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));
Le rootMargin de 200 px donne de l'avance au navigateur. Zéro décalage de layout, zéro bande passante gaspillée.
Intégration pipeline de build : Webpack, Vite, Next.js
L'optimisation manuelle ne passe pas à l'échelle. Branchez SVGO dans votre outil 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' },
}],
});
Avec l'intégration pipeline, l'optimisation se fait au moment du build. Pas d'étapes manuelles, pas de fichiers oubliés.
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 d'optimisation complète
- Exportez proprement depuis votre outil de design
- Lancez SVGO avec une config committée — ou optimisez avec VectoSolve pour un workflow visuel
- Vérifiez visuellement — comparez avant/après, surtout les animations
- Activez la compression — Gzip minimum, Brotli si le CDN le supporte
- Lazy loadez les SVG sous la ligne de flottaison avec Intersection Observer
- Automatisez en CI — SVGO dans votre pipeline pour que rien ne parte non optimisé
Besoin de convertir des images raster en SVG optimisé ? VectoSolve gère la vectorisation et l'optimisation en une seule étape. Ou utilisez l'éditeur SVG pour un contrôle fin des chemins et de la qualité de sortie.
Questions ou histoires de guerre d'optimisation ? Contactez-nous à contact@vectosolve.com.
| Technique d'optimisation | Réduction de taille typique | Niveau de risque |
|---|---|---|
| SVGO avec config affinée | 60–85% | Faible (avec tests) |
| Réduction de précision décimale (8 → 2) | 20–40% | Faible pour les graphiques simples |
| Suppression des métadonnées éditeur | 10–30% | Aucun |
| Simplification des chemins | 15–50% | Moyen (peut altérer les courbes) |
| Compression Brotli (serveur) | 75–90% taille de transfert | Aucun (sans perte) |
Sources & Lectures complémentaires
- web.dev: Image Optimization — Guide de référence de Google sur l'optimisation SVG et la compression pour la performance web
- MDN Web Docs: SVG — Référence technique sur la syntaxe des chemins SVG et les attributs d'éléments ciblés par l'optimisation
- CSS-Tricks: Optimizing SVG — Tutoriels pratiques de configuration SVGO et exemples d'optimisation avant/après
- W3C SVG 2 Specification — Spécification officielle pour comprendre quels attributs SVG peuvent être supprimés en toute sécurité