100 punti su PageSpeed: che cosa abbiamo cambiato

Il tempo di caricamento è un fattore di posizionamento, ma i consigli abituali servono di rado. Questo articolo descrive che cosa abbiamo davvero cambiato sul nostro sito, quanto ha reso ciascun intervento e dove abbiamo sbagliato strada.

Una forma luminosa accelera verso destra, dietro di essa blocchi scuri si dissolvono

In breve

  • Il singolo guadagno maggiore non è arrivato dal comprimere i file, ma dal sostituire una libreria da 458 KB con 6 KB di codice proprio.
  • La seconda causa in ordine di peso era una compressione configurata a metà: il server comprimeva solo l'HTML, non CSS e JavaScript.
  • Uno spostamento di layout con valore 1 è costato 24 punti, provocato da CSS caricato in ritardo che entrava in azione solo dopo la prima resa a video.
  • Ciò che ha reso meno: i formati delle immagini. Ciò che ha reso di più: togliere cose.

Il valore di partenza era 58 su 100 su telefono. Non è un valore scadente per un sito con un effetto 3D nell'intestazione, ma è un valore che Google penalizza in modo percepibile nella ricerca da mobile. Alla fine siamo arrivati a 100 punti su computer e 98 su telefono, con 100 anche per l'accessibilità.

Quello che segue non è una lista di controllo generica, ma il percorso reale, compresi i punti in cui ci siamo sbagliati.

Una forma luminosa accelera verso destra, dietro di essa blocchi scuri si dissolvono
Una pagina non diventa veloce ottimizzando, ma togliendo.

Il punto di partenza

Valore misurato (mobile)primadopo
Prestazioni5898
Accessibilità95100
Prima resa a video6,1 s1,4 s
Elemento più grande visibile11,1 s2,1 s
Totale trasferito298 KB184 KB
di cui JavaScript121 KB5 KB

I cinque interventi che hanno contato davvero

1. Sostituire la libreria, non ottimizzarla

L'intestazione mostra una nuvola di particelle in 3D. Per farlo girava una nota libreria grafica: 458 KB dopo la minimizzazione. La misurazione indicava che 51 KB di quel codice non venivano nemmeno mai eseguiti.

Lo sguardo decisivo è stato la domanda su quanto ce ne servisse davvero. Erano undici componenti: renderer, scena, camera, geometria, materiale e qualche classe di supporto. Tutto questo si può programmare direttamente contro l'interfaccia grafica del browser.

Risultato: 458 KB sono diventati 6 KB. La resa visiva è identica: abbiamo ripreso gli stessi shader.

Attenzione Due dettagli vanno riprodotti, altrimenti il risultato appare sbagliato: la libreria converte i colori dal formato esadecimale in luce lineare, e miscela in modo additivo con alfa premoltiplicato. Senza entrambi, la nostra nuvola di particelle risultava nettamente più accesa di prima.

2. La compressione era attiva solo a metà

Nella configurazione del server la compressione era su «attiva», ma la riga che indica quali tipi di file comprimere era commentata. È l'impostazione predefinita di molte distribuzioni. Risultato: veniva compresso esclusivamente l'HTML.

La libreria grafica passava quindi sulla linea senza compressione. Dopo l'attivazione: 1243 KB sono diventati 251 KB. In più teniamo ora accanto le versioni compresse precalcolate, così il server non ricalcola a ogni richiesta.

Impegno: due righe di configurazione. Effetto: quasi un megabyte per ogni primo accesso.

3. Rimuovere del tutto la libreria di animazione

Per le comparse allo scorrimento girava un'altra libreria, 114 KB. La misurazione la indicava anche come causa di ricalcoli forzati del layout: durante lo scorrimento interrogava la geometria e costringeva il browser a ricalcolare l'impaginazione nel mezzo del movimento.

Sostituita con un IntersectionObserver che si limita ad assegnare una classe. Il movimento vero lo fa il CSS. 114 KB in meno, nessun ricalcolo, circa 40 righe di codice proprio.

