Dans cette leçon on va apprendre à mettre en cache une route React Router 7 via la fonction headers et l’en-tête Cache-Control pour booster la performance.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
Dans React Router 7, tu peux contrôler le cache HTTP de tes routes en exportant une fonction headers()
directement dans ton module de route. En définissant le header Cache-Control, tu indiques aux navigateurs et aux caches CDN (Vercel, Netlify, Cloudflare…) pendant combien de temps ils peuvent servir une version mise en cache de ta page sans faire d’appel serveur.
Note
Ce mécanisme ne remplace pas le refetch côté client () pour les données très dynamiques. On le conseille surtout pour des pages statiques ou des listes qui n’évoluent pas toutes les secondes (ex. page de blog, mentions légales…).
Par défaut, le serveur de développement Remix/React Router désactive le cache pour garantir que tu vois toujours la dernière version :
1# Tu lances `npm run dev` et dans l'onglet Network de ton navigateur2# tu repères la requête GET /users (par exemple)3Cache-Control: max-age=0
Chaque requête charge donc la donnée depuis le serveur avec un délai artificiel (ex. 100 ms) qui simule l’accès DB.
headers
Pour ajouter du cache, il suffit d’exporter dans ton fichier de route une fonction headers
qui renvoie un objet de HeadersInit :
1export function headers() {2return {3// 300 s côté navigateur, 1 h côté CDN4"Cache-Control": "public, max-age=300, s-maxage=3600"5};6}
Tooltip
s-maxage
cible les caches partagés (CDN).
Après avoir déployé sur Vercel/Netlify, tu verras dans l’onglet Network :
1Cache-Control: public, max-age=300, s-maxage=36002X-Cache: HIT # (dépend de ton hébergeur)
Tu peux aussi autoriser le CDN à servir une version « légèrement périmée » tout en déclenchant un fetch de fond :
1export function headers() {2return {3"Cache-Control": [4"public",5"max-age=300", // 5 min en cache6"s-maxage=3600", // 1 h CDN7"stale-while-revalidate=60" // 1 min pendant le rechargement en arrière-plan8].join(", ")9};10}
Tip
stale-while-revalidate
permet une UX « toujours disponible » lorsque la version cache commence à vieillir.
max-age=86400, s-maxage=86400
max-age=300, s-maxage=600
max-age=0, s-maxage=0, no-cache, no-store
max-age
vaut pour le navigateur client, le s-maxage
pour le CDN.npm run dev
. Il faut déployer pour tester le vrai comportement.headers()
dans ton module de route pour contrôler le cache.max-age
= durée en secondes pour le navigateur.s-maxage
= durée pour les caches partagés (CDN).stale-while-revalidate
= permet de servir du stale en attendant le rafraîchissement./blog
, ajoute stale-while-revalidate=120
./api/users
.max-age=10, s-maxage=60
./settings
, exporte headers()
pour renvoyer Cache-Control: no-store
si l’utilisateur n’est pas admin.Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?