11. Déploiement
En développement, deux serveurs travaillent ensemble : le serveur de développement de [Vite] (le client) et le serveur JSON (l'API). En production, il n'y en a plus qu'un :

1. Construire le client. Dans le dossier [rdvmedecins-react] :
La console affiche :
D'abord, [tsc --noEmit] vérifie les types de tout le projet : [Vite] ne le fait pas, il se contente d'effacer la syntaxe de [TypeScript]. Une erreur de type arrête la construction. Puis [Vite] construit, dans le dossier [dist/], toute l'application : une page [index.html], des feuilles de style, et des fichiers [JavaScript] optimisés :
- [bibliotheques-....js] : le code des bibliothèques ([React], [React Router], [TanStack Query], [i18next]...), rangé dans un fichier à part par la configuration de [vite.config.ts]. Il change rarement : d'une version de l'application à l'autre, le navigateur le garde en cache. [bibliotheques-....css] : la feuille de style de [Bootstrap] ;
- [index-....js] : NOTRE code, celui des pages chargées tout de suite (connexion, agenda) et du reste de l'application ;
- chaque page chargée à la demande ([lazy], cf. [routes.tsx]) a son propre fichier ([MonCompte-....js]...), téléchargé à la première visite ; [ChampsPersonne-....js] et [personnes.config-....js] contiennent du code commun à plusieurs de ces pages ;
- au démarrage, le navigateur télécharge environ 170 ko une fois compressés par le serveur (colonne gzip), dont 150 ko pour les bibliothèques ;
- le nom de chaque fichier contient une empreinte de son contenu ([index-C7BOzjUE.js]) : une nouvelle version aura un autre nom, et un navigateur ne pourra jamais garder en cache une version périmée. Seul [index.html] garde son nom : c'est lui qui désigne les autres fichiers.
On peut essayer la version construite avec [npm run preview] (http://localhost:4173, avec le même proxy vers le serveur JSON).
2. La déposer dans le serveur. On copie le CONTENU du dossier [dist/] dans un dossier [client/] à la racine du serveur JSON ([rdvmedecins-nestjs-json/client/index.html], [rdvmedecins-nestjs-json/client/assets/...]), puis on relance le serveur. Il affiche :
L'application complète est alors à l'adresse http://localhost:8080. Le serveur sert les fichiers du client, et renvoie [index.html] pour toute autre adresse hors de /api : recharger la page /agenda fonctionne (c'est le routeur du client qui l'affiche). Pour le lecteur curieux, c'est le fichier [src/web/client-spa.ts] du serveur qui fait ce travail.
3. En production réelle, on n'oubliera pas le fichier [.env] du serveur :
- un [JWT_SECRET] long et aléatoire ;
- [CAPTCHA_TEST] vide ;
- [COOKIE_SECURE=true] si le site est servi en HTTPS (il doit l'être : les mots de passe circulent) ;
- [TRUST_PROXY=true] si le serveur est placé derrière un proxy ([nginx]...), pour que la limitation des tentatives voie l'adresse IP réelle des clients.
On lance alors le serveur compilé : [npm run build], puis [npm run start:prod].