4. La favicon pesava 205 KB

Un dettaglio con un effetto sorprendente, perché viene caricata molto presto. Sostituita con un file SVG da 6 KB, generato dal logo esistente.

Lo sapevi?

Per la visualizzazione nei risultati di ricerca di Google una favicon SVG non serve: lì Google accetta solo formati raster, e l'immagine deve essere quadrata con un lato multiplo di 48 pixel.

Chi quindi carica soltanto un SVG ottiene nel risultato di ricerca il segnaposto grigio al posto del proprio logo. Indicare entrambi insieme è la strada giusta.

5. Interrogare la geometria dentro il frame di animazione

Uno script leggeva l'altezza complessiva del documento a ogni evento di scorrimento. Questa proprietà il browser non può ricavarla dalla memoria: deve ricalcolare l'impaginazione dell'intera pagina, nel mezzo dello scorrimento.

La regola che ne deriva e che vale ovunque: leggere nell'evento, scrivere nel fotogramma successivo. Mai il contrario. Da allora l'altezza della pagina viene misurata una volta e memorizzata, invece di essere richiesta sessanta volte al secondo.

L'errore che è costato 24 punti

A sinistra una pila fitta di blocchi grigi, verso destra ne restano solo pochi luminosi
È ciò che resta a decidere il tempo di caricamento, non quanto bene sia compresso il resto.
Dalla pratica

Per eliminare l'ultima richiesta bloccante avevamo diviso il foglio di stile: la parte necessaria all'area visibile finiva direttamente nel documento, il resto veniva caricato dopo. Un procedimento diffuso.

Il taglio cadeva su un segno nel file sorgente dietro cui pensavamo ci fosse l'area visibile. In realtà lì dietro c'erano le regole per il logo nell'intestazione, per le spaziature sottostanti e per le comparse. La pagina si costruiva quindi senza di esse e un secondo dopo veniva riassestata.

Il risultato: Cumulative Layout Shift pari a 1,0, e quindi 76 punti invece di 100 su computer. Particolarmente sgradevole: in locale con linea rallentata il valore era 0, perché lì il foglio di stile arrivava abbastanza presto. L'errore era visibile solo su connessione veloce.

La lezione: o tutto il foglio di stile dentro il documento o nessuno. Un inserimento parziale presuppone di sapere esattamente quale regola serve nell'area visibile, e su una pagina che cresce non lo si sa mai in modo stabile.

Suggerimento In caso di sospetto di spostamenti di layout, misurate senza rallentamenti. Uno strumento di verifica con connessione mobile simulata consegna il file abbastanza presto e non mostra lo spostamento. Chi misura solo così crede che il problema sia risolto.

Che cosa ha reso poco

Per completezza, le misure che compaiono in ogni guida e che da noi sono state a malapena misurabili:

Formati delle immagini. La nostra pagina iniziale ha poche immagini: il logo è un file SVG. Dove ci sono immagini la conversione conviene, naturalmente; come leva principale funziona solo su pagine ricche di immagini.

Ridurre ulteriormente i caratteri. Ospitiamo due famiglie di caratteri in proprio e precarichiamo quelle necessarie nell'area visibile. Un'ulteriore ottimizzazione sarebbe possibile, ma non muove il valore.

Posizione del server. Consigliata spesso, nel nostro caso irrilevante: il tempo fino al primo byte era già di 20 millisecondi. Chi è già a posto lì non guadagna nulla da una rete di distribuzione.

Il procedimento da rifare

  1. Misurare prima di cambiare qualsiasi cosa. Mobile e desktop separati, annotando i valori.
  2. Cercare il file trasferito più grande. Quasi sempre è JavaScript. La domanda non è come rimpicciolirlo, ma se serva.
  3. Verificare la compressione. Non se è attiva, ma per quali tipi di file.
  4. Contare le richieste bloccanti. Ogni file di foglio di stile nell'intestazione trattiene la prima resa a video.
  5. Verificare gli spostamenti di layout senza rallentamenti. L'unico test che a noi è mancato.
  6. Rimisurare dopo ogni modifica. Altrimenti alla fine non si sa che cosa ha funzionato.
