back to top

Cos’è il Critical CSS e come estrarlo

Il web moderno corre veloce, e i tuoi utenti (e Google!) si aspettano che anche il tuo sito faccia lo stesso. Uno dei principali colli di bottiglia che rallentano il caricamento percepito e le metriche vitali come FCP (First Contentful Paint) e LCP (Largest Contentful Paint) è spesso il modo in cui gestiamo i fogli di stile CSS. In questo articolo, esploreremo a fondo un concetto fondamentale per sbloccare la velocità: il Critical CSS e le tecniche per la sua critical CSS estrazione.

Se sei uno sviluppatore che si preoccupa delle performance tanto quanto del codice pulito, preparati a scoprire come fare in modo che i tuoi siti appaiano quasi istantaneamente allo sguardo dei visitatori.

Cos’è esattamente il Critical CSS?

Immagina di aprire una pagina web. Prima che tu possa vedere qualsiasi contenuto stilizzato, il browser deve scaricare e processare i fogli di stile CSS collegati. Questo processo è “render-blocking” per impostazione predefinita: il browser non può iniziare a costruire l’albero di rendering (Render Tree) combinando HTML e CSSOM (CSS Object Model) finché non ha completato il download e il parsing di tutto il CSS.

Il Critical CSS (a volte chiamato anche “Above the Fold CSS”) è l’insieme minimo di regole CSS necessarie per visualizzare correttamente il contenuto visibile all’utente non appena la pagina viene caricata, ovvero ciò che si trova nella “viewport” iniziale o “above the fold”. Non è l’intero foglio di stile del sito, ma solo quella porzione essenziale che definisce l’aspetto degli elementi che l’utente vede per primi.

Pensa alla home page del tuo sito. Gli stili per l’header, la navigazione principale, un eventuale hero section o il primo blocco di contenuti sono probabilmente parte del Critical CSS per quella specifica pagina. Gli stili per il footer, le aree non visibili senza scrollare o elementi interattivi che compaiono solo dopo un’azione dell’utente, non fanno parte del Critical CSS iniziale.

Questo set di regole CSS critiche varia da pagina a pagina, a seconda di cosa appare nella viewport per ciascun template o contenuto.

Perché il Critical CSS migliora la velocità di caricamento?

Il motivo principale per cui il Critical CSS è così efficace nel migliorare la velocità percepita e le metriche di performance risiede nel superare il problema del CSS render-blocking.

Invece di costringere il browser ad aspettare il download di un grande file CSS esterno (che può richiedere tempo, specialmente su connessioni lente o con server distanti), il Critical CSS viene inlinato direttamente nell’<head> del documento HTML, all’interno di un tag <style>.

Quando il browser riceve l’HTML, trova immediatamente le regole CSS critiche già presenti nel documento. Può quindi iniziare immediatamente a stilizzare e visualizzare i contenuti HTML che si trovano nella viewport. Nel frattempo, il browser può scaricare il resto del CSS (quello non critico) in modo asincrono, senza bloccare il rendering iniziale.

Questo approccio ha diversi benefici tangibili:

  1. Renderizzazione quasi istantanea della viewport: Il browser non ha bisogno di una richiesta di rete aggiuntiva per ottenere gli stili iniziali. Questo riduce drasticamente il tempo necessario per il First Paint (FP) e il First Contentful Paint (FCP), dando all’utente l’impressione che la pagina sia “scattata” immediatamente.
  2. Miglioramento del Largest Contentful Paint (LCP): Se l’elemento LCP (l’elemento di contenuto più grande visibile nella viewport) dipende da CSS per essere visualizzato o dimensionato correttamente, avere quello CSS già inlinato garantisce che l’elemento possa essere renderizzato non appena l’HTML è disponibile, migliorando così il punteggio LCP. Approfondire come Ottimizzare LCP per siti più veloci è cruciale per performance eccellenti.
  3. Migliore User Experience: Un sito che mostra i contenuti visibili istantaneamente è percepito come più veloce e reattivo, riducendo la frustrazione dell’utente legata a tempi di attesa lunghi.
  4. Benefici SEO: Google e altri motori di ricerca tengono sempre più in considerazione le performance web come fattore di ranking, in particolare attraverso le Core Web Vitals. Ottimizzare FCP e LCP con la critical CSS estrazione e l’inlining contribuisce positivamente a questi segnali. Puoi trovare una panoramica aggiornata in Web Performance: introduzione ai Core Web Vitals 2025.

In sintesi, separare il CSS critico da quello non critico e inlinare il primo permette al browser di dipingere lo “scheletro” stilizzato della pagina visibile molto più velocemente, per poi caricare il resto degli stili in background.

