Performance
Performance budget di un sito: come si fissa
Un performance budget è un tetto di byte e millisecondi per deploy. La home del nostro sito pesa 327.750 byte in 23 richieste, 196.252 dei quali sono font: come si fissa e come si fa fallire.
In sintesi
- Un budget si fissa sui byte misurati, non su un numero copiato da un articolo.
- La home misurata carica 327.750 byte in 23 richieste, e i font sono il 60% del totale.
- Il budget va per tipo di risorsa: un totale rispettato può nascondere un CSS fuori scala.
- Le soglie di tempo valgono solo se le confronti con i dati di campo, i byte valgono sempre.
Un performance budget è un tetto di byte e di millisecondi che ogni deploy deve rispettare: la home del nostro sito carica 327.750 byte in 23 richieste, e 196.252 byte sono font. Il budget che ne deriva è 400 KB in totale, 200 KB di font, 100 KB di JavaScript, 30 KB di CSS e 40 KB di immagini.
Dove finiscono i byte
| Risorsa | Misurato | Budget | Margine |
|---|---|---|---|
| Font (6 file) | 196.252 B | 200.000 B | +3.748 B |
| JavaScript (2 file) | 90.897 B | 100.000 B | +9.103 B |
| CSS (5 fogli) | 22.486 B | 30.000 B | +7.514 B |
| HTML | 12.434 B | 15.000 B | +2.566 B |
| Immagini (4 file) | 3.717 B | 40.000 B | +36.283 B |
| Beacon e SVG | 1.964 B | 3.000 B | +1.036 B |
| Totale | 327.750 B | 400.000 B | +72.250 B |
Anche il tempo ha un tetto
| Metrica | Misurato | Budget | Stato |
|---|---|---|---|
| LCP | 2.856 ms | 2.500 ms | -356 ms |
| TTFB | 167 ms | 800 ms | +633 ms |
| CLS | 0 | 0,1 | dentro |
| Long task | 486 ms in 3 | 300 ms | -186 ms |
I font sono il 60% del totale: sei file per 196.252 byte, e ogni peso è un download che il browser deve completare prima di mostrare il testo. Il margine positivo sul totale non compensa uno sforamento per tipo: se un tipo sfonda il suo tetto il deploy si blocca lo stesso, ed è il comportamento che vuoi.
Il budget che si applica da solo
{
"performance": {
"budget": [
{ "resourceType": "total", "budget": 400 },
{ "resourceType": "stylesheet", "budget": 220 },
{ "resourceType": "script", "budget": 60 },
{ "resourceType": "font", "budget": 50 },
{ "resourceType": "image", "budget": 40 }
],
"timings": [
{ "metric": "largest-contentful-paint", "budget": 2500 },
{ "metric": "cumulative-layout-shift", "budget": 0.1 }
]
}
}
Le cifre sono in kilobyte e descrivono il trasferimento, non il peso decompresso. Il file si passa a Lighthouse con --budget-path:
npx lighthouse http://localhost:3100/ --budget-path=budget.json \
--output=json --output-path=./lh.json --chrome-flags="--headless"
Lighthouse elenca le voci fuori budget nella categoria budgets. Per far fallire la pipeline serve Lighthouse CI, che con le stesse soglie in assert restituisce un exit code diverso da zero.
Cosa tagliare per primo
- Font: sei file per 196.252 byte sono il primo bersaglio; due pesi bastano, e il solo Inter latino regular pesa 48.256 byte. Fonte: web.dev, CC BY 4.0.
- JavaScript: carica i chunk di rotta solo quando servono. I due file iniziali misurati sono 90.897 byte. Fonte: web.dev, CC BY 4.0.
- CSS: cinque fogli per 22.486 byte compressi; qui il margine c'è, e va speso in regole, non in un altro foglio. Fonte: MDN, CC BY-SA 2.5.
- Immagini: qui pesano 3.717 byte perché la home ne usa quattro piccole; su un catalogo diventano la voce più grande e vanno servite in AVIF o WebP.
Il limite da dichiarare
Il budget misura il laboratorio, non i tuoi utenti: 2.672 ms di LCP su Slow 4G simulato non sono il 75° percentile di campo. I byte restano validi perché non dipendono dalla rete; le soglie di tempo vanno confrontate con i dati reali, e su una connessione peggiore il long task da 492 ms può raddoppiare.
Dove continuare
Il catalogo EneUI indicizza 111.985 componenti, per esempio sparkles, e il blocco banner-01: una pagina con tre di questi blocchi aggiunge immagini e CSS al budget. Per le soglie leggi cosa sono i Core Web Vitals, per il costo degli script JavaScript di terze parti, per la cache cache e CDN e per il confronto tra architetture framework frontend a confronto.
Domande frequenti
Quanto deve pesare una pagina?
Non esiste un numero universale: si parte dal peso misurato e si fissa un tetto appena sopra, poi lo si abbassa. La nostra home parte da 327.750 byte e il budget è 400.000.
Meglio un budget in byte o in millisecondi?
Servono entrambi. I byte sono deterministici e si controllano in CI; i millisecondi dipendono da rete e CPU, quindi vanno letti insieme ai dati di campo.
Il budget si applica per pagina o per tipo di risorsa?
Per tipo di risorsa. Un totale rispettato può nascondere un CSS enorme compensato da poche immagini, e il CSS blocca il rendering.
Come faccio fallire la build?
Con Lighthouse CI e le soglie in assert. Lighthouse da solo riporta le voci fuori budget, Lighthouse CI trasforma l'esito in un exit code.
Il budget va aggiornato?
Sì, quando una feature nuova aggiunge peso in modo deliberato. Si alza il tetto nel commit che spiega perché, non in silenzio dopo il fallimento.