Prompt
Aiutami a tradurre il rapporto PageSpeed della mia pagina in un
ordine di priorità. Sii severo; non lodare nulla.

I miei valori:
- Mobile: [punteggio], desktop: [punteggio]
- LCP, TBT, CLS per dispositivo: [valori]
- File trasferiti più grandi con dimensione: [elenco]
- Richieste che bloccano la resa: [elenco]
- Segnalazioni dal rapporto: [inserire testo]

Sulla pagina:
- Come è costruita: [CMS / statica / costruttore]
- Serve JavaScript per il contenuto visibile? [sì/no]
- Come viene servito il CSS? [esterno / in anticipo /
  parzialmente in anticipo]

Compiti:
1. Assegna ogni segnalazione a una causa e di' quale metrica
   influenza: LCP, TBT o CLS.
2. Ordina le misure per effetto rapportato all'impegno. Per
   ciascuna indica quanti punti muove realisticamente e perché.
3. Indica le misure del rapporto che con la mia struttura non
   portano praticamente nulla, e motivalo invece di ometterle.
4. Per ogni file JavaScript grande chiedi prima se serve, prima
   di proporre la minimizzazione.
5. Segnala se il CSS viene servito in anticipo solo in parte, e
   spiega perché per il CLS questo può essere peggio che non
   farlo affatto.
6. Indica che cosa dovrei rimisurare dopo ogni modifica.

Non inventare valori misurati.

Conclusione

Il punteggio in sé non è l'obiettivo: è un valore misurato, non un risultato aziendale. Ciò che conta è l'esperienza dietro di esso: una pagina leggibile dopo 1,4 secondi viene letta da più persone di una che ne impiega sei. Per i visitatori da mobile su rete cellulare la differenza è maggiore di qualsiasi ottimizzazione del testo.

La strada per arrivarci è passata nel nostro caso da un'unica domanda ricorrente: ci serve? Cinque interventi su sei sono consistiti nel togliere qualcosa, non nell'aggiungerla.

Domande frequenti

Come si arriva a 100 punti su PageSpeed Insights?

Nella maggior parte dei siti in tre passi: rimuovere o sostituire il file JavaScript più grande, attivare davvero la compressione per CSS e JavaScript, ed eliminare gli spostamenti di layout. I formati delle immagini e la posizione del server sono raramente il collo di bottiglia.

Quanto conta il tempo di caricamento per il posizionamento su Google?

È un fattore confermato ma non forte: contenuto e pertinenza pesano di più. L'effetto maggiore è indiretto: le pagine lente vengono abbandonate più spesso, e questo comportamento entra nella valutazione.

Che cos'è il Cumulative Layout Shift e come si risolve?

È il valore che misura gli elementi che cambiano posizione dopo la prima resa a video. Cause più frequenti: immagini senza dimensioni fisse, fogli di stile caricati in ritardo e caratteri con metriche molto diverse. Si risolve facendo in modo che lo spazio sia stabilito in anticipo, tramite indicazioni di larghezza e altezza o un rapporto d'aspetto fisso.

Conviene inserire il CSS dentro l'HTML?

Con fogli di stile piccoli sì, ma allora per intero. Un inserimento parziale con caricamento successivo del resto risparmia una richiesta e in cambio si porta a casa spostamenti di layout non appena manca una regola dell'area visibile. Da noi erano 7 KB compressi: per quello l'inserimento completo conviene.

Quanto rende rinunciare alle librerie?

Nel nostro caso la voce singola più grande: 458 KB di libreria grafica sono diventati 6 KB di codice proprio, più 114 KB di libreria di animazione azzerati. Se convenga dipende da quanta parte della libreria si usa davvero: la misurazione indica il JavaScript non utilizzato.

Un marketing che si configura da solo

La beta di Studio Engine è aperta. Prenota il tuo posto e contribuisci fin dall’inizio.

Partecipa alla beta →
← Torna all'elenco