Par défaut, SvelteKit va rendre (ou [pré-rendre](glossary#Prerendering)) tout composant d'abord sur
le serveur puis l'envoyer au client en tant que HTML. Le composant sera ensuite rendu de nouveau
dans le navigateur pour le rendre interactif dans un processus appelée
[**hydratation**](glossary#Hydration). Pour cette raison, vous devez vous assurer que les composants
puissent être exécutés à la fois sur le serveur et dans le navigateur. Puis Sveltekit initialisera
un [**routeur**](routing) côté client qui va prendre le relais pour toutes les navigations à venir.
Vous pouvez contrôler chacune de ces étapes page par page en exportant des options depuis les
fichiers [`+page.js`](routing#page-page.js) ou [`+page.server.js`](routing#page-page.server.js), ou
pour des groupes de page en exportant ces options depuis un fichier
[`+layout.js`](routing#layout-layout.js) ou [`+layout.server.js`](routing#layout-layout.server.js)
partagé par les pages concernées. Pour définir une option pour toute l'application, exportez-la
depuis le layout racine. Les layouts enfants et les pages surchargent les valeurs des options
définies dans des layouts parents, ce qui veut dire que, — par exemple — vous pouvez activer le
pré-rendu pour toute votre application puis le désactiver pour les pages qui ont besoin d'être
rendues dynamiquement.
Vous pouvez mélanger ces options à différents endroits de votre application. Par exemple, vous
pourriez pré-rendre votre page marketing pour optimiser sa vitesse d'affichage, rendre sur le
serveur vos pages dynamiques pour en optimiser le référencement et l'accessibilité, et faire de
votre section d'administration une SPA en la rendant uniquement côté client. Tout cela rend
SvelteKit très versatile.
## prerender
Il est probable qu'au moins quelques unes des routes de votre application puisse être représentées
comme un simple fichier HTML généré au moment de la compilation. Ces routes peuvent être
[_pré-rendues_](glossary#Prerendering).
```js
/// file: +page.js/+page.server.js/+server.js
export const prerender = true;
```
Vous pouvez également définir `export const prerender = true` dans votre fichier `+layout.js` ou
ou `+layout.server.js` racine, et pré-rendre toute votres application à l'exception des pages
qui se définissent explicitement comme ne devant _pas_ être pré-rendues :
```js
/// file: +page.js/+page.server.js/+server.js
export const prerender = false;
```
Les routes avec `prerender = true` seront exclues des manifestes utilisés pour le rendu côté serveur
(SSR) dynamique, diminuant le poids de votre serveur (ou de vos fonctions serverless/edge). Dans
certains cas, vous pourriez vouloir pré-rendre une route mais également l'inclure dans le manifeste
(par exemple, avec une route comme `/blog/[slug]`, dont vous souhaitez pré-rendre le contenu le plus
populaire/récent mais rendre sur le serveur le reste) — pour ces situations, il existe une
troisième option, `'auto'` :
```js
/// file: +page.js/+page.server.js/+server.js
export const prerender = 'auto';
```
> [!NOTE] Si toute votre application est compatible avec le pré-rendu, vous pouvez utiliser
> l'adaptateur [`adapter-static`](adapter-static), qui va générer des fichiers pouvant être utilisés
> avec n'importe quel serveur web statique.
Le processus de pré-rendu commence à la racine de votre application et génère des fichiers pour
toutes les pages ou routes `+server.js` pouvant être pré-rendues qu'il trouve. Chaque page est
scannée à la recherche d'éléments `` pointant vers d'autres pages candidates au pré-rendu — pour
cette raison, vous n'avez pas besoin de préciser quelles pages doivent être accessibles au processus
de pré-rendu. Si vous _devez_ préciser les pages devant être accessibles au processus de pré-rendu,
vous pouvez le faire avec [`config.kit.prerender.entries`](configuration#prerender), ou en exportant
une fonction [`entries`](#entries) de votre route dynamique.
Pendant le pré-rendu, la valeur de `building` importée depuis [`$app/environment`]($app-environment)
sera `true`.
### Pré-rendu des routes de serveur [!VO]Prerendering server routes
À la différence des autres options de page, `prerender` s'applique aussi aux fichiers `+server.js`.
Ces fichiers ne sont _pas_ affectés par les layouts, mais hériteront des valeurs par défaut de
l'option des pages qui leur demandent des données, s'il en existe. Par exemple, si un fichier
`+page.js` contient cette fonction `load`...
```js
/// file: +page.js
export const prerender = true;
/** @type {import('./$types').PageLoad} */
export async function load({ fetch }) {
const res = await fetch('/my-server-route.json');
return await res.json();
}
```
... alors le fichier `src/routes/my-server-route.json/+server.js` sera traité comme candidat au
pré-rendu s'il ne contient pas son propre `export const prerender = false`.
### Quand ne pas pré-rendre [!VO]When not to prerender
La règle d'or est la suivante : pour qu'une page puisse être pré-rendue, deux personnes arrivant
directement sur cette page doivent obtenir le même contenu du serveur.
> [!NOTE] Toutes les pages ne sont pas compatibles avec le pré-rendu. Tout contenu qui est pré-rendu
> sera vu par toutes les utilisateurs et utilisatrices. Vous pouvez bien sûr récupérer des données
> personnalisées via `onMount` dans une page pré-rendue, mais cela peut se traduire en une moins
> bonne expérience utilisateur, puisque cela implique d'afficher initialement un contenu vide ou des
> indicateurs de chargement.
Notez que vous pouvez toujours pré-rendre des pages qui chargent leurs données en fonction des
paramètres de page, comme sur une route `src/routes/blog/[slug]/+page.svelte`.
Lire [`url.searchParams`](load#Using-URL-data-url) pendant le pré-rendu est interdit. Si vous devez
vous en servir, assurez-vous que vous le faites uniquement dans le navigateur (par exemple avec
`onMount`).
Les pages comportant des [actions](form-actions) ne peuvent pas être prérendues, car un serveur doit
être capable de gérer les requêtes `POST` venant de l'action.
### Conflits de route [!VO]Route conflicts
Puisque le pré-rendu écrit dans le système de fichiers, il n'est pas possible d'avoir deux endpoints
qui génèreraient un dossier et un fichier avec le même nom. Par exemple, `src/routes/foo/+server.js`
et `src/routes/foo/bar/+server.js` vont essayer de créer `foo` et `foo/bar`, ce qui est impossible.
Pour cette raison parmi d'autres, il est recommandé de toujours inclure une extension de fichier —
`src/routes/foo.json/+server.js` et `src/routes/foo/bar.json/+server.js` vont créer des fichiers
`foo.json` et `foo/bar.json` qui peut coexister en harmonie côte-à-côte.
Pour les _pages_, nous contournons ce problème en écrivant `foo/index.html` au lieu de `foo`.
### Résolution de problèmes [!VO]Troubleshooting
Si vous rencontrez une erreur comme 'The following routes were marked as prerenderable, but were not
prerendered' ("Les routes suivantes ont été marquées comme devant être
pré-rendues, mais n'ont pas été pré-rendues"), c'est parce que la route en question (ou
éventuellement un layout parent, si c'est une page) a l'option `export const prerender = true` mais
la page n'a pas été atteinte par le processus de pré-rendu, et n'a donc pas été pré-rendue.
Puisque ces routes ne peuvent pas être dynamiquement rendues sur le serveur, ceci va causer des
erreurs pour les personnes qui essaieraient d'accéder à la route en question. Il y a quelques moyens
de régler ce problème :
* Assurez-vous que SvelteKit peut trouver la route en suivant des liens depuis
les entrées précisées dans [`config.kit.prerender.entries`](configuration#prerender) ou dans
l'option de page [`entries`](#entries). Ajoutez des liens aux routes dynamiques (c-à-d les pages
avec des `[parameters]`) à cette option si celles-ci ne sont pas trouvables en passant par les
autres point d'entrée, sans quoi elles ne seront pas pré-rendues car SvelteKit ne peut pas savoir
quelles valeurs les paramètres peuvent avoir. Les pages non marquées comme pouvant être pré-rendues
seront ignorées et leurs liens vers d'autres pages ne seront pas utilisés lors du processus de
pré-rendu, même si certaines d'entre elles pourraient être pré-rendues.
* Assurez-vous que SvelteKit peut trouver la route en découvrant un lien la ciblant depuis l'une des
autres pages pré-rendues ayant du rendu côté serveur activé.
* Changez `export const prerender = true` en `export const prerender = 'auto'`. Les routes avec
`'auto'` peuvent être dynamiquement rendues sur le serveur.
## entries
SvelteKit va découvrir les pages à pré-rendre automatiquement, en commençant par les _points
d'entrée_ et en les parcourant. Par défaut, toutes vos routes non dynamiques sont considérées comme
des points d'entrée — par exemple, si vous avez ces routes...
```bash
/ # non dynamique
/blog # non dynamique
/blog/[slug] # dynamique, à cause de `[slug]`
```
... SvelteKit va prérendre `/` and `/blog`, et au cours du processus découvrir des liens comme ` [!NOTE] Si toutes vos options de page sont des valeurs booléenes ou des chaînes de caractères
> litérales, SvelteKit va les évaluer de manière statique. Sinon, il va importer votre fichier
> `+page.js` ou `+layout.js` sur le serveur (à la fois lors de compilation et à l'exécution si votre
> application n'est pas complètement statique) afin d'en évaluer les options. Dans le deuxième cas,
> du code exclusif au navigateur ne doit pas être exécuté lorsque le module se charge. En pratique,
> ceci signifie que vous devriez plutôt importer votre code exclusif au navigateur dans votre
> fichier `+page.svelte` ou `+layout.svelte`.
## csr
D'ordinaire, SvelteKit [hydrate](glossary#Hydration) votre HTML rendu sur le serveur (SSR) en une
page interactive rendue sur le client (CSR). Certaines pages ne nécessitent pas du tout JavaScript —
la plupart des articles de blog et des pages "à propos" tombent dans cette catégorie. Dans ces
cas-là vous pouvez désactiver le CSR.
```js
/// file: +page.js
export const csr = false;
// Si à la `ssr` et `csr` sont `false`, rien ne sera affiché !
```
Désactiver le CSR permet de ne pas envoyer de JavaScript au client. Cela signifie :
* La page web doit pouvoir fonctionner avec uniquement du HTML et du CSS.
* Les balises `