Aunque puedes usar el método renderToString
para renderizar el HTML en el servidor, este método es síncrono y bloquea el hilo principal. Para evitar que bloquee el hilo principal, debemos usar el método renderToPipeableStream
:
let didError = false
const stream = renderToPipeableStream(
<App />,
{
onShellReady() {
// El contenido por encima de los límites de Suspense ya están listos
// Si hay un error antes de empezar a hacer stream, mostramos el error adecuado
res.statusCode = didError ? 500 : 200
res.setHeader('Content-type', 'text/html')
stream.pipe(res)
},
onShellError(error) {
// Si algo ha ido mal al renderizar el contenido anterior a los límites de Suspense, lo indicamos.
res.statusCode = 500
res.send(
'<!doctype html><p>Loading...</p><script src="clientrender.js"></script>'
)
},
onAllReady() {
// Si no quieres hacer streaming de los datos, puedes usar
// esto en lugar de onShellReady. Esto se ejecuta cuando
// todo el HTML está listo para ser enviado.
// Perfecto para crawlers o generación de sitios estáticos
// res.statusCode = didError ? 500 : 200
// res.setHeader('Content-type', 'text/html')
// stream.pipe(res)
},
onError(err) {
didError = true
console.error(err)
},
}
)