¿Cómo completar el proceso de server-side rendering?
Cada vez estamos más cerca de completar el proceso de server-side rendering en nuestra aplicación de React. Este proceso lleva consigo varias etapas, desde la generación del template hasta el envío del primer árbol del DOM en formato texto plano. El último paso es hidratar nuestra aplicación de React con JavaScript y algunas configuraciones adicionales del lado del cliente. El objetivo es lograr que nuestra aplicación funcione adecuadamente tanto en el servidor como en el cliente.
¿Cómo se configura el build del cliente?
Para configurar el build del cliente, empezamos modificando el archivo package.json. Se agrega un script que utiliza la configuración de Webpack que habíamos utilizado previamente. Aquí es importante retirar el plugin de Webpack que genera HTML, ya que ahora el HTML se enviará directamente desde el servidor. El nuevo script de build se nombrará 'client', y es crucial asegurarse de que esta configuración se genere correctamente, limpiando la carpeta dist y ejecutando el build para verificar los resultados.
La creación de un script de build general es fundamental para el correcto funcionamiento de nuestra aplicación, ya que permite construir tanto el cliente como el servidor. Para ello, configuramos el entorno de node a producción y aseguramos que el script sea capaz de realizar builds separadas para cada parte de la aplicación.
{"scripts":{"build":"NODE_ENV=production npm run build:client && npm run build:server"}}
¿Cómo exponer JavaScript desde el servidor?
Para exponer el JavaScript generado desde el servidor, utilizamos un middleware de Express llamado static, que permite servir archivos estáticos al cliente. Esta configuración se hace sobre la carpeta dist donde se generó el build del cliente.
Adicionalmente, es necesario modificar el template.tsx para incluir una etiqueta <script> que refiera al archivo JavaScript del cliente. Este archivo se carga en el momento preciso para permitir la correcta hidratación de los elementos.
Durante el proceso de hidratación es común enfrentar un doble render de nuestra aplicación. Para solucionar este inconveniente, es crucial ajustar el HTML generado y almacenarlo directamente dentro del div con id="app", que es donde React inserta la aplicación.
En el archivo index.tsx, se sustituye el método createRoot por hydrateRoot para aprovechar la estructura ya existente del árbol de elementos, lo que evita la duplicación de contenido durante la ejecución del JavaScript.
¿Cómo verificar el funcionamiento del server-side rendering?
Para comprobar que el server-side rendering está funcionando correctamente, basta con desactivar JavaScript en el navegador y recargar la aplicación. Si el contenido aún es visible, significa que el renderizado del lado del servidor está implementado con éxito. Al reactivar JavaScript, la aplicación debería hidratarse y funcionar sin problemas. Además, es posible verificar en la pestaña de "sources" que el servidor está enviando el archivo app.js.
Este proceso asegura que nuestra aplicación de React se comporte adecuadamente, funcionando tanto en modo client-side como server-side rendering. Además, en las próximas etapas se explorarán otras optimizaciones y técnicas de mejora como el prefetching, que incrementarán la eficiencia del servidor y la experiencia del usuario final. ¡Sigue adelante y continúa explorando el fascinante mundo del server-side rendering en React!
Es interesante ver cómo hasta al mismo profesor comete errores que cualquiera como programador podría tener, como olvidar poner un simple NODE_ENV=production en una línea de código.
Lo importante es, que lo resuelve junto con nosotros para que nos demos cuenta que todos podemos equivocarnos y todo tiene solución😀
Segunda vez que tomo este curso, y no deja de encantarme y sorprenderme.
Por qué cambia la vista al agregarse el "NODE_ENV=production" al script de start? porque afecta eso la forma en que se muestra la app.
yo tengo la misma pregunta
En los webpack config de server y client ocupas las variables de entorno, debe ser por eso
como seria con vite, mas simple?
tengo la misma duda
Por qué cuando apenas me sirve la web no se hidrata?, cuando navego a otra seccion y vuelvo a la original si carga el javascript , igual pasa si recargo pareciera que perdiera los estilos?
Nos puedes mostrar tu código para poder ayudarte, please
Agregamos a nuestro scripts: build cross-env
codigo:"build": "cross-env NODE_ENV=production npm run build-client && npm run build-server"
instalamos la dependencia :
Por si surge algún error cuando queramos hacer yarn build
cuando agrego app.use(express.static('dist')) deja de retornar en html base , y si desactivo javascript no se visualiza nada , probe directamente en la rama hydratation-process , reinstalando node_modules y aun asi observo el mismo conportamiento al agregar app.use(express.static('dist'))
al hacer mas pruebas al aparecer al encotrar en dist app.use( express.static("dist")); no llega nunca a buscar a ejecutar app.get("*", (req: Request, res: Response) => { res.send(render(req.url));});
com solucion encontre reubicar el archivo dist/index,js a "dist/server/index.js",
Hay alguna diferencia entre retornar un string y un archivo HTML desde un endpoint del servidor? Entiendo que ambos son texto plano, pero se me generó esa duda.
Que curso más espectacular, esto amplia als posibilidades de usar el server de nackend que querramos como express y fastify de js, flask y fastAPI con py.