renderToString
renderToString fait le rendu d’un arbre React sous forme de texte HTML.
const html = renderToString(reactNode, options?)Référence
renderToString(reactNode, options?)
Côté serveur, appelez renderToString pour produire le HTML de votre appli.
import { renderToString } from 'react-dom/server';
const html = renderToString(<App />);Côté client, appelez hydrateRoot pour rendre interactif ce HTML généré côté serveur.
Voir d’autres exemples ci-dessous.
Paramètres
reactNode: un nœud React dont vous souhaitez produire le HTML. Ça pourrait par exemple être un élément JSX tel que<App />.optionsoptionnelles : un objet avec des options pour le rendu côté serveur.identifierPrefixoptionnel : un préfixe textuel utilisé pour les ID générés paruseId. Pratique pour éviter les conflits entre les ID au sein de racines multiples sur une même page.
Valeur renvoyée
Une chaîne de caractères contenant le HTML.
Limitations
-
renderToStringn’a qu’une prise en charge limitée de Suspense. Si votre composant suspend,renderToStringrenverra immédiatement le HTML de son JSX de secours. -
renderToStringfonctionne côté navigateur, mais nous déconseillons de l’utiliser côté client.
Utilisation
Produire le HTML d’un arbre React sous forme d’une chaîne de caractères
Appelez renderToString pour produire le texte HTML de votre appli, que vous pourrez alors renvoyer dans votre réponse serveur :
import { renderToString } from 'react-dom/server';
// La syntaxe du gestionnaire de route dépend de votre
// framework côté serveur
app.use('/', (request, response) => {
const html = renderToString(<App />);
response.send(html);
});Ça produira le HTML initial, non interactif, de vos composants React. Côté client, vous aurez besoin d’appeler hydrateRoot pour hydrater ce HTML généré côté serveur et le rendre interactif.
Alternatives
Migrer de renderToString vers une méthode de streaming côté serveur
renderToString renvoie immédiatement un texte, elle ne prend donc en charge ni le streaming ni la suspension pour chargement de données.
Autant que possible nous conseillons d’utiliser plutôt une de ces alternatives plus capables :
- Si vous utilisez Node.js, utilisez
renderToPipeableStream. - Si vous utilisez Deno ou un moteur léger moderne doté des Web Streams, utilisez
renderToReadableStream.
Vous pouvez continuer avec renderToString si votre environnement serveur ne prend pas en charge les flux.
Retirer renderToString du code côté client
Il arrive que renderToString soit utilisée côté client pour convertir un composant en HTML.
// 🚩 Inutile : utilisation de renderToString côté client
import { renderToString } from 'react-dom/server';
const html = renderToString(<MyIcon />);
console.log(html); // Par exemple "<svg>...</svg>"L’import de react-dom/server côté client augmente pour rien la taille de votre bundle, nous vous le déconseillons donc. Si vous avez besoin d’obtenir côté client le HTML d’un composant, utilisez createRoot puis lisez le HTML directement depuis le DOM :
import { createRoot } from 'react-dom/client';
import { flushSync } from 'react-dom';
const div = document.createElement('div');
const root = createRoot(div);
flushSync(() => {
root.render(<MyIcon />);
});
console.log(div.innerHTML); // Par exemple "<svg>...</svg>"L’appel à flushSync est nécessaire pour que le DOM soit bien mis à jour avant de lire la propriété innerHTML.
Dépannage
Quand un composant suspend, le HTML reflète la version de secours
renderToString ne prend pas pleinement en charge Suspense.
Si un composant suspend (il est par exemple défini via lazy ou charge des données), renderToString n’attendra pas l’aboutissement du traitement. renderToString cherchera plutôt le périmètre <Suspense> parent le plus proche et affichera le HTML de sa prop fallback. Le contenu n’apparaîtra pas jusqu’à ce que le code client soit chargé.
Pour résoudre ça, utilisez une de nos solutions recommandées de streaming. Elles peuvent streamer le contenu par morceaux au fil de l’aboutissement des traitements côté serveur, afin que l’utilisateur puisse bénéficier d’un chargement progressif de la page avant même que le code client ne soit chargé.