Hydration en profundidad: ¿un “mal necesario” de los frameworks frontend modernos?
1. Las ventajas y los problemas del SSR
El renderizado del lado del servidor (SSR) mejora enormemente la “velocidad de carga de la primera pantalla” (FCP) de las aplicaciones web. El navegador recibe directamente el contenido HTML completo y lo renderiza de inmediato, por lo que el usuario puede ver la página muy pronto, algo muy favorable tanto para el SEO como para la percepción del usuario.
Sin embargo, en ese momento la página solo es una “carcasa estática”. Aunque parece haber terminado de cargar, los clics en botones y las interacciones con campos de entrada no producen ninguna respuesta. Para dar “vida” a esta página estática necesitamos un proceso llamado Hydration.
2. ¿Qué es Hydration?
Hydration es el proceso mediante el cual el framework JavaScript del cliente “toma el control” del HTML estático renderizado por el servidor.
El proceso es, a grandes rasgos, el siguiente:
- El navegador descarga y ejecuta los paquetes JavaScript que necesita la página, como el runtime de React o Vue y el código de la aplicación.
- El framework reconstruye el árbol de componentes en memoria.
- El framework recorre el DOM renderizado por el servidor y conecta listeners de eventos, como
onClick, a los nodos DOM correspondientes. - El framework garantiza que el estado de los componentes en el cliente coincida con el estado usado durante el renderizado en el servidor.
Solo entonces la página se vuelve realmente interactiva. Podemos imaginar Hydration así: recibes un modelo de LEGO ya montado (HTML), pero para hacer que una de sus piezas se mueva debes leer de principio a fin todo el manual de montaje (JS), comprobar la posición de cada bloque y, solo después, instalar una batería en esa pieza (conectar listeners de eventos).
3. El problema de Hydration: “una interfaz interactiva no interactiva”
Hydration resuelve la falta de interacción de las páginas SSR, pero también crea un nuevo cuello de botella de rendimiento, conocido como “valle inquietante” (Uncanny Valley) o “brecha de Hydration” (Hydration Gap).
El problema es el intervalo entre el momento en que el usuario ve el contenido de la página (FCP) y el momento en que esta puede responder realmente a sus interacciones (TTI). Durante ese intervalo, la página parece utilizable, pero en realidad está “congelada”.
Las causas son:
- Bloqueo por la descarga y ejecución de JS: El navegador debe descargar, analizar y ejecutar una gran cantidad de JavaScript antes de poder iniciar Hydration.
- Coste de arranque elevado: El framework debe realizar mucho trabajo en el cliente para reconstruir el árbol de componentes y conectar listeners, aunque el 90 % de la página sea contenido estático no interactivo.
4. Optimizaciones y alternativas a Hydration
Para resolver los problemas de rendimiento de Hydration, la comunidad ha explorado varios patrones más avanzados.
a. Hydration parcial (Partial Hydration)
La arquitectura de islas (Islands Architecture) popularizada por Astro es una implementación típica de Hydration parcial. Su idea central es que, de forma predeterminada, todos los componentes producen únicamente HTML estático (cero JS). Los componentes que necesitan interacción se pueden marcar explícitamente como “islas”.
Durante la compilación, Astro solo empaqueta y envía JavaScript para esos componentes “isla”. Así, el navegador solo hidrata unas pocas partes aisladas de la página, en lugar de la página completa, y reduce enormemente la cantidad de JavaScript que debe cargar y ejecutar al arrancar.
b. Hydration progresiva (Progressive Hydration)
Es una estrategia de optimización más granular que hidrata los componentes siguiendo un orden de prioridad. Por ejemplo, puede hidratar primero los componentes dentro del viewport o aquellos con los que el usuario está a punto de interactuar, y retrasar los componentes no críticos situados al final de la página.
c. Reanudabilidad (Resumability)
El framework Qwik propone un concepto revolucionario, la reanudabilidad (Resumability), cuyo objetivo es eliminar Hydration por completo.
Funciona de la siguiente manera:
- Serialización: En el servidor, Qwik serializa todo el estado de la aplicación, las relaciones entre componentes, la información de los listeners de eventos y otros datos, y los incrusta en el HTML.
- Reanudación: En el cliente, el diminuto runtime de Qwik (aproximadamente 1KB) no necesita reconstruir el árbol de componentes ni conectar todos los eventos al arrancar. Mediante un listener global, puede saber con precisión qué pequeño fragmento de código debe descargar y ejecutar cuando el usuario pulsa un botón concreto.
El objetivo de Qwik es lograr una interacción Instant-on. No “vuelve a ejecutar” el trabajo del servidor, sino que “reanuda” la ejecución desde el punto donde el servidor se detuvo.
Conclusión
Hydration es el puente entre el renderizado del servidor y la interacción del cliente, pero en las implementaciones tradicionales es un proceso costoso que puede perjudicar la experiencia del usuario. Los frameworks frontend modernos intentan dejar atrás este “mal necesario” mediante patrones innovadores como la Hydration parcial (Astro) y la reanudabilidad (Qwik), avanzando hacia un rendimiento extremo y una interacción más rápida.