Évite les crashs prod : valide tes variables d’environnement au boot avec Zod. Autocomplétion TypeScript et secrets protégés dans ton projet React Router 7.
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é
Une variable manquante ou mal nommée bloque tout le déploiement... Sans validation, l’erreur n’apparaît qu’en production.
Avec Zod tu :
process.env.DATABASE_URL
) ;1npm add zod
Zod est déjà présent dans le projet (Conform), mais on l’installe ici pour les lecteurs qui partent d’un repo vierge.
serverEnvSchema
1import z from "zod"23const minLength = 4 // longueur mini partagée45const serverEnvSchema = z.object({6DATABASE_URL: z7.string({ message: "DATABASE_URL is missing" })8.min(minLength, { message: "DATABASE_URL is too short" }),910FRONTEND_URL: z11.string({ message: "FRONTEND_URL is missing" })12.min(minLength, { message: "FRONTEND_URL is too short" }),1314AWS_ACCESS_KEY_ID: z.string().min(minLength),15AWS_SECRET_ACCESS_KEY: z.string().min(minLength),16AWS_REGION: z.string().min(minLength),17AWS_S3_BUCKET_NAME: z.string().min(minLength),1819BETTER_AUTH_SECRET: z.string().min(minLength),20BETTER_AUTH_URL: z.string().min(minLength),2122STRIPE_PUBLISHABLE_KEY: z.string().min(minLength),23STRIPE_SECRET_KEY: z.string().min(minLength),24STRIPE_WEBHOOK_SECRET: z.string().min(minLength),2526RESEND_API_KEY: z.string().min(minLength),27RESEND_FROM_EMAIL: z.string().min(minLength),28})
Explications :
minLength
centralise la contrainte minimale (4 caractères ici).1export const serverEnv = serverEnvSchema.parse(process.env)
parse()
:
ProcessEnv
(auto-complétion)1declare global {2namespace NodeJS {3interface ProcessEnv extends z.infer<typeof serverEnvSchema> {}4}5}
Désormais :
1process.env.AWS_REGION // ✔ auto-complété, erreur de compile si renommé
loader
root1import { serverEnv } from "~/server/env.server"23export async function loader({ request }: Route.LoaderArgs) {4const { FRONTEND_URL } = serverEnv // ^? typé string5/* … */6return data({7/* … */,8env: { FRONTEND_URL }, // seules les clés publiques9})10}
Idée : ne transmettre au client que ce qui est nécessaire (FRONTEND_URL
ici).
1export function useEnv() {2return useRouteLoaderData<typeof loader>("root")?.env ?? null3}
Le composant peut appeler :
1const env = useEnv()2env && console.log(env.FRONTEND_URL)
Pas de fuite : les secrets (SMTP, Stripe) restent côté serveur.
Problème avant Zod | Avec le schéma Zod |
---|---|
Variable oubliée → crash prod tardif | Crash instantané, message clair |
process.env.AWSS_SECRET (typo) passe | Erreur de compilation TypeScript |
Secrets exposés par erreur | On choisit précisément env: {} |
.env
et charge-les via dotenv.la validation est reprise dans le module déploiement pour éviter un build cassé – voir /formations/react-router-7/deploiement-dune-application-react-router-7/configurer-les-github-actions.
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 ?