Saltar al contenido principal

Islas

  • Relacionado con las integraciones (React, Vue, Svelte, etc.) para añadir dinamismo
  • Las islas son un pequeño bloque o componentes de otras tecnologías
  • El beneficio más obvio de crear con Astro Islands es el rendimiento
  • La mayor parte del sitio web se convierte a HTML estático y rápido, y JavaScript solo se carga para los componentes individuales que lo necesitan (ej. un carrusel de imágenes.
  • La técnica en la que se basa este patrón arquitectónico también se conoce como hidratación parcial o selectiva.
  • De forma predeterminada, Astro renderizará automáticamente cada componente de la interfaz de usuario solo en HTML y CSS, eliminando automáticamente todo el JavaScript del lado del cliente.

Islas de cliente

  • Una isla de cliente es un componente de interfaz de usuario de JavaScript interactivo que se hidrata por separado del resto de la página.
  • Para convertir cualquier componente de interfaz de usuario estático en una isla interactiva, solo se necesita una directiva client:*.
  • Y como la interacción se configura a nivel de componente, se puede manejar distintas prioridades de carga para cada componente en función de su uso.
  • En Astro el desarrollado tiene la responsabilidad de indicarle explícitamente qué componentes de la página también deben ejecutarse en el navegador.
<!-- Estatico -->
<MySvelteComponent />

<!-- Componente que renderiza HTML -->
<MySvelteComponent client:load />

<!-- Componente interactivo -->
<MySvelteComponent client:only="svelte" />

Directivas

  • Estas directivas controlan cómo se hidratan los componentes de UI Framework en la página.
  • De forma predeterminada, un componente de UI Framework no se hidrata en el cliente.
  • Si no se proporciona ninguna directiva client:*, el HTML se muestra en la página sin JavaScript.
DirectivaPrioridadDescripción
client:loadAltaElementos que deben ser interactivos lo antes posible. Carga e hidrata el componente JS inmediatamente al cargar la página.
client:idleMediaLe indica a un componente que se cargue cuando el navegador se vuelve inactivo.

Carga e hidrata el componente JS una vez que la página haya terminado su carga inicial.
client:idle={{timeout: 500}}El tiempo máximo de espera, en milisegundos, antes de hidratar el componente, incluso si la página aún no ha terminado su carga inicial.
client:visibleBajaCarga cuando el componente se muestra en pantalla
client:visible={{rootMargin: "200px"}}Carga cuando entra al margen establecido
client:mediaBajaElementos que solo pueden ser visibles en ciertos tamaños de pantalla.

client:media="(max-width: 50em)"
client:only="Ssvelte"Para renderizar el componente de algún framework en el cliente.

Similar a client:load ya que carga, representa e hidrata el componente inmediatamente después de cargar la página.

Omite la representación del servidor (SSR) del HTML y la representa solo en el cliente.

Se debe pasar el marco correcto del componente como valor.

En el caso de los componentes que se representan solo en el cliente, client:only, también es posible mostrar contenido de respaldo mientras se cargan.

<ClientComponent client:only="vue">
<div slot="fallback">Loading</div>
</ClientComponent>

Islas de servidor

  • Una isla de servidor es un componente Astro renderizado en un servidor normal al que se le indica que retrase la renderización hasta que su contenido esté disponible.
  • La página se mostrará inmediatamente con cualquier contenido de respaldo especificado como marcador de posición. Luego, el contenido propio del componente se obtiene en el cliente y se muestra cuando está disponible.
  • No depende de ninguna infraestructura de servidor, por lo que funcionará con cualquier host, desde un servidor Node.js en un contenedor Docker hasta el proveedor sin servidor cualquiera.

Componente

  • Es un componente normal
  • Estos componentes pueden hacer todo lo que normalmente se haría en una página renderizada a pedido, como obtener contenido y acceder a cookies:
src/components/Avatar.astro
---
import { getUserAvatar } from '../sessions';
const userSession = Astro.cookies.get('session');
const avatarURL = await getUserAvatar(userSession);
---

<img alt="User avatar" src={avatarURL} />

Uso

  • Se debe agregar la directiva server:defer
src/pages/index.astro
---
import Avatar from '../components/Avatar.astro';
import GenericAvatar from '../components/GenericAvatar.astro';
---
<Avatar server:defer>
<GenericAvatar slot="fallback" />
</Avatar>