Critical CSS estrazione: Tecniche manuali

Capire cos’è il Critical CSS è un conto, ma la vera sfida è estrarlo. Teoricamente, potresti affrontare il processo di critical CSS estrazione manualmente. Come si farebbe?

  1. Apri la pagina web che vuoi ottimizzare nel browser.
  2. Apri gli Strumenti per Sviluppatori (DevTools). Se vuoi migliorare la tua padronanza di questi strumenti, leggi anche Chrome DevTools: 5 trucchi avanzati.
  3. Analizza attentamente l’HTML e identifica tutti gli elementi che sono visibili non appena la pagina si carica (senza scrollare).
  4. Per ciascuno di questi elementi visibili, ispeziona le regole CSS che ne definiscono l’aspetto (layout, colori, font size, margini, padding, ecc.).
  5. Copia manualmente queste regole CSS e incollale in un nuovo blocco di codice.

Sembra semplice, vero? Beh, la realtà è molto più complessa. Il processo manuale di critical CSS estrazione è estremamente arduo e sconsigliato per la maggior parte dei siti reali per diversi motivi:

  • Enorme spreco di tempo: Analizzare manualmente tutte le regole per ogni singolo elemento visibile su ogni pagina o template è proibitivo, specialmente per siti con molte pagine o componenti complessi.
  • Soggetti a errori: È facile dimenticare una regola essenziale o, al contrario, includere regole non necessarie, compromettendo l’aspetto o la performance.
  • Difficile gestire la responsività: Il Critical CSS cambia in base al viewport (desktop, tablet, mobile). Estrarre manualmente il CSS per diverse dimensioni dello schermo moltiplica la complessità. Per approfondire il responsive design, puoi leggere la Guida Completa al Responsive Design con Media Query CSS.
  • Non considera le interazioni: Non tiene conto degli stili applicati tramite JavaScript o degli stati pseudo-classi (:hover, :focus, ecc.) che potrebbero essere rilevanti per gli elementi visibili.
  • Complicato da mantenere: Ogni volta che modifichi il design o la struttura della pagina “above the fold”, devi ripetere l’intero processo di critical CSS estrazione manuale per quella pagina. Un incubo per la manutenzione!

In breve, la critical CSS estrazione manuale è poco più di un esercizio didattico. Per progetti reali, abbiamo bisogno di automazione.

Critical CSS estrazione: Strumenti automatici

Fortunatamente, la comunità di sviluppatori ha creato potenti strumenti per automatizzare il processo di critical CSS estrazione. Questi tool analizzano la tua pagina web (spesso utilizzando browser headless come Puppeteer) e determinano automaticamente quali regole CSS sono effettivamente utilizzate per il rendering del contenuto visibile in uno o più viewport specificati.

Integrare uno di questi strumenti nel tuo workflow di sviluppo (tipicamente come parte del processo di build) è il modo più efficiente e sostenibile per implementare il Critical CSS.

Vediamo alcuni tra i più noti e utilizzati:

Critical by Addy Osmani

Creato e mantenuto da Addy Osmani (un ingegnere di Google specializzato in performance web), critical è uno dei tool più popolari per la critical CSS estrazione. È una libreria Node.js che puoi installare e utilizzare tramite linea di comando o come modulo nel tuo codice (ad esempio, in uno script di build con Gulp, Grunt o Webpack).

Funziona analizzando un URL o un file HTML locale e un file CSS associato, e ti restituisce il CSS critico da inlinare. Supporta la specificazione di diverse dimensioni di viewport per generare Critical CSS ottimizzato per la responsività.

È uno strumento versatile e ben documentato, ideale per progetti che utilizzano Node.js per il loro processo di build. Puoi trovare maggiori informazioni sulla sua repository GitHub ([Link esterno: Critical GitHub]).

Penthouse

Penthouse è un altro robusto generatore di Critical CSS. A differenza di critical, spesso è disponibile come servizio (API) o tramite integrazioni con build tool, anche se esiste una versione Node.js. È noto per la sua capacità di gestire scenari più complessi, come le Single Page Application (SPA) che caricano contenuti e stili dinamicamente con JavaScript.

Come critical, ti permette di specificare viewports e di analizzare pagine per estrarre il CSS necessario per la visualizzazione immediata. Può essere una scelta eccellente per progetti moderni e complessi dove altri tool potrebbero faticare a identificare correttamente il CSS critico. Puoi esplorare le sue funzionalità sul loro sito ufficiale ([Link esterno: Penthouse]).

