Persistenza del tema e prevenzione del flash
Salvare la preferenza del tema in localStorage e iniettare uno script bloccante per impostare il tema prima del caricamento di React
Persistenza del tema e prevenzione del flash è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.
Il problema del flash del tema errato
Quando una pagina viene caricata, React deve scaricare, analizzare ed eseguire JavaScript prima di poter leggere localStorage e applicare il tema corretto. Durante questo intervallo, il browser esegue il rendering utilizzando gli stili predefiniti. Se l'utente preferisce la modalità scura ma il valore predefinito è light, vedrà un breve flash bianco prima che il tema venga corretto.
La soluzione con script bloccante
La soluzione consiste in uno script inline inserito nel document head, che viene eseguito in modo sincrono prima di qualsiasi altro codice. Lo script legge immediatamente localStorage e imposta data-theme su document.documentElement. Poiché è uno script bloccante, il browser applica l'attributo prima di eseguire il rendering di qualsiasi contenuto.
Perché è necessario uno script bloccante
Gli script asincroni o differiti vengono eseguiti dopo l'analisi dell'HTML e potenzialmente anche dopo il primo rendering. Questo vanifica completamente lo scopo della soluzione. Lo script inline bloccante non deve avere gli attributi async o defer e non deve essere caricato da un file esterno. Deve essere molto piccolo per ridurre al minimo il costo sulle prestazioni.
Contenuto dello script inline
Lo script bloccante deve essere minimale: leggete localStorage.getItem('theme'), controllate window.matchMedia('(prefers-color-scheme: dark)').matches come alternativa e poi chiamate document.documentElement.setAttribute('data-theme', theme). Racchiudetelo in un blocco try-catch nel caso in cui localStorage non sia disponibile durante la navigazione privata.
Implementazione con Next.js
In Next.js, utilizzate il componente Script di next/script con strategy="beforeInteractive" all'interno di _document.js. La strategia beforeInteractive inserisce lo script nell'HTML della pagina prima dell'esecuzione di qualsiasi JavaScript della pagina, ottenendo lo stesso comportamento bloccante nella pipeline di build di Next.js.
Implementazione con Vite e CRA
In un progetto Vite o Create React App, modificate direttamente index.html e inserite il tag dello script inline nel head, prima di qualsiasi altro script. Poiché index.html è il punto di ingresso del browser, lo script viene eseguito prima dell'avvio di React. Mantenetelo conciso, in modo che resti sotto i 100 byte.
Soluzione SSR tramite cookie o intestazione
In un'applicazione con rendering lato server, il server può leggere il tema da un cookie inviato con la richiesta. Può quindi impostare data-theme nell'HTML generato prima di inviarlo al browser. In questo modo si evita completamente il flash lato client, perché il tema corretto è presente già nel primo byte dell'HTML.
Il flusso completo senza flash
Il flusso completo è il seguente: il browser scarica l'HTML, l'analizzatore incontra lo script inline bloccante, lo script legge localStorage e imposta data-theme, l'analisi prosegue, la pagina viene visualizzata con il tema corretto, quindi React completa l'hydration e recupera lo stesso tema da localStorage. L'utente vede un tema coerente fin dall'inizio.
Testare la prevenzione del flash
Per verificare che la soluzione funzioni, aprite Chrome DevTools, accedete alla scheda Network e impostate il throttling su Slow 3G. Ricaricate la pagina. Se durante il caricamento vedete cambiare il tema, il flash non è stato eliminato. Con lo script bloccante attivo, il primo rendering dovrebbe già mostrare il tema corretto anche con connessioni lente.
Rischio di discrepanza durante l'hydration
Se lo stato iniziale di React è impostato su light ma lo script bloccante ha impostato dark prima dell'hydration, React potrebbe mostrare un avviso di discrepanza durante l'hydration. Evitate il problema inizializzando lo stato del tema di React leggendo anch'esso localStorage durante il rendering iniziale, così l'HTML generato da React corrisponde allo stato del DOM impostato dallo script bloccante.
Flash in Storybook e negli ambienti di test
Storybook e gli ambienti di test non caricano il vostro index.html, quindi lo script bloccante non viene mai eseguito. Fornite un decorator o una configurazione di test che applichi un attributo data-theme predefinito in questi ambienti. In questo modo eviterete incoerenze visive durante lo sviluppo isolato dei componenti.
Tecnica per prevenire il flash
Quale tipo di script deve essere utilizzato nel head del documento per prevenire il flash del tema errato?
Riepilogo della lezione: persistere il tema e prevenire il flash
Prevenite il flash del tema errato inserendo nel head del documento un piccolo script inline bloccante che legga localStorage e imposti data-theme prima di qualsiasi rendering. In Next.js utilizzate strategy="beforeInteractive", mentre in Vite/CRA aggiungetelo direttamente a index.html. Le applicazioni SSR possono leggere un cookie per impostare il tema lato server.
Domande Frequenti
La lezione «Persistenza del tema e prevenzione del flash» è gratuita?
Sì — il testo completo di «Persistenza del tema e prevenzione del flash» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.
Cosa imparerò in «Persistenza del tema e prevenzione del flash»?
Salvare la preferenza del tema in localStorage e iniettare uno script bloccante per impostare il tema prima del caricamento di React Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare React Academy?
Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Persistenza del tema e prevenzione del flash»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione React Academy?
Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Rilevare lo schema colori del sistema
- Variabili CSS per cambiare tema
- React Context per lo stato del tema
- Persistenza del tema e prevenzione del flash