
Come posso ottimizzare i Core Web Vitals del mio sito Next.js per superare i test di Google? La risposta che si sente più spesso è: “Usa il componente `next/image`”. Ed è una buona partenza, ma purtroppo si ferma in superficie.
Pensare che un singolo componente, per quanto potente, possa risolvere una sfida complessa come la user experience è un approccio semplicistico. Per applicazioni reali, con dati dinamici, terze parti e interazioni complesse, la vera ottimizzazione dei Core Web Vitals in Next.js richiede un intervento architetturale, non un semplice “cerca e sostituisci” nel codice.
La soluzione corretta non è una singola tattica, ma un framework strategico che bilancia rendering, gestione dello stato e interattività. Si tratta di capire cosa rallenta davvero la pagina, che spesso non è l’immagine in sé, ma il dato che la popola o lo script che la rende interattiva.
La discussione sull’ottimizzazione del Largest Contentful Paint (LCP) si concentra quasi sempre sulle immagini. Eppure, in molte applicazioni Next.js complesse, l’elemento LCP non è un’immagine, ma un titolo o un blocco di testo che attende dati da un’API. In questi casi, la priorità non è la compressione dell’asset, ma l’efficienza del data fetching.
Spostare il caricamento dei dati critici per la visualizzazione “above the fold” all’interno dei React Server Components è la mossa più efficace. In questo modo, l’HTML arriva al browser già completo dei dati necessari, eliminando le cascate di richieste lato client (client-side request waterfalls) che posticipano il rendering dell’elemento più importante della pagina.
Lavorando con diverse realtà, ho notato che il team di sviluppo si concentra sulla dimensione in KB delle immagini, ignorando i 3.2 secondi persi ad attendere una risposta dall’API in un `useEffect` lato client. Questo approccio risolve il problema sbagliato, lasciando intatte le vere cause di un LCP scadente.
Se l’LCP era la sfida degli anni passati, il 2026 è dominato dall’Interaction to Next Paint (INP). Questo nuovo Core Web Vital, che ha sostituito First Input Delay (FID) nel 2024, misura la reattività complessiva di una pagina a tutte le interazioni dell’utente. Secondo dati recenti dell’HTTP Archive 2025 Web Almanac, ben il 43% delle origini mobile non supera ancora la soglia dei 200ms, evidenziando una difficoltà diffusa nell’ottimizzazione dell’interattività.
A differenza di FID, che misurava solo il ritardo della prima interazione, INP è molto più severo. La causa principale di un INP scarso in Next.js è quasi sempre un main thread bloccato da troppo codice JavaScript. L’idratazione di componenti client pesanti, lunghi task scatenati da un click e script di terze parti sono i colpevoli più comuni. Un’attenta analisi tramite il tab Performance di Chrome DevTools è il primo passo per identificare questi colli di bottiglia.
Per affrontare l’INP in modo strutturale, è necessario adottare un approccio mirato:
Dopo aver affrontato velocità di caricamento e reattività, la stabilità visiva, misurata dal Cumulative Layout Shift (CLS), chiude il cerchio dell’esperienza utente. Un CLS elevato, causato da elementi che si spostano durante il caricamento, non solo infastidisce l’utente ma può portare a click involontari e a una perdita di fiducia.
Un esempio pratico viene da un cliente del settore retail moda, un e-commerce di medie dimensioni. Nel 2025, il loro sito registrava un CLS di 0.18, ben al di sopra della soglia “scarsa”. L’analisi ha rivelato due cause principali: il caricamento dei web font e banner promozionali inseriti dinamicamente senza uno spazio riservato. L’intervento non si è limitato all’uso di `next/image`, ma ha seguito una strategia più completa, di cui si parla anche nella guida all’ottimizzazione delle immagini in Next.js.
La soluzione è stata duplice: abbiamo implementato `next/font` per precaricare i font e minimizzare il “flash” del testo, e abbiamo definito altezze minime esplicite per i container dei banner. Il risultato è stato un CLS ridotto a 0.05 (“buono”) e, nel Q1 2026, un aumento misurabile del 7% nelle azioni di “aggiunta al carrello” sulle pagine prodotto, dimostrando un legame diretto tra stabilità visiva e risultati di business.
Risolvere i problemi di performance non è un’attività da fare una tantum. È un processo continuo che richiede un metodo. Per ottimizzare i Core Web Vitals in Next.js in modo sistematico, serve un framework che vada oltre i singoli fix. Il punto di partenza è sempre la misurazione con dati reali (Real User Monitoring) per capire dove si concentrano i problemi.
Il passo successivo è l’analisi architetturale. Chiediti: quali componenti possono essere Server Components? Dove sto caricando dati in modo inefficiente? Quali librerie client stanno appesantendo il bundle inutilmente? La risposta a queste domande porta a interventi mirati: refactoring verso un’architettura a isole, ottimizzazione delle query e adozione di pattern come lo streaming con Suspense per migliorare la performance percepita.
Infine, monitorare e impostare budget di performance nel processo di CI/CD impedisce che nuove funzionalità introducano regressioni. Questo trasforma l’ottimizzazione da un’emergenza a una pratica di ingegneria consolidata.
Se l’elemento LCP è un testo, la causa principale è quasi sempre un caricamento tardivo dei dati o dei font. Sposta il data-fetching relativo a quel testo in un Server Component per includerlo nell’HTML iniziale. Inoltre, utilizza `next/font` con `display: ‘swap’` per assicurare che il testo sia visibile il prima possibile con un font di sistema, riducendo il tempo di blocco del rendering.
Sì, in modo significativo. L’App Router, con i React Server Components come default, incoraggia un’architettura che di base migliora i Core Web Vitals riducendo il JavaScript inviato al client. L’ottimizzazione si sposta dalla gestione manuale con `getServerSideProps` a una più fine granularità nel decidere quali componenti devono essere interattivi (“use client”), rendendo più semplice mantenere il main thread libero.
Per correlare le performance ai risultati economici, è necessario integrare i dati dei Core Web Vitals con il tuo strumento di analytics. Invia i valori di LCP, INP e CLS di ogni sessione utente come eventi personalizzati. Successivamente, puoi segmentare i report di conversione, bounce rate o valore medio dell’ordine in base a chi ha avuto un’esperienza “buona”, “da migliorare” o “scarsa”, quantificando l’impatto economico della user experience.
Se la gestione strategica delle performance in Next.js sta limitando la crescita del tuo progetto, contatta Riccardo Galli per definire un piano d’azione basato su dati e architettura.
Ti è piaciuto questo articolo?
Parliamone insieme →
Molti team trattano Storybook come una semplice vetrina di componenti. È un errore di valutazione che, nel 2026, si traduce in costi operativi tangibili. La sua vera funzione non è la documentazione passiva, ma l’automazione della coerenza visiva e la prevenzione attiva dei bug di regressione. Il…

Una domanda ricorre spesso tra i developer che usano Next.js: posso costruire un intero backend solo con le API Routes? Oppure sto, senza accorgermene, creando un monolite fragile mascherato da architettura serverless? La risposta più comune è un entusiastico “sì, puoi sostituire completamente un…

Affermare che il caching in Next.js serva solo a velocizzare il rendering è come dire che un motore serva solo a far girare le ruote. È vero, ma ignora il quadro strategico completo. Nel 2026, con architetture sempre più distribuite e component-based, la performance non si misura più solo sul Time…