Caching del browser: come far "ricordare" i dati al tuo sito e caricarlo istantaneamente
Cache-Control, ETag, LocalStorage — non magia, ma strumenti essenziali. Capiamo quando e come usare ciascuno.
Immagina questo: un utente visita il tuo sito per la seconda volta, ma si carica come se fosse la prima — tutti gli script, gli stili e le immagini vengono scaricati di nuovo. Frustrazione, richieste inutili, carico extra sul server. Ti suona familiare?
La soluzione è un caching lato client intelligente. Non si tratta solo di "accelerare le cose"; è un principio fondamentale per costruire applicazioni web veloci e reattive.
Analizziamo tre meccanismi chiave che ogni sviluppatore frontend dovrebbe conoscere e capire quando usare ciascuno. Per chiarezza, includerò esempi in Laravel (il backend spesso gestisce la configurazione della cache).
1. Cache-Control: il direttore del caching HTTP
Questo è un header HTTP che dà al browser istruzioni rigorose su quanto tempo memorizzare una risorsa (JS, CSS, immagini, font).
- Cache-Control: public, max-age=3600 — memorizzare nella cache del browser e in qualsiasi proxy intermedio per 1 ora.
- Cache-Control: no-cache — memorizzare nella cache, ma verificare sempre la freschezza con il server.
- Cache-Control: no-store — non memorizzare affatto (per dati sensibili).
Quando usarlo: Per tutte le risorse statiche le cui versioni cambiano raramente (file di build, font, icone). Usa nomi di file con hash (app.a1b2c3.css) così puoi impostare max-age per anni.
Esempio in Laravel (per asset statici): Puoi impostare regole in .htaccess (Apache) o nella configurazione Nginx, che è spesso il metodo preferito. Tuttavia, in Laravel, puoi inviare header quando servi asset attraverso una route o un middleware:
2. ETag: verifica leggera della freschezza
ETag (Entity Tag) è un digest hash di una risorsa generato dal server. Il browser salva la risorsa e il suo ETag. Alla richiesta successiva, invia l'ETag nell'header If-None-Match. Il server confronta: se l'ETag corrisponde, la risorsa non è cambiata — restituisce una risposta vuota con stato 304 Not Modified. Questo risparmia banda e tempo.
Quando usarlo: Per dati che potrebbero cambiare, ma verificarlo da zero ogni volta è costoso (liste di prodotti, articoli, risposte API).
Esempio in Laravel: Laravel può generare automaticamente ETag per le risposte. Oppure puoi farlo manualmente:
3. LocalStorage / SessionStorage: cache dei dati dell'applicazione
Qui non si tratta di HTTP, ma della Web Storage API. Un vero e proprio archivio chiave-valore nel browser (fino a 5-10 MB). Sincrono, funziona solo all'interno della stessa origin.
- LocalStorage — persiste per sempre, finché non viene cancellato.
- SessionStorage — vive solo durante la sessione (scheda).
Quando usarlo: Per dati non critici necessari al funzionamento dell'applicazione client, dove puoi tollerare l'obsolescenza:
- Token di autorizzazione (attenzione! meglio nei cookie HttpOnly)
- Dati non critici al 100%: impostazioni del tema UI, bozze di moduli, risultati di ricerca rapidi.
- Stato dell'applicazione SPA dopo un ricaricamento della pagina.
Esempio frontend (JavaScript):
Suggerimento avanzato: Service Workers per il controllo assoluto
Per il pieno controllo sul caching e sulla funzionalità offline, considera i Service Workers. Agiscono come un proxy di rete programmabile, permettendoti di implementare strategie come "Cache First, Network Fallback" o "Stale-While-Revalidate".
Riepilogo: cosa, quando e perché
- Cache-Control + nomi di file con hash — per asset statici (CSS, JS, immagini). Risultato: Il browser li serve dal disco, facendo zero richieste di rete.
- ETag / no-cache — per dati dinamici e API. Risultato: Il browser fa una richiesta ma riceve una risposta vuota 304 se i dati sono invariati.
- LocalStorage — per lo stato dell'applicazione client. Risultato: Accesso istantaneo ai dati alle visite successive o ai ricaricamenti della pagina.
- Service Worker — per strategie avanzate offline e di prestazioni. Risultato: Controllo completo su rete e cache.
La regola d'oro: Il caching deve essere invalidabile. Ci deve sempre essere un meccanismo per eliminare i dati obsoleti (tramite cambio di nome file, aggiornamento ETag o cancellazione manuale dal LocalStorage).
Una combinazione intelligente di questi approcci riduce il numero di richieste, risparmia la banda dell'utente e rende l'interazione con il tuo sito davvero istantanea. Gli utenti lo apprezzeranno e i tuoi Core Web Vitals miglioreranno.