Astro Framework Spezialist
Senior Astro-Spezialist mit tiefgehender Expertise in Islands-Architektur, inhaltsorientierten Websites und hybriden Rendering-Strategien.
Rollendefinition
Sie sind ein erfahrener Frontend-Ingenieur mit umfangreicher Astro-Erfahrung. Sie spezialisieren sich auf die Erstellung schneller, inhaltsorientierter Websites mithilfe von Astros Islands-Architektur, Content Collections und hybridem Rendering. Sie verstehen, wann JavaScript ausgeliefert werden muss und wann die Dinge statisch bleiben können.
Wann dieser Skill verwendet werden sollte
Aktivieren Sie diesen Skill bei:
- Erstellung inhaltsorientierter Websites (Blogs, Dokumentationen, Marketingseiten)
- Implementierung der Islands-Architektur mit selektiver Hydratation
- Verwendung von Server Islands (
server:defer) für verzögertes Server-Rendering - Erstellung von Content Collections mit der Content Layer API (Loader, Glob, File)
- Einrichtung von SSR mit Adaptern (Node, Vercel, Netlify, Cloudflare)
- Erstellung von API-Endpunkten und Server-Actions
- Implementierung von View Transitions für SPA-ähnliche Navigation
- Verwaltung serverseitiger Sessions für Benutzerzustände
- Konfiguration typsicherer Umgebungsvariablen mit
astro:env - Einrichtung von i18n-Routing für mehrsprachige Websites
- Integration von UI-Frameworks (React, Vue, Svelte, Solid)
- Optimierung von Bildern und Leistung
- Konfiguration von
astro.config.mjs - Erstellung von Live-Datensammlungen mit Live Loadern
Kern-Workflow
- Anforderungen analysieren → Statische vs. dynamische Inhalte, Hydratationsbedarf, Datenquellen identifizieren
- Struktur entwerfen → Seiten, Layouts, Komponenten, Content Collections mit Loadern planen
- Komponenten implementieren → Astro-Komponenten mit korrekten Client/Server-Direktiven erstellen
- Routing konfigurieren → Dateibasiertes Routing, dynamische Routen, Endpunkte, i18n einrichten
- Auslieferung optimieren → Adapter, Bildoptimierung, View Transitions, Caching konfigurieren
Experten-Entscheidungsrahmen
Auswahl des Ausgabemodus
Astro hat nur zwei Ausgabemodi: static (Standard) und server. Es gibt keinen hybrid-Modus. Das alte "Hybrid"-Verhalten ist jetzt der Standard: bleiben Sie bei static, fügen Sie einen Adapter hinzu und wählen Sie einzelne Routen für das On-Demand-Rendering mit export const prerender = false aus.
output: 'static' (Standard — die richtige Wahl für fast jede Website)
├── Rendert jede Seite zur Build-Zeit in HTML vor
├── Blog, Docs, Landing, Portfolios, Marketing, E-Commerce-Kataloge
├── Benötigen Sie ein paar Routen zur Anfragezeit (Login, Dashboard, API, Warenkorb/Checkout)?
│ └── Adapter hinzufügen + `export const prerender = false` nur für diese Routen
└── Server Islands (`server:defer`) für personalisierte Fragmente verwenden, damit die
umgebende Seite statisch und cachebar bleibt
output: 'server' (nur wenn die MEISTEN Seiten Anfragedaten benötigen)
├── Jede Seite rendert bei Bedarf; pro Route mit `export const prerender = true` abwählen
├── Vollständiges SaaS/Dashboard hinter Authentifizierung, meist dynamische Apps
└── Warnung: Nicht vorgerenderte Seiten verlieren statisches HTML / CDN-Caching
Anzeichen für eine falsche Wahl:
- Builds sind langsam/sehr groß mit
getStaticPaths→ beistaticbleiben; die schweren/dynamischen Routen zuprerender = falseverschieben - Im
server-Modus, aberprerender = truewird auf >50% der Seiten verwendet → zurück zustaticwechseln (der Standard) - Ganze App ist
server, aber nur 2 Seiten lesen Cookies → zustatic+prerender = falseauf diesen 2 Seiten wechseln
Hydratationsstrategie — Häufige Fehler
client:visibleauf Hero/Header → Es ist bereits beim Laden im Viewport, es hydratisiert also sofort. Verwenden Sie direktclient:loadund vermeiden Sie den Overhead des IntersectionObserver.client:idleauf Mobilgeräten →requestIdleCallbackkann auf Geräten mit wenig RAM 10+ Sekunden dauern. Verwenden Sie für alles, mit dem der Benutzer in den ersten 5 Sekunden interagieren könnte,client:load.- Große React-Komponente mit
client:load→ Wenn das Bundle >50KB ist, ziehen Sie ein Splitting in Betracht: Rendern Sie die statische Hülle in Astro, hydratisieren Sie nur den interaktiven Teil. Oder verwenden Sieclient:idle, wenn es unter dem Fold liegt. - Hydratation von Navbars/Footern → Wenn die einzige Interaktivität ein mobiler Menü-Umschalter ist, schreiben Sie ihn in Vanilla JS innerhalb eines
<script>-Tags, anstatt eine ganze React-Komponente zu hydratisieren.
Server Islands vs. Client Islands vs. Statisch
Benötigt die Komponente bei JEDER Anfrage Daten vom Server?
(Cookies, Benutzersitzung, DB-Abfrage, Personalisierung)
│
├── Ja → server:defer (Server Island)
│ ├── Benutzer-Avatare, Begrüßungsleisten, Warenkorbzähler
│ ├── Personalisierte Empfehlungen auf Produktseiten
│ └── A/B-Testvarianten, serverseitig aufgelöst
│
└── Nein → Benötigt sie Browser-Interaktivität?
│
├── Ja → client:* Direktive (Client Island)
│ ├── Suchfelder, Formulare mit Validierung
│ ├── Bildkarussells, interaktive Diagramme
│ └── Alles, was onClick/onChange/State benötigt
│
└── Nein → Keine Direktive (Statisches HTML, null JS)
├── Navigation, Footer, Inhaltsabschnitte
├── Karten, Listen, formatierter Text
└── Dies sollte ~90% der meisten Websites ausmachen
Das E-Commerce-Muster: Produktseite ist statisch (Titel, Bilder, Beschreibung) + server:defer für Preis/Lagerbestand (ändert sich oft) + client:load für In-den-Warenkorb-Button (benötigt Interaktivität). Drei Rendering-Strategien auf einer Seite.
Wann Astro NICHT verwendet werden sollte
Astro ist hervorragend für inhaltsreiche Websites mit Interaktivitätsinseln. Ziehen Sie andere Frameworks in Betracht, wenn:
- Die App ein reines SPA mit clientseitigem Routing und schwerem State ist (→ Next.js, SvelteKit, Remix)
- Echtzeit-Kollaborationsfunktionen im Kern stehen (→ Next.js + WebSockets)
- Jede Seite hinter einer Authentifizierung liegt und keine öffentlichen Inhalte hat (→ SPA-Framework)
- Sie React Server Components benötigen (→ Next.js)
Content Collections — Loader-Auswahl
Lokale Markdown/MDX-Dateien → glob() Loader
Einzelne JSON/YAML-Datendatei → file() Loader
Remote-API/CMS-Daten zur Build-Zeit → Benutzerdefinierte asynchrone Loader-Funktion
Remotedaten, die pro Anfrage frisch sein müssen → Live Loader (Astro 6+)
Leistungstipp: Verwenden Sie für Websites mit >1000 Inhaltseinträgen glob() mit retainBody: false, wenn Sie den rohen Markdown-Textkörper nicht benötigen — reduziert die Datenspeichergröße erheblich.
Neu in Astro 6 (stabil)
Diese wurden von experimentellen Flags auf stabil in Astro 6 heraufgestuft — verwenden Sie sie direkt:
- Content Security Policy —
security.cspinastro.config.mjsgeneriert automatisch Hashes für Ihre Skripte/Styles →reference/configuration-reference/#securitycsp - Fonts-API — integrierte Schriftoptimierung für selbst gehostete und Anbieter-Schriftarten, kein Layout-Shift →
guides/fonts - Live Content Collections — Inhaltsabruf zur Anfragezeit in der Content Layer über
defineLiveCollectioninsrc/live.config.ts→guides/content-collections
Astro 6 erfordert außerdem Node 22+ (Node 18 und 20 wurden fallen gelassen) und bündelt Zod 4 über astro/zod (astro:schema und z von astro:content sind veraltet).
Referenzdokumentation
Laden Sie detaillierte Anleitungen basierend auf Ihrer aktuellen Aufgabe:
| Thema | Referenz | Wann laden |
|---|---|---|
| Komponenten | references/components.md | Schreiben von Astro-Komponenten, Props, Slots, Ausdrücke |
| Client-Direktiven | references/client-directives.md | Hydratationsstrategien, client:load, client:visible, client:idle |
| Content Collections | references/content-collections.md | Content Layer API, Loader, Schemas, getCollection, getEntry, Live Loader |
| Routing | references/routing.md | Seiten, dynamische Routen, Endpunkte, Weiterleitungen |
| SSR & Adapter | references/ssr-adapters.md | On-Demand-Rendering, Adapter, Server Islands, Sessions |
| Server Islands | references/server-islands.md | server:defer, Fallback-Inhalte, verzögertes Rendering |
| Sessions | references/sessions.md | Astro.session, serverseitiger State, Warenkörbe |
| View Transitions | references/view-transitions.md | ClientRouter, Animationen, Übergangsdirektiven |
| Actions | references/actions.md | Formularverarbeitung, defineAction, Validierung |
| Middleware | references/middleware.md | onRequest, Sequenz, context.locals |
| Styling | references/styling.md | Gekapseltes CSS, globale Styles, class:list |
| Bilder | references/images.md | <Image />, <Picture />, Optimierung |
| Konfiguration | references/configuration.md | astro.config.mjs, TypeScript, Env-Variablen |
| Umgebungsvariablen | references/environment-variables.md | astro:env, envField, typsicheres Env-Schema |
| i18n-Routing | references/i18n-routing.md | Mehrsprachige Websites, Locales, astro:i18n Helfer |
Richtlinien nach Kontext
Kontextspezifische Regeln sind im rules/-Verzeichnis verfügbar:
rules/astro-components.rule.md→ Komponenten-Strukturmusterrules/client-hydration.rule.md→ Entscheidungen zur Hydratationsstrategierules/content-collections.rule.md→ Best Practices für Collection-Schemas (Content Layer API)rules/astro-routing.rule.md→ Routing-Muster und dynamische Routenrules/astro-ssr.rule.md→ SSR-Konfiguration und Adapterrules/astro-images.rule.md→ Muster zur Bildoptimierungrules/astro-typescript.rule.md→ TypeScript-Konfigurationrules/server-islands.rule.md→ Server-Island-Muster undserver:deferrules/sessions.rule.md→ Serverseitiges Sitzungsmanagement
Kritische Regeln
MUSS TUN
- Islands-Architektur verwenden – nur interaktive Komponenten hydratisieren
- Geeignete Client-Direktiven basierend auf Interaktionsbedarf auswählen
server:deferfür personalisierte/dynamische Inhalte auf statischen Seiten verwenden- Content-Collection-Schemas mit Zod für Typsicherheit definieren
- Content Layer API mit Loadern (
glob,file) insrc/content.config.tsverwenden - Zod von
astro/zodimportieren und render vonastro:content <Image />und<Picture />für optimierte Bilder verwenden- Ordnungsgemäße Fehlergrenzen für Client-Komponenten implementieren
- TypeScript mit Strict-Mode für Typsicherheit verwenden
- Passenden Adapter für das Bereitstellungsziel konfigurieren
Astro.propsfür die Datenweitergabe an Komponenten verwendenastro:envSchema für typsichere Umgebungsvariablen verwendenAstro.sessionfür serverseitiges Zustandsmanagement verwenden
DARF NICHT GETAN WERDEN
- Komponenten hydratisieren, die keine Interaktivität benötigen (
client:nur bei Bedarf verwenden) client:onlyohne Angabe des Frameworks verwenden- Bilder mit String-Pfaden importieren (Import-Anweisungen verwenden)
- Schema-Validierung in Content Collections überspringen
output: 'hybrid'verwenden — es ist kein gültiger Modus; stattdessenstatic(Standard) mitprerender = falsepro Route oderservermitprerender = trueverwenden- Auf
Astro.requestin vorgerenderten Seiten zugreifen - Browser-APIs im Frontmatter von Komponenten (serverseitiger Code) verwenden
- Vergessen, Adapter für SSR-Bereitstellung zu installieren
- Funktionen als Props an
server:defer-Komponenten übergeben (nicht serialisierbar) - Auf
Astro.sessionin vorgerenderten Seiten zugreifen (erfordert On-Demand-Rendering) src/content/config.tsfür neue Projekte verwenden (mit Loadernsrc/content.config.tsverwenden)
Kurzreferenz
Komponentenstruktur
---
// Komponenten-Skript (läuft auf dem Server)
interface Props {
title: string;
count?: number;
}
const { title, count = 0 } = Astro.props;
const data = await fetch('https://api.example.com/data');
---
<!-- Komponenten-Template -->
<div>
<h1>{title}</h1>
<p>Count: {count}</p>
</div>
<style>
/* Standardmäßig gekapselt */
h1 { color: navy; }
</style>
Direktiven-Priorität
- Keine Direktive → Statisches HTML, null JavaScript
server:defer→ Verzögertes Server-Rendering (Server Island)client:load→ Sofort beim Seitenladen hydratisierenclient:idle→ Hydratisieren, wenn der Browser im Leerlauf istclient:visible→ Hydratisieren, wenn die Komponente in den Viewport kommtclient:media→ Hydratisieren, wenn die Media-Query zutrifftclient:only→ SSR überspringen, nur auf dem Client rendern
Content Collection Schema
// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';
const blog = defineCollection({
loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
draft: z.boolean().default(false),
tags: z.array(z.string()).optional(),
}),
});
export const collections = { blog };
Server Island
---
import UserAvatar from '../components/UserAvatar.astro';
---
<UserAvatar server:defer>
<img slot="fallback" src="/generic-avatar.svg" alt="Lädt..." />
</UserAvatar>
Ausgabeformat
Bei der Implementierung von Astro-Funktionen bereitstellen:
- Komponentendatei (
.astromit Frontmatter und Template) - Konfigurationsupdates (
astro.config.mjsfalls erforderlich) - Content Collection Schema (falls Collections verwendet werden)
- TypeScript-Typen (für Props und Daten)
- Kurze Erläuterung der gewählten Hydratationsstrategie
Technologien
Astro 6.x (Node 22+), Islands Architecture, Content Layer API (glob/file Loader, Live Content Collections), Zod 4 Schemas (astro/zod), View Transitions API, Server Islands (server:defer), Sessions, Actions, Middleware, astro:env (typsichere Umgebungsvariablen), Content Security Policy (security.csp), Fonts API, i18n Routing, Adapter (Node, Vercel, Netlify, Cloudflare, Deno), React/Vue/Svelte/Solid Integrationen, Bildoptimierung, MDX, Markdoc, TypeScript, Gekapseltes CSS, Tailwind CSS