renderToString
renderToString
не підтримує потокове передавання або очікування даних. Дивіться альтернативні варіанти.
renderToString
рендерить дерево React в HTML-рядок.
const html = renderToString(reactNode)
Посилання
renderToString(reactNode)
На сервері викличте renderToString
, щоб відрендерити ваш застосунок у HTML.
import { renderToString } from 'react-dom/server';
const html = renderToString(<App />);
На клієнтській стороні викликати hydrateRoot
, щоб зробити згенерований сервером HTML інтерактивним.
Дивіться більше прикладів нижче.
Параметри
reactNode
: Вузол React, який ви хочете відрендерити в HTML. Наприклад, JSX-вузол типу<App />
. .
опція
опції
: Об'єкт для серверного рендерингу.- optional
identifierPrefix
: Рядковий префікс, який React використовує для ідентифікаторів, згенерованихuseId
. Корисно для уникнення конфліктів при використанні декількох коренів на одній сторінці. Має бути той самий префікс, що був переданий доhydrateRoot
.
- optional
Повернення
Рядок HTML.
Застереження
renderToString
має обмежену підтримку Suspense. Якщо компонент призупиняється,renderToString
негайно надсилає свій запасний варіант у вигляді HTML.renderToString
працює у браузері, але використовувати його у клієнтському коді не рекомендується.
Використання
Перетворення дерева React як HTML у рядок
Викличте renderToString
, щоб згенерувати ваш застосунок у HTML-рядок, який ви можете надіслати разом із відповіддю сервера:
import { renderToString } from 'react-dom/server';
// The route handler syntax depends on your backend framework
app.use('/', (request, response) => {
const html = renderToString(<App />);
response.send(html);
});
Це створить початковий неінтерактивний HTML-виведення ваших React-компонентів. На стороні клієнта вам потрібно буде викликати hydrateRoot
, щоб гідратувати згенерований сервером HTML і зробити його інтерактивним.
renderToString
не підтримує потокове передавання або очікування даних. Дивіться альтернативні варіанти.
Альтернативи
Перехід з renderToString
на потоковий метод на сервері
renderToString
повертає рядок одразу, тому не підтримує потокове передавання або очікування даних.
За можливості рекомендуємо використовувати ці повнофункціональні альтернативи:
- Якщо ви використовуєте Node.js, використовуйте
renderToPipeableStream
. - Якщо ви використовуєте Deno або сучасне середовище виконання з Web Streams, використовуйте
renderToReadableStream
.
Ви можете продовжити використання renderToString
, якщо ваше серверне середовище не підтримує потоки.
Видалення renderToString
з коду клієнта
Іноді renderToString
використовується на клієнтській стороні для перетворення деяких компонентів у HTML.
// 🚩 Unnecessary: using renderToString on the client
import { renderToString } from 'react-dom/server';
const html = renderToString(<MyIcon />);
console.log(html); // For example, "<svg>...</svg>"
Імпорт react-dom/server
на клієнтській стороні надмірно збільшує розмір пакета і його слід уникати. Якщо вам потрібно відрендерити якийсь компонент в HTML у браузері, використовуйте createRoot
і зчитайте HTML з 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); // For example, "<svg>...</svg>"
Виклик flushSync
необхідний для того, щоб оновити DOM перед читанням його властивості innerHTML
.
Налагодження
Коли компонент призупиняється, HTML завжди має запасний варіант
renderToString
не повністю підтримує Suspense.
Якщо якийсь компонент призупиняється (наприклад, через те, що його визначено за допомогою lazy
або він отримує дані), renderToString
не чекатиме, поки його вміст буде виправлено. Замість цього renderToString
знайде найближчу межу <Suspense>
над нею і відрендерить свій проп fallback
у HTML. Вміст не з'явиться, поки не завантажиться клієнтський код.
Щоб вирішити цю проблему, скористайтеся одним із рекомендованих потокових рішень. Вони можуть передавати вміст частинами, коли він вирішується на сервері, щоб користувач бачив поступове заповнення сторінки до завантаження клієнтського коду.