modulo 03 / lezione 18
Osservare il programma
Storage del browser: cosa, dove, perché
Distinguere localStorage, sessionStorage, cookies, IndexedDB e cache del Service Worker. Sapere quando il dato persiste e quando no.
In parole semplici
Il browser ha molti modi di conservare dati. Sembra dettaglio tecnico finché un bug non rivela che “il dato non si salva” ma in realtà si salva nel posto sbagliato. Conoscere i contenitori risparmia ore di indagine sterile.
Parole nuove
- localStorage: chiave/valore stringa, persiste fino a cancellazione manuale.
- sessionStorage: chiave/valore stringa, persiste solo per la tab.
- cookie: piccolo dato inviato automaticamente con ogni richiesta HTTP.
- IndexedDB: database asincrono in-browser, capace di gigabyte.
- Cache API: cache di richieste/risposte HTTP, usata dai Service Worker.
- memory state: stato in variabili JavaScript; sparisce al refresh.
Cosa impari
- Scegliere il contenitore giusto per ogni tipo di dato.
- Aprire e leggere ogni contenitore in DevTools.
- Diagnosticare bug del tipo “il dato sembra perso” o “il dato vecchio non sparisce”.
La tabella dei contenitori
| Contenitore | Vita | Dimensione | Sincrono? | Inviato al server? | Tipo di dati |
|---|---|---|---|---|---|
| memoria (variabili JS) | fino al refresh | RAM | sì | no | qualunque |
| sessionStorage | fino alla chiusura della tab | ~5 MB | sì | no | stringhe |
| localStorage | fino a cancellazione manuale | ~5 MB | sì | no | stringhe |
| cookie | fino a Expires |
~4 KB ciascuno | sì | sì | stringhe |
| IndexedDB | fino a cancellazione manuale | centinaia di MB / GB | asincrono | no | strutturati (oggetti, blob) |
| Cache API | fino a cancellazione | grande | asincrono | no | request/response HTTP |
Dove guardare in DevTools
Chrome/Edge: tab Application → pannelli “Local Storage”, “Session Storage”, “Cookies”, “IndexedDB”, “Cache Storage”.
Firefox: tab Storage.
Safari: tab Storage.
Tutti permettono di vedere, modificare, cancellare singoli valori.
Bug tipici per contenitore
localStorage
- “Il dato non c’è dopo refresh” → controlla che
localStorage.setItemvenga davvero chiamato e con quale chiave. - “Il dato è una stringa strana” →
localStoragesalva solo stringhe. Per oggetti deviJSON.stringifyin scrittura eJSON.parsein lettura. - “Quota exceeded” → ~5 MB. Se superi, eccezione
QuotaExceededError.
sessionStorage
- “Il dato c’era e adesso non c’è” → hai aperto nuova tab. sessionStorage è per-tab.
Cookie
- “Il cookie non parte con la richiesta” →
SameSite,Secure,HttpOnlyoPathnon compatibili (modulo 8). - “Il server vede un valore vecchio” → il cookie non è stato aggiornato; controlla
Set-Cookienella response.
IndexedDB
- “La transazione non si conclude” → IndexedDB è asincrono e basato su callback/promise. Una transazione si chiude appena lo stack svuota: se aspetti un
awaitesterno, perdi la transazione. - “Il database non si apre” → versione cambiata senza migrazione (
onupgradeneeded).
Cache API / Service Worker
- “Vedo una vecchia versione del sito” → un Service Worker sta servendo la cache. Vedi prossima sezione.
Service Worker e cache aggressiva
Un Service Worker è uno script che intercetta le richieste della pagina. Spesso restituisce risposte dalla Cache API anziché contattare il server. Sintomi tipici:
- Modifichi il sito, ricarichi, vedi la vecchia versione.
- Network mostra
(from ServiceWorker). - “Hard reload” non aiuta.
Diagnosi:
- DevTools → Application → Service Workers. Vedi i SW registrati.
- Click su “Unregister” per quel SW.
- Application → Cache Storage → svuota cache pertinente.
- Ricarica.
Approfondimento nel modulo 7 (lezione su SW).
Quale contenitore per cosa
- Token di sessione: cookie (HttpOnly, Secure) — non leggibile da JS, sicuro contro XSS.
- Preferenze tema/lingua: localStorage — persiste sempre, non serve al server.
- Dato temporaneo della sessione corrente: sessionStorage — sparisce alla chiusura.
- Dati grandi e strutturati offline: IndexedDB.
- Cache asset / risposte: Cache API gestita da SW.
Scegliere il contenitore sbagliato è una delle cause più frequenti di bug “il dato non torna come mi aspetto”.
Esercizio guidato
Crea una piccola pagina con quattro pulsanti:
- Salva una preferenza tema in localStorage.
- Salva un contatore in sessionStorage.
- Imposta un cookie con
document.cookie. - Salva un oggetto strutturato in IndexedDB (anche solo via console o libreria
idb).
Apri DevTools → Application. Verifica che ogni dato finisca nel posto giusto. Poi:
- Refresh: cosa rimane?
- Chiudi tab e riapri: cosa rimane?
- Apri nuova tab della stessa pagina: cosa è condiviso?
Errori frequenti del principiante
- “localStorage va in produzione tale e quale”. Sì, ma se cambi il formato del dato, gli utenti con dato vecchio si schiantano. Versiona la chiave.
- Salvare un oggetto in localStorage senza
JSON.stringify. Diventa"[object Object]". - Confondere sessionStorage e session cookie. Il primo non parte con la richiesta, il secondo sì.
- Ignorare il Service Worker. Se c’è, controlla sempre prima di altre indagini.