Page Speed: ottimizzazione completa del caricamento

Come separare i problemi di risposta del server, caricamento, rendering e interazione, e validare i miglioramenti con dati sul campo e di laboratorio.

La Page Speed è uno degli investimenti con il maggiore impatto contemporaneamente su SEO e conversione. Amazon ha calcolato che ogni 100 ms di latenza aggiuntiva costano l'1% delle vendite. Google usa la velocità come fattore di posizionamento dal 2010 per il desktop, dal 2018 per il mobile e nel 2021 ha introdotto i Core Web Vitals come segnale diretto della Page Experience.

Il waterfall di caricamento: le risorse vengono richieste una dopo l'altra e ogni ritardo sposta l'LCP più a destra.
Il 53% degli utenti mobile abbandona una pagina che impiega più di 3 secondi a caricarsi. Su un e-commerce significa conversioni perse prima ancora di mostrare un prodotto.

Cos’è la Page Speed e come si misura

La Page Speed non è un numero unico — è un insieme di metriche, ciascuna misura un aspetto diverso dell'esperienza di caricamento. Google PageSpeed Insights combina dati di laboratorio (Lighthouse) e dati sul campo di utenti reali (Chrome User Experience Report). Il punteggio finale da 0 a 100 è una somma ponderata di diverse metriche e non va usato come unico obiettivo di ottimizzazione.

Per la SEO contano i dati sul campo (CrUX): Google usa il 75° percentile degli utenti reali di Chrome quando valuta i Core Web Vitals. Lighthouse aiuta a diagnosticare i problemi, ma non è un input diretto dell'algoritmo di posizionamento.

Metriche chiave di velocità

Ogni metrica affronta un aspetto specifico dell'esperienza utente. Capirne le differenze è la base di una diagnosi corretta.

MetricaCosa misuraValore buonoIncide sul ranking
TTFB (Time to First Byte)Tempo fino al primo byte di HTML dal server< 800 msIndirettamente (via LCP)
FCP (First Contentful Paint)Primo pixel di contenuto sullo schermo< 1,8 sLighthouse, non è un fattore CrUX
LCP (Largest Contentful Paint)Contenuto principale visibile all’utente< 2,5 sSì (Core Web Vitals)
INP (Interaction to Next Paint)Reattività all’interazione dell’utente< 200 msSì (Core Web Vitals, ha sostituito FID)
CLS (Cumulative Layout Shift)Stabilità del layout — quanto saltano gli elementi< 0,1Sì (Core Web Vitals)
TBT (Total Blocking Time)Tempo totale di blocco del main thread da JS< 200 msProxy di laboratorio per l’INP
La FID (First Input Delay) è stata ufficialmente sostituita dall'INP (Interaction to Next Paint) a marzo 2024. Se i tuoi strumenti riportano ancora la FID — aggiornali o ignora quella metrica. L'INP misura la latenza di tutte le interazioni, non solo della prima.
53%

Abbandono entro 3 s

Utenti mobile che abbandonano una pagina che carica in più di 3 secondi

1–3%

Conversione al secondo

Ogni secondo di latenza aggiuntivo riduce la conversione in media dell’1–3%

75°

Percentile CrUX

Google valuta i Core Web Vitals al 75° percentile degli utenti reali

28 giorni

Finestra CrUX

Periodo mobile su cui vengono raccolti i dati per la valutazione del sito

Diagnosi: da dove partire con l’ottimizzazione

Ottimizzare alla cieca è fatica sprecata. La sequenza corretta: misura prima, identifica il collo di bottiglia, correggi, misura di nuovo.

  1. Apri PageSpeed Insights e testa 5–10 pagine chiave: home, categorie, schede prodotto, landing page. Guarda i dati sul campo, non solo il punteggio Lighthouse.
  2. In Google Search Console vai su Core Web Vitals — mostra quali URL hanno valutazioni «Scarsa» o «Da migliorare» per LCP, INP e CLS con dati di utenti reali.
  3. Esegui WebPageTest per l’analisi profonda: waterfall di caricamento, filmstrip, TTFB, impatto della CDN. Scegli la regione di test più vicina al tuo pubblico principale.
  4. Usa Chrome DevTools → Performance → registra un caricamento della pagina. Il flame chart mostra quale script occupa il main thread e blocca il rendering.
  5. Controlla Coverage (DevTools → Coverage): il CSS/JS non usato è un candidato diretto alla rimozione o al caricamento differito.
Per i test usa la modalità incognito e disattiva le estensioni del browser: ad blocker ed estensioni distorcono i risultati. Per risultati riproducibili usa Lighthouse CLI o WebPageTest.

PageSpeed Insights