Altri approcci e integrazioni

Molti moderni framework frontend e build tool offrono plugin o integrazioni che semplificano ulteriormente la critical CSS estrazione. Ad esempio, alcuni starter kit per React, Vue o Angular possono includere configurazioni che gestiscono automaticamente questo processo durante la build di produzione. Anche piattaforme CMS o static site generators a volte offrono funzionalità simili.

La scelta dello strumento dipende dal tuo stack tecnologico, dalla complessità del progetto e dalle tue preferenze nel workflow di sviluppo. L’importante è automatizzare la critical CSS estrazione per garantire accuratezza e manutenibilità.

Esempio pratico di implementazione

Una volta che hai estratto il Critical CSS per una specifica pagina (ad esempio, critical.css), il passo successivo è integrarlo nel tuo documento HTML.

Ecco come appare tipicamente il processo:

  1. Estrai il Critical CSS: Utilizza uno strumento automatico sul tuo file CSS completo (styles.css) e sull’HTML della pagina (ad esempio, index.html) per ottenere il contenuto del Critical CSS.
  2. Inlina il Critical CSS: Prendi il CSS estratto e inseriscilo all’interno di un tag <style> nell’<head> del tuo documento HTML. Avere una buona Struttura HTML Perfetta per il SEO aiuta a organizzare correttamente l’head.
  3. Carica il resto del CSS in modo asincrono: Il file CSS completo (styles.css) che contiene tutti gli stili del sito (incluso il Critical CSS, che è un suo sottoinsieme) deve ancora essere caricato per stilizzare il resto della pagina e gli elementi non visibili inizialmente. Tuttavia, devi caricarlo in modo che non blocchi il rendering iniziale.

Ecco uno snippet di codice HTML che illustra l’implementazione tipica:

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>La Mia Pagina Veloce</title>

    <style>
        /* Incolla qui il contenuto del tuo critical.css estratto */
        /* Esempio: */
        body { margin: 0; padding: 0; font-family: sans-serif; color: #333; }
        .header { background-color: #007bff; color: white; padding: 1rem; }
        .hero-section { text-align: center; padding: 2rem 0; }
        h1 { font-size: 2em; }
        /* ... altro Critical CSS estratto ... */
    </style>

    <link rel="stylesheet" href="/css/styles.css" media="print" onload="this.media='all'">

    <noscript><link rel="stylesheet" href="/css/styles.css"></noscript>

</head>
<body>
    <header class="header">...</header>
    <main>
        <section class="hero-section">...</section>
        </main>
    <footer>...</footer>

    <script src="/js/main.js" defer></script>

</body>
</html>

Nel codice sopra, la magia del caricamento asincrono del CSS completo avviene con l’attributo media="print" combinato con lo script onload="this.media='all'". Inizialmente, il browser considera il CSS solo per la stampa (non bloccante per la visualizzazione su schermo). Una volta che il file CSS è stato scaricato, lo script onload cambia l’attributo media in "all", applicando gli stili alla visualizzazione su schermo. Puoi trovare maggiori informazioni su tecniche di caricamento asincrono per gli script CSS e JS, inclusi Come usare async e defer nei tag script HTML. Il tag <noscript> fornisce un fallback per i browser (o utenti) che hanno JavaScript disabilitato, assicurando che gli stili vengano comunque caricati (anche se in modo potenzialmente bloccante).

Questo processo di critical CSS estrazione e inlining dovrebbe essere eseguito come parte del tuo deploy o build process, assicurando che il CSS inlinato sia sempre aggiornato in base al contenuto e agli stili attuali della pagina. Considera anche una Checklist SEO tecnica per sviluppatori frontend per integrare questa e altre ottimizzazioni nel tuo workflow.

Conclusioni e Prossimi Passi

Implementare il Critical CSS è una delle ottimizzazioni più efficaci che puoi fare per migliorare significativamente la velocità percepita del tuo sito e ottenere punteggi migliori nelle metriche di performance come FCP e LCP. Abbandonare la critical CSS estrazione manuale a favore di strumenti automatici è fondamentale per rendere questo processo scalabile e manutenibile.

Comprendere cos’è, perché è importante e come automatizzare la sua estrazione ti posiziona come uno sviluppatore attento alle performance e all’esperienza utente.

Se non l’hai ancora fatto, prova ad implementare il Critical CSS nel tuo prossimo progetto o sperimenta con uno degli strumenti automatici suggeriti su un sito esistente. I risultati in termini di velocità e percezione della performance potrebbero sorprenderti!

Condividi

Articoli Recenti

Categorie popolari