From 6fbddca2dd363ff2ec60f4e979d2ce86a7e852c9 Mon Sep 17 00:00:00 2001 From: Christophe Porteneuve Date: Wed, 30 Aug 2023 11:11:27 +0200 Subject: [PATCH] copy(renderToReadableStream): full reviewed translation --- TRANSLATORS.md | 1 + .../server/renderToReadableStream.md | 243 +++++++++--------- 2 files changed, 124 insertions(+), 120 deletions(-) diff --git a/TRANSLATORS.md b/TRANSLATORS.md index db5f57809..008eb40d8 100644 --- a/TRANSLATORS.md +++ b/TRANSLATORS.md @@ -107,6 +107,7 @@ Voici la liste par ordre alphabétique (prénom, nom). **🙏🏻 Mille mercis
  • API React DOM côté serveur (accueil chapitre)
  • renderToNodeStream
  • renderToPipeableStream
  • +
  • renderToReadableStream
  • renderToStaticMarkup
  • renderToStaticNodeStream
  • renderToString
  • diff --git a/src/content/reference/react-dom/server/renderToReadableStream.md b/src/content/reference/react-dom/server/renderToReadableStream.md index 8ef42aa71..040f15aec 100644 --- a/src/content/reference/react-dom/server/renderToReadableStream.md +++ b/src/content/reference/react-dom/server/renderToReadableStream.md @@ -4,7 +4,7 @@ title: renderToReadableStream -`renderToReadableStream` renders a React tree to a [Readable Web Stream.](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) +`renderToReadableStream` fait le rendu d'un arbre React dans un [flux Readable Web Stream](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream). ```js const stream = await renderToReadableStream(reactNode, options?) @@ -16,17 +16,17 @@ const stream = await renderToReadableStream(reactNode, options?) -This API depends on [Web Streams.](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API) For Node.js, use [`renderToPipeableStream`](/reference/react-dom/server/renderToPipeableStream) instead. +Cette API dépend des [Web Streams](https://developer.mozilla.org/fr/docs/Web/API/Streams_API). Pour Node.js, utilisez plutôt [`renderToPipeableStream`](/reference/react-dom/server/renderToPipeableStream). --- -## Reference {/*reference*/} +## Référence {/*reference*/} ### `renderToReadableStream(reactNode, options?)` {/*rendertoreadablestream*/} -Call `renderToReadableStream` to render your React tree as HTML into a [Readable Web Stream.](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) +Appelez `renderToReadableStream` pour faire le rendu HTML d'un arbre React au moyen d'un [flux Readable Web Stream](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream). ```js import { renderToReadableStream } from 'react-dom/server'; @@ -41,44 +41,44 @@ async function handler(request) { } ``` -On the client, call [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) to make the server-generated HTML interactive. +Côté client, appelez [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) pour rendre interactif ce HTML généré côté serveur. -[See more examples below.](#usage) +[Voir d'autres exemples ci-dessous](#usage). -#### Parameters {/*parameters*/} +#### Paramètres {/*parameters*/} -* `reactNode`: A React node you want to render to HTML. For example, a JSX element like ``. It is expected to represent the entire document, so the `App` component should render the `` tag. +* `reactNode` : un nœud React dont vous souhaitez produire le HTML. Ça pourrait par exemple être un élément JSX tel que ``. C'est censé produire le document entier, de sorte que le composant `App` devrait produire la balise ``. -* **optional** `options`: An object with streaming options. - * **optional** `bootstrapScriptContent`: If specified, this string will be placed in an inline ` ``` -On the client, your bootstrap script should [hydrate the entire `document` with a call to `hydrateRoot`:](/reference/react-dom/client/hydrateRoot#hydrating-an-entire-document) +Côté client, votre script de démarrage devrait [hydrater le `document` entier avec un appel à `hydrateRoot`](/reference/react-dom/client/hydrateRoot#hydrating-an-entire-document) : ```js [[1, 4, ""]] import { hydrateRoot } from 'react-dom/client'; @@ -134,23 +134,24 @@ import App from './App.js'; hydrateRoot(document, ); ``` -This will attach event listeners to the server-generated HTML and make it interactive. +Ça attachera les gestionnaires d'événements au HTML généré côté serveur pour le rendre interactif. -#### Reading CSS and JS asset paths from the build output {/*reading-css-and-js-asset-paths-from-the-build-output*/} +#### Lire les chemins de ressources CSS et JS depuis la sortie du *build* {/*reading-css-and-js-asset-paths-from-the-build-output*/} -The final asset URLs (like JavaScript and CSS files) are often hashed after the build. For example, instead of `styles.css` you might end up with `styles.123456.css`. Hashing static asset filenames guarantees that every distinct build of the same asset will have a different filename. This is useful because it lets you safely enable long-term caching for static assets: a file with a certain name would never change content. +Les URL finales de ressources (telles que les fichiers JavaScript et CSS) contiennent souvent une empreinte générée par le *build* Par exemple, plutôt que `styles.css`, vous pourriez vous retrouver avec `styles.123456.css`. L'injection d'empreinte dans les noms de fichiers des ressources statiques garantit que chaque nouveau *build* d'une même ressource aura un nom différent (si son contenu a changé). C'est pratique pour mettre en place sans danger des stratégies de cache à long terme pour les ressources statiques : un fichier avec un nom donné ne changera jamais de contenu. -However, if you don't know the asset URLs until after the build, there's no way for you to put them in the source code. For example, hardcoding `"/styles.css"` into JSX like earlier wouldn't work. To keep them out of your source code, your root component can read the real filenames from a map passed as a prop: +Seulement voilà, si vous ne connaissez pas les URL des ressources avant la fin du *build*, vous n'avez aucun moyen de les mettre dans votre code source. Par exemple, ça ne servirait à rien de coder en dur `"/styles.css"` dans votre JSX, comme dans le code vu plus haut. Pour garder les noms finaux hors de votre code source, votre composant racine peut lire les véritables noms depuis une table de correspondance qui lui serait passée en prop : ```js {1,6} export default function App({ assetMap }) { return ( - My app + ... + ... ... @@ -158,47 +159,50 @@ export default function App({ assetMap }) { } ``` -On the server, render `` and pass your `assetMap` with the asset URLs: +Côté serveur, faites le rendu de `` et passez-lui une `assetMap` avec les URL des ressources : -```js {1-5,8,9} -// You'd need to get this JSON from your build tooling, e.g. read it from the build output. +```js {1-6,9-10} +// Vous devrez récupérer ce JSON depuis votre outil de build, +// par exemple en lisant son affichage résultat. const assetMap = { 'styles.css': '/styles.123456.css', 'main.js': '/main.123456.js' }; -async function handler(request) { - const stream = await renderToReadableStream(, { - bootstrapScripts: [assetMap['/main.js']] - }); - return new Response(stream, { - headers: { 'content-type': 'text/html' }, +app.use('/', (request, response) => { + const { pipe } = renderToPipeableStream(, { + bootstrapScripts: [assetMap['main.js']], + onShellReady() { + response.setHeader('content-type', 'text/html'); + pipe(response); + } }); -} +}); ``` -Since your server is now rendering ``, you need to render it with `assetMap` on the client too to avoid hydration errors. You can serialize and pass `assetMap` to the client like this: +Dans la mesure où votre serveur fait désormais le rendu de ``, vous devez lui passer cette `assetMap` côté client aussi, pour éviter toute erreur lors de l'hydratation. Vous pouvez la sérialiser et la passer au client comme ceci : ```js {9-10} -// You'd need to get this JSON from your build tooling. +// Vous récupérereriez ce JSON depuis votre outil de build. const assetMap = { 'styles.css': '/styles.123456.css', 'main.js': '/main.123456.js' }; -async function handler(request) { - const stream = await renderToReadableStream(, { - // Careful: It's safe to stringify() this because this data isn't user-generated. +app.use('/', (request, response) => { + const { pipe } = renderToPipeableStream(, { + // Attention : on peut stringify() ça sans danger parce que ça ne vient pas des utilisateurs. bootstrapScriptContent: `window.assetMap = ${JSON.stringify(assetMap)};`, - bootstrapScripts: [assetMap['/main.js']], - }); - return new Response(stream, { - headers: { 'content-type': 'text/html' }, + bootstrapScripts: [assetMap['main.js']], + onShellReady() { + response.setHeader('content-type', 'text/html'); + pipe(response); + } }); -} +}); ``` -In the example above, the `bootstrapScriptContent` option adds an extra inline `