Lo strumento gratuito di Google. Mostra sia i dati di laboratorio (Lighthouse) sia quelli sul campo (CrUX). Fornisce una lista di raccomandazioni specifiche con risparmio di tempo stimato. Miglior punto di partenza per un audit iniziale.

WebPageTest

Waterfall dettagliato, filmstrip, test multi-località, confronto tra versioni. Mostra l’impatto di CDN, DNS, handshake SSL. Indispensabile per la diagnosi profonda del TTFB.

Google Search Console

Dati CrUX reali per gruppi di URL. Mostra i trend delle metriche nel tempo — lo strumento migliore per monitorare i miglioramenti dopo il deploy delle ottimizzazioni.

Chrome DevTools

Schede Performance Profiler e Coverage — per trovare lo script o il CSS specifico che blocca il rendering. Il flame chart rivela le Long Task (> 50 ms) sul main thread.

Server e ottimizzazione del TTFB

Il TTFB (Time to First Byte) è la fondazione di tutta la velocità. Se il server risponde lentamente, ogni ottimizzazione successiva lavora contro un tetto artificiale. Obiettivo: TTFB < 200 ms in ambienti con CDN, < 400 ms per i server dinamici.

Hosting e infrastruttura

Scelta dell’hosting
L'hosting condiviso, con risorse spartite tra migliaia di siti, limita fisicamente il TTFB. Un VPS o un server dedicato con Nginx/Caddy e caching adeguata porta il TTFB a 20–80 ms per i contenuti statici.
CDN (Content Delivery Network)
Cloudflare, BunnyCDN, Fastly — risponde il nodo edge più vicino invece del server di origine. Per contenuti statici o in cache il TTFB scende a 10–50 ms. Per i contenuti dinamici dipende dalla configurazione della cache edge.
HTTP/2 e HTTP/3 (QUIC)
HTTP/2 elimina l’head-of-line blocking e supporta il multiplexing. HTTP/3 su QUIC accelera ulteriormente l’apertura della connessione (0-RTT) ed è resiliente alla perdita di pacchetti sulle reti mobili.
Geolocalizzazione del server
La distanza fisica tra utente e server aggiunge ~1 ms ogni 100 km (andata e ritorno). Per un pubblico principalmente europeo, un server a Francoforte o Amsterdam è sensibilmente più veloce di US-East.

Compressione e codifica

  • Attiva Brotli (br) — risparmia il 15–25% rispetto a gzip con velocità di decompressione comparabile. Supportato da tutti i browser moderni.
  • Mantieni gzip come fallback per i client più vecchi. Minimo: livello di compressione 6.
  • Configura la compressione per HTML, CSS, JS, JSON, XML, SVG. Le immagini e i file binari sono già compressi — applicarvi gzip non ottiene nulla.
  • Usa l’header Vary: Accept-Encoding così la CDN memorizza in cache versioni separate per client diversi.

Caching lato server

Le pagine dinamiche (PHP, Node.js, Python) interrogano il database a ogni richiesta. Una cache permette di servire l’HTML pronto senza ricalcolarlo.

  • Full-page cache: Nginx FastCGI Cache, Varnish, Redis — conserva l’HTML pronto e lo serve senza toccare l’applicazione.
  • Object cache: Redis o Memcached per cachare i risultati delle query al database, le sessioni e i dati calcolati.
  • Regole di invalidazione: la cache va svuotata quando il contenuto cambia (webhook del CMS, scadenza basata su TTL).
  • Stale-while-revalidate: servi subito la cache non aggiornata e rigenerala in background — gli utenti non aspettano la rigenerazione.
Per Next.js: ISR (Incremental Static Regeneration) è un meccanismo stale-while-revalidate integrato. Una pagina viene generata una volta e aggiornata in background in base all'impostazione revalidate: N secondi. Il TTFB è veloce come per i file statici, mentre i dati restano freschi.

Ottimizzazione degli asset: immagini, font, CSS

Immagini

Le immagini sono in genere la categoria più pesante del payload della pagina. Un'ottimizzazione corretta porta un risparmio di traffico del 30–70% e incide direttamente sull'LCP.

TecnicaRisparmioPriorità
WebP invece di JPEG/PNG25–35%Alta
AVIF invece di JPEG/PNG40–55%Alta (90%+ di supporto nei browser)
Compressione lossless (PNG → oxipng)5–20%Media
Dimensioni corrette (srcset + sizes)50–80% su mobileAlta
Lazy loading per le immagini fuori schermoRisparmia richieste al caricamentoAlta
fetchpriority="high" per l’immagine LCP0,5–1,5 s di LCPCritica

Usa l’elemento <picture> per servire il formato giusto: AVIF ai browser che lo supportano, WebP come fallback, JPEG/PNG per i browser legacy. Il componente Image di Next.js lo gestisce automaticamente.

