React Academy · Leçon

Conserver le thème et éviter le flash

Enregistrez la préférence de thème dans localStorage et injectez un script bloquant pour définir le thème avant le chargement de React

Leçon 4 sur 413 étapes

Conserver le thème et éviter le flash est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.

Le problème de l'affichage fugace du mauvais thème

Lorsqu'une page se charge, React doit télécharger, analyser et exécuter JavaScript avant de pouvoir lire localStorage et appliquer le thème correct. Pendant cet intervalle, le navigateur affiche les styles par défaut. Si l'utilisateur préfère le mode sombre alors que votre valeur par défaut est le mode clair, il voit un bref écran blanc avant la correction du thème.

La solution du script bloquant

La solution consiste à placer un script intégré directement dans l'document head, qui s'exécute de manière synchrone avant tout autre code. Ce script lit immédiatement localStorage et définit data-theme sur document.documentElement. Comme il bloque l'exécution, le navigateur applique l'attribut avant d'afficher le moindre contenu.

Pourquoi le blocage est nécessaire

Les scripts asynchrones ou différés s'exécutent après l'analyse du HTML et potentiellement après le premier affichage. Cela annule entièrement l'objectif recherché. Le script intégré directement et bloquant ne doit avoir aucun attribut async ou defer et ne doit pas être chargé depuis un fichier externe. Il doit être très court afin de réduire au minimum le coût en performances.

Le contenu du script intégré

Le script bloquant reste minimal : lisez localStorage.getItem('theme'), vérifiez window.matchMedia('(prefers-color-scheme: dark)').matches comme solution de repli, puis appelez document.documentElement.setAttribute('data-theme', theme). Entourez-le d'une gestion des exceptions au cas où localStorage ne serait pas disponible en navigation privée.

Implémentation avec Next.js

Dans Next.js, utilisez le composant Script de next/script avec strategy="beforeInteractive" dans _document.js. La stratégie beforeInteractive injecte le script dans le HTML de la page avant l'exécution de tout code JavaScript de la page, ce qui reproduit le comportement bloquant dans la chaîne de traitement de compilation Next.js.

Implémentation avec Vite et CRA

Dans un projet Vite ou Create React App, modifiez directement index.html et placez la balise de script intégrée directement dans l'head, avant tout autre script. Comme index.html est le point d'entrée du navigateur, le script s'exécute avant le démarrage de React. Gardez-le concis pour rester sous la limite de 100 octets.

Solution SSR via un cookie ou un en-tête

Dans une application générée côté serveur, le serveur peut lire le thème à partir d'un cookie envoyé avec la requête. Il définit ensuite data-theme dans le HTML généré avant de l'envoyer au navigateur. Cela évite entièrement l'affichage fugace côté client, car le thème correct se trouve dès le premier octet du HTML.

Le flux complet sans affichage fugace

Le flux complet est le suivant : le navigateur télécharge le HTML, l'analyseur rencontre le script intégré bloquant, le script lit localStorage et définit data-theme, l'analyseur poursuit son travail, la page est affichée avec le thème correct, puis React s'hydrate et récupère le même thème depuis localStorage. L'utilisateur voit un thème cohérent dès le début.

Tester la prévention de l'affichage fugace

Pour vérifier que la correction fonctionne, ouvrez Chrome DevTools, accédez à l'onglet Réseau et limitez la vitesse à 3G lente. Rechargez la page. Si vous voyez le thème changer pendant le chargement, l'affichage fugace n'est pas corrigé. Avec le script bloquant en place, le premier affichage doit déjà présenter le thème correct, même avec une connexion lente.

Risque de divergence lors de l'hydratation

Si l'état initial de votre thème React prend par défaut la valeur claire alors que le script bloquant a défini la valeur sombre avant l'hydratation, React peut signaler une divergence lors de l'hydratation. Évitez ce problème en initialisant également l'état du thème React en lisant localStorage lors du rendu initial, afin que le HTML rendu par React corresponde à l'état du DOM défini par le script bloquant.

Affichage fugace dans Storybook et les environnements de test

Storybook et les environnements de test ne chargent pas votre index.html ; le script bloquant ne s'y exécute donc jamais. Fournissez un décorateur ou une configuration de test qui applique un attribut data-theme par défaut dans ces environnements. Cela évite les incohérences visuelles déroutantes lors du développement isolé des composants.

Technique de prévention de l'affichage fugace

Quel type de script doit être utilisé dans l'en-tête du document pour empêcher l'affichage fugace du mauvais thème ?

Récapitulatif de la leçon : conserver le thème et empêcher l'affichage fugace

Empêchez l'affichage fugace du mauvais thème en injectant dans l'en-tête du document un petit script intégré bloquant qui lit localStorage et définit data-theme avant tout affichage. Dans Next.js, utilisez strategy="beforeInteractive" ; dans Vite ou CRA, ajoutez-le directement à index.html. Les applications SSR peuvent lire un cookie pour définir le thème côté serveur.

Gratuit pour commencer

Apprends React avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
88
Leçons
324

Questions Fréquemment Posées

La leçon « Conserver le thème et éviter le flash » est-elle gratuite ?

Oui — le texte complet de « Conserver le thème et éviter le flash » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Conserver le thème et éviter le flash » ?

Enregistrez la préférence de thème dans localStorage et injectez un script bloquant pour définir le thème avant le chargement de React Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer React Academy ?

Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Conserver le thème et éviter le flash » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon React Academy ?

Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Détecter le thème de couleurs du système
  2. Variables CSS pour changer de thème
  3. Contexte React pour l’état du thème
  4. Conserver le thème et éviter le flash
← Retour à React Academy