renderToString
renderToString renderiza uma árvore React para uma string HTML.
const html = renderToString(reactNode, options?)Referência
renderToString(reactNode, options?)
No servidor, chame renderToString para renderizar seu app para HTML.
import { renderToString } from 'react-dom/server';
const html = renderToString(<App />);No cliente, chame hydrateRoot para tornar o HTML gerado pelo servidor interativo.
Parâmetros
-
reactNode: Um nó React que você quer renderizar para HTML. Por exemplo, um nó JSX como<App />. -
opcional
options: Um objeto para renderização no servidor.- opcional
identifierPrefix: Um prefixo de string que o React usa para IDs gerados poruseId. Útil para evitar conflitos ao usar múltiplos roots na mesma página. Deve ser o mesmo prefixo passado parahydrateRoot.
- opcional
Retornos
Uma string HTML.
Ressalvas
-
renderToStringtem suporte limitado para Suspense. Se um componente suspender,renderToStringimediatamente envia seu fallback como HTML. -
renderToStringfunciona no navegador, mas usá-lo no código do cliente não é recomendado.
Usage
Renderizando uma árvore React como HTML para uma string
Chame renderToString para renderizar seu app para uma string HTML que você pode enviar com a resposta do seu servidor:
import { renderToString } from 'react-dom/server';
// A sintaxe do manipulador de rota depende da sua framework de backend
app.use('/', (request, response) => {
const html = renderToString(<App />);
response.send(html);
});Isso produzirá a saída HTML inicial não interativa dos seus componentes React. No cliente, você precisará chamar hydrateRoot para hidratar o HTML gerado pelo servidor e torná-lo interativo.
Alternativas
Migrando de renderToString para uma renderização de streaming no servidor
renderToString retorna uma string imediatamente, logo não suporta streaming de conteúdo conforme ele carrega.
Quando possível, recomendamos o uso destas alternativas com todos os recursos:
- Se você usa Node.js, use
renderToPipeableStream. - Se você usa Deno ou um tempo de execução de borda moderno com Web Streams, use
renderToReadableStream.
Você pode continuar usando renderToString se seu ambiente de servidor não suporta streams.
Migrando de renderToString para uma pré-renderização estática no servidor
renderToString retorna uma string imediatamente, logo não suporta esperar pelos dados carregarem para a geração HTML estática.
Recomendamos usar essas alternativas com todos as funcionalidades:
- Se você usa Node.js, use
prerenderToNodeStream. - Se você usar Deno ou um tempo de execução de borda moderno com Web Streams, use
prerender.
Você pode continuar usando renderToString se seu ambiente de geração de site estático não suporta streams.
Removendo renderToString do código do cliente
Às vezes, renderToString é usado no cliente para converter algum componente para HTML.
// 🚩 Desnecessário: usando renderToString no cliente
import { renderToString } from 'react-dom/server';
const html = renderToString(<MyIcon />);
console.log(html); // Por exemplo, "<svg>...</svg>"Importar react-dom/server no cliente aumenta desnecessariamente o tamanho do seu bundle e deve ser evitado. Se você precisa renderizar algum componente para HTML no navegador, use createRoot e leia HTML do 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); // Por exemplo, "<svg>...</svg>"A chamada flushSync é necessária para que o DOM seja atualizado antes de ler sua propriedade innerHTML.
Solução de problemas
Quando um componente suspende, o HTML sempre contém um fallback
renderToString não suporta totalmente Suspense.
Se algum componente suspender (por exemplo, porque é definido com lazy ou busca dados), renderToString não esperará que seu conteúdo seja resolvido. Em vez disso, renderToString encontrará o limite <Suspense> mais próximo acima dele e renderá sua prop fallback no HTML. O conteúdo não aparecerá até que o código do cliente carregue.
Para resolver isso, use uma das soluções de streaming recomendadas. Para renderização no lado do servidor, elas podem fazer streaming do conteúdo em pedaços à medida que ele é resolvido no servidor, de modo que o usuário veja a página sendo progressivamente preenchida antes que o código do cliente carregue. Para a geração de site estático, elas podem esperar que todo o conteúdo seja resolvido antes de gerar o HTML estático.