Astro Base Framework Moderno
Astro es el framework web que combina lo mejor del contenido estático con componentes interactivos, ofreciendo:
- Rendimiento máximo con cero JS por defecto
- Arquitectura de islas para hidratación selectiva
- Multi-framework (React, Svelte, Vue y más)
- Contenido organizado con colecciones tipadas
Arquitectura de Islas
Cada isla es un componente interactivo que se hidrata independientemente en páginas estáticas, optimizando rendimiento y SEO.
Bienvenido a nuestra tienda
Contenido estático de alto rendimiento
Categorías
- Electrónica
- Hogar
- Deportes
Listado de productos
🏝️ Carrito de compras (React)
🏝️ Buscador (Vue)
🏝️ Recomendaciones (Svelte)
Comunicación entre Islas en Astro
Las islas en Astro son componentes interactivos que se hidratan de forma independiente. Para compartir estado entre ellas, debes usar estos patrones específicos:
Event Bus
Comunicación mediante eventos personalizados del navegador, ideales para interacciones simples entre componentes.
// Emisor (Vue)
const emitEvent = () => {
window.dispatchEvent(new CustomEvent('cart-updated', {
detail: { items: cartItems }
}));
}
// Receptor (React)
useEffect(() => {
const handler = (e) => setItems(e.detail.items);
window.addEventListener('cart-updated', handler);
return () => window.removeEventListener('cart-updated', handler);
}, []);
Global State
Stores agnósticas que funcionan en cualquier framework (Nanostores, Zustand).
// store.js
import { atom } from 'nanostores';
export const $cart = atom([]);
// Isla React
import { $cart } from './store';
useEffect(() => $cart.subscribe(setItems), []);
// Isla Svelte
import { $cart } from './store';
$: items = $cart.get();
URL State
Estado persistente en la URL que todas las islas pueden leer.
// Lectura
const params = new URLSearchParams(location.search);
const category = params.get('category');
// Escritura
const updateFilters = (newFilters) => {
const params = new URLSearchParams(newFilters);
history.pushState({}, '', `?${params.toString()}`);
}
Patrones que NO funcionan
- ref.current entre componentes de diferentes islas
- Context API de React entre frameworks distintos
- Stores específicas (Vuex, Svelte stores) entre islas
- Comunicación directa entre componentes de diferentes frameworks
¿Qué son las Directivas?
Las directivas son atributos especiales de HTML disponibles
dentro del maquetado de los componentes de Astro (archivos .astro
). Controlan el comportamiento de elementos y componentes de manera
específica.
Reglas para Directivas
-
Deben incluir dos puntos
:
en su nombre (formatoX:Y
) - Deben ser visibles para el compilador
-
Ejemplo:
client:load
,class:list
Directivas de Astro
Directivas Comunes
Directiva | Propósito | Detalles |
---|---|---|
class:list | Convierte un array de clases en un string de clases CSS |
|
set:html | Inyecta un string de HTML | ⚠️ Advertencia: Astro no verifica el valor (riesgo XSS) |
set:text | Inyecta texto de forma segura | Equivalente a innerText |
Directivas del Cliente
Directiva | Propósito | Prioridad | Uso típico |
---|---|---|---|
client:load | Hidrata inmediatamente al cargar | Alta | UI visible e interactiva desde el inicio |
client:idle | Hidrata cuando el navegador está inactivo | Media | UI de menor prioridad |
client:visible | Hidrata al entrar en el viewport | Baja | Elementos fuera del viewport inicial |
client:media | Hidrata si se cumple media query | Baja | Elementos dependientes del tamaño de pantalla |
client:only | Renderiza solo en el cliente | - | Para frameworks específicos (React, Vue, etc.) |
Otras Directivas
Directiva | Propósito | Detalles |
---|---|---|
server:defer | Convierte en isla de servidor | Renderizado bajo demanda |
is:global | Aplica estilos CSS globalmente | No solo al componente |
is:inline | Evita procesamiento de Astro | No se empaquetan, no se deduplican |
define:vars | Pasa variables del servidor | Solo JSON-serializables, implica is:inline |
is:raw | Trata hijos como texto plano | Ignora sintaxis de Astro |
Ejemplo de Directiva class:list
Ejemplo Interactivo de class:list
Cambia los controles para ver cómo class:list genera las clases CSS dinámicamente
Controles Interactivos
Vista Previa:
Estado Actual
Código class:list
<button class:list={[
'btn',
'transition-all',
'duration-200',
'rounded-md',
{
'bg-blue-500 text-white': isActive && !hasError,
'bg-red-500 text-white': hasError,
'bg-gray-300 text-gray-600': !isActive && !hasError,
'px-2 py-1 text-sm': size === 'small',
'px-4 py-2': size === 'medium',
'px-6 py-3 text-lg': size === 'large'
}
]}>
Botón Dinámico
</button>
Código Oculto
Haz clic en "Ver código generado" para mostrar cómo class:list construye las clases CSS dinámicamente
Gestiona tu Contenido como un Pro
las Content Collections son la forma más poderosa de organizar y validar contenido en Astro. Con TypeScript automático y validación de esquemas, transforman tu contenido en una base de datos tipada.
¿Qué son las Content Collections?
Content collections son la mejor forma de gestionar conjuntos de contenido en cualquier proyecto Astro. Las Collections ayudan a organizar y consultar tus documentos, habilitan Intellisense y la comprobación de tipos en tu editor, y proporcionan seguridad de tipos TypeScript automática para todo tu contenido.
Piensa en ellas como tu base de datos de archivos con superpoderes: validación automática, tipos de TypeScript y consultas optimizadas.
Estructura típica:
Validación Automática
Zod valida tus frontmatter automáticamente
TypeScript
Tipos automáticos sin configuración extra
Rendimiento SSG
Todo se procesa en build time