Performance
JavaScript di terze parti: quanto costa davvero
Uno script di terze parti sincrono in testa ha spostato il primo paint di 388 ms in lab: 296 ms senza script, 684 ms con lodash. Stesso file in defer: 284 ms. Come si misura e cosa tagliare.
In sintesi
- Il costo di uno script di terze parti è il momento in cui lo carichi, non solo il suo peso.
- Sincrono in testa: FCP 684 ms contro 296 ms senza script, 388 ms di differenza.
- Lo stesso file in defer lascia il FCP a 284 ms, con gli stessi byte trasferiti.
- Un host terzo paga un handshake in più: 63 ms di TLS prima del primo byte nella nostra misura.
Uno script di terze parti sincrono in testa ha spostato il primo paint di 388 ms: nella prova senza script il FCP è 296 ms, con lodash.min.js in testa è 684 ms. Lo stesso file con defer lascia il FCP a 284 ms, quindi il costo non è il file, è il momento in cui lo carichi.
Tre varianti, un solo file
| Variante | Richieste | Byte | FCP | Load |
|---|---|---|---|---|
| Nessuno script | 1 | 6.336 B | 296 ms | 231 ms |
| Sincrono in testa | 2 | 30.115 B | 684 ms | 667 ms |
| defer | 2 | 33.474 B | 284 ms | 601 ms |
Il divario tra sincrono e defer è 400 ms di FCP: con lo script sincrono il parser si ferma prima di dipingere. I byte delle due varianti differiscono per come il server ha compresso la risposta, non per il contenuto.
Il costo che non si vede
Un host terzo paga un handshake che la connessione già aperta verso la tua origine non può riusare: nella nostra misura 63 ms di TLS e 86 ms al primo byte, prima di scaricare un solo byte utile. Poi arrivano i byte del file: 26.751 per lodash, 153.653 per un tag di Google Analytics demo, letti con curl lo stesso giorno.
for u in https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js \
"https://www.googletagmanager.com/gtag/js?id=G-DEMO123"; do
curl -s -o /dev/null -H "Accept-Encoding: gzip, br" \
-w "$u dns=%{time_namelookup} tls=%{time_appconnect} ttfb=%{time_starttransfer} bytes=%{size_download}\n" "$u"
done
Il comando stampa una riga per host: DNS, fine del TLS, primo byte e byte trasferiti. Il tempo che conta è tls, perché è quello che la tua pagina paga prima di poter chiedere il file.
Come si riduce
- Metti in
deferoasynctutto ciò che non serve al primo paint: 400 ms di FCP nella nostra prova. Fonte: MDN, CC BY-SA 2.5. - Ospita il file sulla tua origine quando puoi: elimini l'handshake verso un host terzo e un DNS che non controlli. Fonte: web.dev, CC BY 4.0.
- Aggiungi
rel=preconnectsolo per gli host che usi davvero, non per ogni tag aperto in ufficio. Fonte: MDN, CC BY-SA 2.5. - Misura per tag: se non sai a cosa serve uno script, la risposta è rimuoverlo. Il tag demo pesa 153.653 byte.
Il limite da dichiarare
La prova misura un file, una pagina e una rete simulata: un sito con sei tag non paga sei volte lo stesso ritardo, perché le connessioni si riusano e gli script si sovrappongono. defer toglie il blocco del parser ma non il lavoro sul thread principale, e un long task da 61 ms è comparso comunque in una delle cinque run sincrone. Consenso, privacy e cookie banner hanno un costo che qui non è misurato.
Dove continuare
Il catalogo EneUI indicizza 111.985 componenti, l'hero horizon-hero-section e l'icona icon-access-point: un hero con video e un font in più pesa più di uno script di analytics. Leggi come si fissa un performance budget, il bundle splitting e quanto pesa una UI library.
Domande frequenti
defer e async sono equivalenti?
No. defer conserva l'ordine tra gli script ed esegue dopo il parsing; async esegue appena il file arriva e può anticipare uno script che dipendeva da un altro.
Quanto costa un tag di analytics?
Da 26.751 byte per una piccola libreria a 153.653 byte per gtag, più un handshake verso un host terzo. Il tempo, non il peso, decide il primo paint.
Il preconnect serve sempre?
Serve quando usi davvero l'host e la connessione si apre abbastanza presto. Su host che chiami di rado aggiunge solo una connessione da chiudere.
Meglio self-host o CDN pubblica?
Self-host vince sul primo byte e sul controllo, perde sull'aggiornamento automatico. Per uno script che cambi di rado, self-host con cache lunga è la scelta più semplice.
Come misuro il costo sul campo?
Con il Resource Timing per i byte e con i long task per il thread principale. Il laboratorio dice quando carichi; i dati di campo dicono quanto pesa per i tuoi utenti.