Cómo y cuándo cargar componentes en el navegador sin afectar el rendimiento con Astro.
Cuando usamos Astro, una de las ventajas es cómo delegamos el trabajo entre el servidor y el cliente. Podemos renderizar la mayoría del contenido en el servidor y enviar al navegador solo lo justo. Pero hay momentos en que necesitamos JavaScript del lado del cliente para mostrar componentes iteractivos —y ahí es donde entran los conocidos client:load
y client:only
.
Aunque ambos tienen un propósito similar —activar componentes en el navegador— tienen ligeras diferencias. Por eso vale la pena entender bien cómo funciona cada uno.
client:load
?Cuando usamos client:load
, Astro renderiza el componente en el servidor (SSR), genera el HTML estático y luego, cuando el navegador termina de cargar la página, activa el componente con JavaScript (o sea, lo “hidrata”).
Esto significa que el usuario ve el contenido casi de inmediato, pero la interactividad (eventos, estados, etc.) llega apenas termina la carga.
Ejemplo práctico:
---// Componente que necesita interactividad después de que la página cargueimport Counter from '../components/Counter.jsx';---
<Counter client:load />
Aquí, Counter
se renderiza en el servidor, el usuario ve el número inicial sin esperar, y luego puede interactuar una vez que se hidrata.
Esto es útil si necesitamos que el contenido esté presente en el HTML que se envía al navegador (SEO, rendimiento percibido, accesibilidad…).
client:only
?Con client:only
, el componente no se renderiza en el servidor. No hay HTML estático; el componente solo existe en el navegador.
Astro simplemente reserva el espacio y espera que el JavaScript se cargue y renderice el componente por completo en el cliente.
Ejemplo:
---// Este componente solo tiene sentido en el clienteimport Map from '../components/Map.jsx';---
<Map client:only="react" />
Aquí, Map
no se renderiza del lado del servidor. No aparece en el HTML inicial. Se carga y se muestra cuando el navegador lo permite.
Esto tiene sentido cuando el componente depende de APIs del navegador (por ejemplo, geolocalización) o cuando no tiene sentido cargarlo en el servidor porque simplemente no funcionaría.
Depende de si necesitamos el HTML inicial en el servidor o no.
client:load
.client:only
.Hay una tercera vía: otros modos de carga (client:idle
, client:visible
, etc.), pero en este artículo nos enfocamos en estos dos por su contraste claro y por ser los más usados.
Supongamos que tenemos un componente de comentarios que se conecta a una API y permite interacción. ¿Qué conviene?
client:load
.client:only
.Caso | ¿Qué usamos? |
---|---|
Queremos HTML inicial con contenido | client:load |
Solo puede existir en el navegador | client:only |
Necesitamos SEO o accesibilidad | client:load |
No importa el HTML inicial | client:only |
Trabajar con Astro implica pensar en cómo dividimos el trabajo entre el servidor y el cliente. Ni client:load
ni client:only
son mejores por sí solos; simplemente cumplen roles diferentes. Elegir bien depende de lo que queremos lograr con cada componente.
Nos ayuda siempre preguntarnos: ¿Necesitamos el HTML en el servidor o no? A partir de ahí, la decisión suele ser bastante clara.