Saltar al contenido
jesusprodriguez.com

astro-static-site

Astro: sitio estático rápido

Convenciones para sitios Astro con salida estática: content collections, imágenes optimizadas e islas solo donde hacen falta.

plugin:
Web
stack:
Astro
versión:
v1.0.0
actualizada:
tamaño:
2.9 KB
lectura:
2 min
licencia:
CC-BY-4.0

Cuándo se activa

Al crear páginas o componentes .astro, definir colecciones o revisar rendimiento.

description: Construye y mantiene sitios estáticos en Astro 4/5 con content collections, imágenes optimizadas e islas mínimas. Úsala al crear páginas, componentes .astro, colecciones de contenido o al revisar el rendimiento de un sitio Astro.

  • Content collections
  • astro:assets
  • Islas y client:*
  • Core Web Vitals

Cómo se le pide

> Añade una content collection de notas a este sitio Astro, con su página de listado.

Escríbeselo tal cual al agente: la skill se carga sola por la descripción, no hay que nombrarla.

Cómo se instala

/plugin marketplace add https://jesusprodriguez.com/skills/marketplace.json
/plugin install web@jprodriguez-toolkit

La vía nativa, y la única que se actualiza sola: el marketplace se añade una vez y `/plugin marketplace update` trae las versiones nuevas. Las skills quedan con espacio de nombres propio (`azure-devops:azure-pr-review`).

El fichero, entero

Esto es exactamente lo que descargas: sin resúmenes ni recortes.

Astro: sitio estático rápido

Guía de trabajo para sitios Astro con salida estática. El objetivo por defecto es cero JavaScript en cliente salvo donde la interacción lo exija.

Reglas de oro

  1. HTML primero. Un componente .astro se renderiza en build. No añadas client:* hasta que exista una interacción real que lo necesite.
  2. client:visible antes que client:load. Si la isla está bajo el pliegue, no debe competir con el primer render.
  3. Imágenes siempre por astro:assets. <Image /> o <Picture /> con widths y sizes. Una imagen en public/ no se optimiza: solo va ahí lo que necesita una URL estable (favicon, PDF, robots.txt).
  4. Fuentes self-hosted vía @fontsource*, nunca CDN de Google: elimina una conexión de terceros y el FOUT asociado.

Content collections

Define el esquema en src/content/config.ts y deja que Zod valide en build:

import { defineCollection, z } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  schema: ({ image }) => z.object({
    title:       z.string(),
    description: z.string(),
    pubDate:     z.coerce.date(),
    tags:        z.array(z.string()).default([]),
    draft:       z.boolean().default(false),
    heroImage:   image().optional(),
  }),
});

export const collections = { blog };
  • image() en el esquema es lo que permite optimizar la portada. Requiere que el fichero viva dentro de src/, no en public/.
  • Filtra los borradores en una única función (getPublishedPosts()), no en cada página: así no se escapa ninguno.

Rutas dinámicas

---
export async function getStaticPaths() {
  const posts = await getCollection('blog', ({ data }) => !data.draft);
  return posts.map((post) => ({ params: { slug: post.slug }, props: { post } }));
}
const { post } = Astro.props;
const { Content } = await post.render();
---
<Content />

Revisión de rendimiento

  • npm run build y comprueba que el bundle de _astro/*.js sea el esperado: si aparece un framework entero, hay una isla de más.
  • Toda imagen debe llegar al HTML con width y height para no provocar CLS.
  • El script anti-FOUC del tema va inline en el <head>, antes del CSS.

Errores frecuentes

SíntomaCausa habitual
La imagen no se optimizaEstá en public/ en vez de src/
CLS alto al cargarFalta width/height o aspect-ratio
Parpadeo de temaEl script del tema no es inline y bloqueante
Tags con URLs rotasFalta slugificar acentos y símbolos (.NET, C#)