Font

  • Ospita i font in autonomia: servi i .woff2 dal tuo dominio — elimina la risoluzione DNS, l’handshake TCP e la dipendenza dalla CDN di Google Fonts.
  • Preload dei font critici: <link rel="preload" as="font" type="font/woff2" crossorigin> nella <head> — il browser inizia a caricare prima che il CSS sia analizzato.
  • font-display: swap — il browser mostra il font di sistema mentre quello personalizzato carica. Elimina il FOIT (testo invisibile).
  • Subsetting dei font: carica solo i glifi necessari (latino + cirillico). Strumenti: glyphhanger o fonttools.
  • Usa i variable font — un file invece di più pesi (regular, bold, italic). Risparmia il 30–50% del peso totale dei font.

CSS

Critical CSS inline
Gli stili above-the-fold vengono incorporati direttamente nella <head> dentro un tag <style> — il browser renderizza la prima schermata senza aspettare un file CSS esterno. Il resto del CSS carica in modo asincrono.
Minificazione
Rimozione di spazi, commenti e accorciamento delle proprietà. Cssnano o LightningCSS. Risparmio tipico: 10–30% della dimensione originale.
Rimozione del CSS inutilizzato
PurgeCSS, UnCSS o il meccanismo integrato del framework (Tailwind purge). Particolarmente importante con Bootstrap o Material UI — trascinano dentro migliaia di regole inutilizzate.
Evita @import nel CSS
Il @import nel CSS crea richieste sequenziali: il browser carica il file, scopre il @import e solo allora inizia a caricare il file successivo. Usa tag <link> per il caricamento parallelo.

JavaScript: render-blocking e main thread

JavaScript è il principale avversario della Page Speed sui siti moderni. Blocca il rendering, occupa il main thread e ritarda l'interattività. Obiettivo: JS minimo nel critical path, uso massimo di defer/async/dynamic import.

Strategie di caricamento

AttributoComportamentoQuando usarlo
NessunoBlocca l’analisi dell’HTML, esegue subitoSolo codice critico inline
asyncCarica in parallelo, esegue quando pronto (può interrompere il parsing)Script indipendenti (analytics)
deferCarica in parallelo, esegue dopo l’analisi dell’HTMLLa maggior parte degli script della pagina
type="module"Differito per impostazione predefinita + supporto ESMScript ESM moderni

Bundle e code splitting

  • Code splitting: dividi il JS in chunk — carica solo ciò che serve alla pagina corrente. In Next.js avviene automaticamente per pagina.
  • Dynamic import: import('module') per i componenti non necessari al caricamento iniziale (modali, tab, filtri).
  • Tree shaking: metti nel bundle solo il codice davvero usato. Webpack e Rollup lo fanno per i pacchetti ESM. Controlla: ci sono dipendenze CommonJS che rompono il tree shaking?
  • Analisi dei bundle: bundlephobia.com per controllare le dimensioni dei pacchetti npm, @next/bundle-analyzer per Next.js — mostra esattamente cosa occupa spazio.
  • Evita le librerie monolitiche grandi: moment.js (67 KB) → day.js (2 KB), lodash → singole utility, jQuery → JS nativo.
Le Long Task — attività del main thread oltre i 50 ms — sono una causa diretta di un INP scarso. Controllale in DevTools → Performance. Colpevoli tipici: parsing di JSON grandi, accesso sincrono a localStorage, re-render costosi di React.

SPA e rendering lato server

Le SPA client-side (React senza SSR, Angular, Vue con CSR) restituiscono HTML vuoto e generano il contenuto nel browser. Il risultato è un LCP alto e un Time to Interactive scarso.

SSR (Server-Side Rendering)
L'HTML completo viene generato sul server. Il browser riceve subito il contenuto pronto. LCP, FCP e Lighthouse Score migliorano sensibilmente. Richiede l'idratazione lato client — considera il TTI (Time to Interactive).
SSG (Static Site Generation)
L'HTML viene generato al build. Massima velocità di TTFB e LCP. Adatto ai contenuti che cambiano raramente: blog, documentazione, landing page.
PPR (Partial Prerendering)
Novità di Next.js 15: shell statica della pagina con parti dinamiche in streaming. L' shell statica viene servita all'istante dalla CDN, mentre i dati dinamici arrivano in streaming appena pronti.

Caching: browser e CDN

Una cache configurata correttamente è l'ottimizzazione più economica e ad alto impatto per i visitatori di ritorno. Obiettivo: tutti gli asset statici in cache per 1 anno; HTML — cache minima o nessuna.

