Audit e consulenza · Prijsvrij

CLS da 0,4 a 0,06 nel flusso di prenotazione di una vacanza

I layout shift erano nel flusso di prenotazione, e la maggior parte avveniva dopo il primo caricamento della pagina.

1,8sLCP, era 2,6s
0,06CLS, era 0,4
160msINP, era 215ms
ClientePrijsvrij, Prijsvrij.be e D-reizen, prenotazione vacanze
PiattaformaUna single page application
ServizioAudit a marzo 2026, poi consulenza ogni trimestre
Il cliente

Una single page application con un flusso di prenotazione che saltava

Prijsvrij è un sito di viaggi olandese: cerca, confronta e prenota una vacanza. L'intero sito è una single page application, e lo stesso team gestisce Prijsvrij.be e D-reizen.

Ho passato due giornate da quattro ore in sede. Il primo giorno ho fatto l'audit del sito. Il secondo giorno ho esaminato i risultati con il team e spiegato, passo dopo passo, come risolvere prima i problemi più urgenti.

Prijsvrij homepage
Cosa abbiamo trovato, cosa abbiamo fatto

La prima schermata, il flusso di prenotazione e i clic

La maggior parte dei layout shift avveniva durante le soft navigation: l'app aggiorna i contenuti senza caricare una nuova pagina. Un test Lighthouse sulla homepage non li vede mai. I visitatori reali che cliccano durante la prenotazione invece sì, e CrUX assegna quegli shift all'URL che hanno aperto per primo.

Cosa non andava
Cosa abbiamo fatto
LCP
Il CSS era diviso in modo da ritardare la prima schermata, i preload puntavano a file che non servivano subito, si caricavano immagini che la prima schermata non mostrava e il browser scopriva l'hero solo dopo l'esecuzione di JavaScript. Anche tag di terze parti e font caricavano troppo presto.
Abbiamo aggiunto un preload e fetchpriority="high" per l'hero e deciso pagina per pagina cosa caricare prima. Il LCP è passato da 2,6 a 1,8 secondi.
CLS
Mentre l'app recuperava i dati della vacanza, soprattutto il volo, mostrava un'animazione di caricamento; all'arrivo dei contenuti reali, questi si inserivano spostando il resto. Tra un passaggio e l'altro, immagini, banner e avvisi facevano la stessa cosa.
Abbiamo assegnato allo stato di caricamento le dimensioni finali del blocco del volo, e dimensioni fisse a immagini, banner e avvisi. Il CLS è passato da 0,4 a 0,06.
INP
Un clic su un filtro ricalcolava e renderizzava di nuovo tutti i risultati, il date picker calcolava mesi di prezzi dentro il clic e la selezione di viaggiatori o camere ricalcolava l'intera prenotazione. Il tracking girava dentro gli stessi clic.
Ho mostrato agli sviluppatori direttamente nel loro codice cosa eseguiva ogni clic, e come aggiornare prima lo schermo per poi eseguire il resto. L'INP è passato da 215 a 160 ms.
Prijsvrij's booking flow: most layout shifts happened after the first load, where a Lighthouse run of the homepage doesn't look
Dopo l'audit

Ho consegnato l'audit a fine marzo 2026 e l'ho esaminato con i loro sviluppatori a Den Bosch il 15 aprile, e online una settimana dopo. Il CLS era la parte difficile, con più cause del solito per un setup di questo tipo. I loro sviluppatori lo hanno sistemato su tutti e tre i siti e a maggio il CLS su desktop è diventato verde su ciascuno di essi.

0,100,250,13Mar 2026Apr0,38MagGiuLugAgoSetOtt0,06prijsvrij.nl, CLS su desktop, p75
0,100,12Mar 2026Apr0,20MagGiuLugAgoSetOtt0,05prijsvrij.be, CLS su desktop, p75
0,100,11Mar 2026Apr0,14MagGiuLugAgoSetOtt0,04d-reizen.nl, CLS su desktop, p75
I tre siti in CrUX, da marzo a ottobre 2026. Una barra a settimana, ciascuna sui 28 giorni precedenti, p75. Verde è buono, arancione da migliorare, rosso scarso.
Da allora

Una mattina di giugno il loro front-end lead mi ha scritto. Aveva passato le ultime settimane a fare modifiche su prijsvrij.nl partendo dai dati di CoreDash tramite la connessione con Claude Code, e i grafici stavano andando nella direzione giusta. Si poteva aggiungere anche D-reizen? Nel giro di un'ora sia D-reizen sia Prijsvrij.be erano su CoreDash.

Ora tocca all'INP. Quando l'ho esaminato a fine giugno ho riconosciuto il pattern: l'ho visto molte volte. Si risolve con un piano passo dopo passo collaudato, purché ogni singolo passaggio sia fatto esattamente nel modo giusto. Questo sistema la parte più grossa. Solo dopo emergono i problemi sottostanti, che sono sempre minori. Ho quindi suggerito un approccio più pratico: interventi piccoli e mirati, meno teoria e più azione. A luglio ci siamo incontrati nel loro ufficio, pranzo incluso, e continuiamo a vederci ogni trimestre.

Il LCP su mobile sale durante le vacanze, quando gran parte del traffico arriva da persone che sono in vacanza. Rimane comunque ben sotto i 2,5 secondi e sta già tornando a scendere.

Cosa abbiamo imparato

Un'animazione di caricamento sposta solo il layout shift

L'animazione dava l'impressione di mascherare l'attesa. Lo shift arrivava nel momento in cui lasciava il posto ai dettagli del volo.

Il tracking dentro il clic pesa su ogni clic

Un tag nel click handler viene eseguito prima che lo schermo possa aggiornarsi. Spostato dopo l'aggiornamento, il visitatore vede prima il risultato e il tag gira comunque.

Una single page application continua a cambiare

Ogni release aggiunge componenti e tag che l'ultimo controllo non aveva mai visto. Ecco perché torno ogni trimestre.

Arjen Karel

Layout shift in una single page application che Lighthouse non vede mai?

Inviami l'URL del flusso di prenotazione o checkout: lo navigherò cliccando come fa un visitatore, soft navigation incluse.

Prijsvrij: CLS da 0,4 a 0,06 nel flusso di prenotazione Core Web Vitals Prijsvrij: CLS da 0,4 a 0,06 nel flusso di prenotazione