Ottimizzazione SVG per Sviluppatori: SVGO, Pipeline di Build e Integrazione CI/CD
Ottimizzazione SVG orientata agli sviluppatori: configurare SVGO, integrare nelle pipeline webpack/Vite, automatizzare con CI/CD e misurare l'impatto sui 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.jsottimizzato riduce la dimensione dei file SVG del 60-85% senza perdita visiva - La semplificazione dei path (precisione decimale + nodi ridondanti) è l'ottimizzazione a maggior impatto
-
L'ottimizzazione aggressiva rompe le animazioni CSS e
currentColor— testa sempre dopo SVGO - Gzip riduce un ulteriore 70-80%; Brotli guadagna un 5-8% in più
- Il lazy loading con Intersection Observer elimina il costo di rendering fuori schermo
- L'integrazione nella pipeline di build (Vite, webpack, Next.js) rende l'ottimizzazione invisibile per il tuo team
I file SVG sono la spina dorsale della grafica web moderna — scalabili, stilizzabili, animabili e tipicamente più piccoli delle alternative raster. Ma un SVG mal ottimizzato esportato da Figma o Illustrator può essere più grande di un PNG e affossare i tuoi Core Web Vitals.
Ho passato otto anni a rilasciare SVG in produzione. Questa è la guida che avrei voluto avere il primo giorno.
Perché l'ottimizzazione SVG è una voce del budget performance
Un SVG non ottimizzato può contenere metadati dell'editor, path ridondanti con 12 decimali di precisione, stili inline ripetuti, definizioni gradient/filtro inutilizzate e XML superfluo come xml:space. Un audit reale: un'illustrazione hero da 52KB è scesa a 7,8KB dopo l'ottimizzazione — 85% di riduzione.
Impatto sui Core Web Vitals: L'ottimizzazione SVG migliora direttamente il LCP (Largest Contentful Paint) per gli SVG above-the-fold e riduce il TBT tagliando i nodi DOM. L'aggiornamento Page Experience di Google pesa molto sul LCP — rimuovere 40KB da un SVG hero può spostare il LCP di 200-400ms su 3G. Se servi SVG non ottimizzati, stai lasciando segnali di ranking sul tavolo.
Configurazione SVGO passo dopo passo
SVGO è l'ottimizzatore standard del settore. Le impostazioni predefinite lasciano performance sul tavolo. Serve una configurazione affinata.
CLI vs API Node
# CLI -- file singoli e script CI
npx svgo input.svg -o output.svg --config svgo.config.js
# Ottimizzazione batch di una directory
npx svgo -f ./src/icons -o ./dist/icons --config svgo.config.js
// API Node -- integrazione nella pipeline di 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 di produzione
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: Best practice svgo.config.js per la produzione: Imposta sempre removeViewBox: false — rimuoverlo rompe lo scaling responsive. Imposta floatPrecision: 2 per le icone, 3 per le illustrazioni dettagliate. Attiva multipass: true così ogni passata sblocca ulteriori ottimizzazioni. Committa la config nel repo così ogni sviluppatore e ogni esecuzione CI usa impostazioni identiche.
Prima/Dopo: Rimozione metadati e peso dell'editor
Ogni strumento di design incorpora la sua impronta:
<!-- PRIMA: 680 byte di spreco -->
<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>
<!-- DOPO: pulito, pronto per la produzione -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
Eliminati: version, dimensioni fisse, xml:space, enable-background, commenti del generatore, metadati vuoti, defs inutilizzate. 680 byte risparmiati su un'icona piccola — moltiplica per uno sprite di 40 simboli.
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 DealSemplificazione dei path: Ridurre nodi senza perdita visiva
I path contengono la maggior parte dei byte SVG. I designer creano path con centinaia di nodi dove bastano decine.
<!-- PRIMA: precisione a 12 decimali -->
<path d="M10.123456789012 20.987654321098 C15.111111111111 25.222222222222
30.333333333333 40.444444444444 45.555555555555 50.666666666666"/>
<!-- DOPO: precisione a 2 decimali, visivamente identico -->
<path d="M10.12 20.99C15.11 25.22 30.33 40.44 45.56 50.67"/>
Differenza visiva a risoluzione schermo? Zero. Risparmio byte? 58%. Usa l'editor SVG di VectoSolve per ispezionare visivamente la riduzione dei nodi.
Confronto delle tecniche di ottimizzazione
| Tecnica | Riduzione dimensione | Livello di rischio | Quando usare |
|---|---|---|---|
| Rimuovere metadati e commenti | 5-15% | Nessuno | Sempre — zero impatto visivo |
| Ridurre precisione decimale (2-3) | 15-30% | Basso | Icone, elementi UI, loghi |
| Unire e semplificare path | 10-25% | Medio | Dopo verifica visiva QA |
| Rimuovere defs e simboli inutilizzati | 5-20% | Basso | Sempre — codice morto |
| Collassare gruppi e contenitori | 3-8% | Basso | Quando CSS non mira ai gruppi |
| Convertire stili inline in attributi | 2-10% | Basso | Per SVG inline nell'HTML |
| Compressione Gzip (server) | 70-80% | Nessuno | Sempre |
| Compressione Brotli (server) | 75-85% | Nessuno | Quando il CDN lo supporta |
CSS in SVG: Inline vs fogli di stile esterni
<!-- Stili inline: gonfiati, ma autocontenuti -->
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>
<!-- <style> consolidato: più leggero, autocontenuto -->
<style>.a{fill:#f00;stroke:#000;stroke-width:2}</style>
<path class="a" d="..."/>
<path class="a" d="..."/>
<!-- Attributi di presentazione: più leggero, ideale per SVG inline -->
<path fill="#f00" stroke="#000" stroke-width="2" d="..."/>
Per gli SVG inline, usa attributi di presentazione — sovrascrivibili con CSS esterno, nessun problema di scoping. Per i file standalone, i blocchi <style> funzionano bene.
Warning: L'ottimizzazione aggressiva rompe le animazioni. Se il tuo SVG usa animazioni CSS, currentColor, listener JS o SMIL: removeHiddenElems rimuove i target di animazione, collapseGroups distrugge le trasformazioni di gruppo, cleanupIds rinomina gli ID referenziati dal tuo CSS/JS, e removeUselessStrokeAndFill rimuove gli stroke dello stato hover. Testa sempre gli SVG ottimizzati nel contesto.
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG FreeStatistiche di compressione Gzip e Brotli
SVG è XML — si comprime in modo spettacolare:
| Asset | Grezzo | SVGO | Gzip | Brotli |
|---|---|---|---|---|
| Illustrazione hero | 52KB | 7,8KB | 2,4KB | 2,1KB |
| Sprite icone (40 icone) | 38KB | 11KB | 3,2KB | 2,8KB |
| Logo animato | 18KB | 9,2KB | 3,1KB | 2,7KB |
| Infografica complessa | 124KB | 34KB | 9,8KB | 8,6KB |
Brotli batte Gzip del 5-15% su SVG. Cloudflare, Vercel e Netlify lo supportano nativamente.
"Ogni kilobyte che spedisci è un kilobyte che il browser dell'utente deve scaricare, parsare e renderizzare. Gli SVG ottimizzati non sono un nice-to-have — sono una voce del budget performance.
Lazy Loading di pagine ricche di SVG
Se la tua pagina ha più di 20 SVG sotto il fold, non caricarli tutti al primo 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));
Il rootMargin di 200px dà vantaggio al browser. Zero layout shift, zero banda sprecata.
Integrazione nella pipeline di build: Webpack, Vite, Next.js
L'ottimizzazione manuale non scala. Collega SVGO al tuo strumento di 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 l'integrazione nella pipeline, l'ottimizzazione avviene al momento del build. Nessun passaggio manuale, nessun file dimenticato.
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 di ottimizzazione completa
- Esporta pulito dal tuo strumento di design
- Esegui SVGO con una config committata — o ottimizza con VectoSolve per un workflow visuale
- Verifica visivamente — confronta prima/dopo, soprattutto le animazioni
- Attiva la compressione — Gzip minimo, Brotli se il CDN lo supporta
- Lazy load gli SVG sotto il fold con Intersection Observer
- Automatizza nel CI — SVGO nella tua pipeline così nulla viene rilasciato non ottimizzato
Serve convertire immagini raster in SVG ottimizzato? VectoSolve gestisce vettorializzazione e ottimizzazione in un solo passaggio. O usa l'editor SVG per un controllo dettagliato su path e qualità di output.
Domande o storie di guerra sull'ottimizzazione? Scrivici a contact@vectosolve.com.
| Tecnica di ottimizzazione | Riduzione tipica | Livello di rischio |
|---|---|---|
| SVGO con config affinata | 60–85% | Basso (con test) |
| Riduzione precisione decimale (8 → 2) | 20–40% | Basso per grafiche semplici |
| Rimozione metadati editor | 10–30% | Nessuno |
| Semplificazione path | 15–50% | Medio (può alterare curve) |
| Compressione Brotli (server) | 75–90% dimensione trasferimento | Nessuno (senza perdita) |
Fonti e approfondimenti
- web.dev: Image Optimization — Guida di riferimento di Google sull'ottimizzazione SVG e compressione per la performance web
- MDN Web Docs: SVG — Riferimento tecnico sulla sintassi dei path SVG e attributi degli elementi target dell'ottimizzazione
- CSS-Tricks: Optimizing SVG — Tutorial pratici di configurazione SVGO ed esempi di ottimizzazione prima/dopo
- W3C SVG 2 Specification — Specifica ufficiale per capire quali attributi SVG sono sicuri da rimuovere