Tipo di risorsaCache-ControlStrategia di invalidazione
JS/CSS con hash (bundle.abc123.js)max-age=31536000, immutableL’hash cambia quando cambia il file
Immaginimax-age=2592000 (30 giorni)URL con versione o Content Hash
Pagine HTMLno-cache o max-age=0, must-revalidateSempre riverificate con il server
Fontmax-age=31536000, immutableHash nell’URL o versionamento
Risposte APICache-Control: private, max-age=60Dipende dalla frequenza di cambiamento dei dati
  • Hash basato sul contenuto (fingerprinting): Webpack, Vite e Next.js aggiungono automaticamente un hash del contenuto ai nomi dei file. Quando il codice cambia — nuovo hash, la vecchia cache non viene più usata.
  • ETag e Last-Modified: se il client ha già la risorsa, il server risponde 304 Not Modified senza corpo. Meno traffico, ma resta un round trip di rete.
  • Service Worker: una cache programmabile nel browser. Abilita strategie complesse (Cache-First, Network-First, Stale-While-Revalidate) per le PWA e il supporto offline.
  • CDN Cache-Control: usa s-maxage per controllare la cache della CDN indipendentemente dal max-age del browser. La CDN cacha più a lungo, il browser meno.

Script di terze parti: il principale colpevole nascosto

Gli script di terze parti (analytics, chat bot, pixel, A/B test, widget) sono spesso la causa principale di TBT e INP scarsi. La pagina commerciale media carica 15–30 script di terze parti.

Audit degli script di terze parti

WebPageTest → scheda «Third-party Summary» mostra quale script blocca il main thread e per quanti millisecondi. Colpevoli tipici: Intercom, Hotjar, versioni vecchie di Google Analytics (gtag senza async).

Caricamento differito

Carica gli script non critici con un ritardo: setTimeout(loadScript, 3000) dopo l’evento load. L’utente può interagire con la pagina prima che l’analytics carichi.

DNS prefetch e preconnect

<link rel="preconnect"> per i domini che contatterai sicuramente. <link rel="dns-prefetch"> per quelli probabili. Risparmio: 100–300 ms tra lookup DNS e handshake TCP per ogni dominio di terze parti.

Sostituire o rimuovere

La migliore ottimizzazione di uno script di terze parti è rimuoverlo. Perché un chat bot a pagamento su ogni pagina? Perché 5 pixel social? L'audit degli script davvero in uso rivela spesso il 30–50% di script non necessari.

Google Tag Manager è comodo ma pericoloso. Un solo tag GTM può trascinare dentro 20 script aggiunti dal marketing senza revisione degli sviluppatori. Fai audit regolari del contenitore GTM e rimuovi i tag stantii.

FAQ

Per la SEO conta di più il Lighthouse Score o i Core Web Vitals?
Per la SEO contano di più i Core Web Vitals (dati sul campo da CrUX) — sono i dati che Google usa nell’algoritmo di posizionamento. Il Lighthouse Score è un utile strumento diagnostico ma non un input diretto del ranking. Un sito con Lighthouse 60 e CrUX buono si posiziona meglio di uno con Lighthouse 95 e dati sul campo scarsi.
Con quale rapidità i miglioramenti della Page Speed incidono sul posizionamento?
CrUX si aggiorna su una finestra mobile di 28 giorni. Se migliori le metriche oggi, il segnale impiega ~4 settimane ad aggiornarsi del tutto in Google. Non aspettarti salti improvvisi di posizionamento — è un miglioramento graduale. Monitora i progressi in Search Console → Core Web Vitals.
E se Lighthouse è alto ma il sito sembra lento?
Lighthouse è uno strumento di laboratorio: testa con impostazioni fisse (di norma Moto G Power, 4G). Gli utenti reali sono su telefoni lenti, 3G instabile, da regioni lontane. Controlla i dati sul campo in PSI e Search Console. Guarda anche l'INP: la «lentezza» soggettiva spesso non riguarda il caricamento ma la reattività ai clic.
Vale la pena usare AMP per la velocità?
Nel 2024–2026 AMP ha perso gran parte dei suoi vantaggi: Google ha rimosso la priorità nel carosello Top Stories per le pagine AMP e ha introdotto i Core Web Vitals come criterio universale. Una pagina non-AMP ottimizzata con un buon LCP si posiziona alla pari di una AMP. Consiglio: non investire in AMP — investi nei CWV.
La Page Speed incide più sul posizionamento mobile che su desktop?
Sì. Google usa il Mobile-First Indexing dal 2019 — indicizza e valuta per prima la versione mobile del sito. I dati CrUX degli utenti mobile sono separati da quelli desktop, e spesso i dati mobile sono peggiori. Ottimizza prima la velocità mobile.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it