Zum Inhalt springen

Islands Architecture – Interaktivität ohne JavaScript-Overhead

Islands Architecture ist das Kernkonzept das Astro von anderen Frameworks unterscheidet. Eine Seite besteht aus statischem HTML — dem ‘Ozean’ — und einzelnen interaktiven Komponenten, den ‘Inseln’. Jede Insel wird unabhängig und nur bei Bedarf hydratisiert. Das Ergebnis: Seiten die fast kein JavaScript laden, aber trotzdem interaktive Elemente enthalten können — Theme-Toggle, Suchfunktion, Formulare, komplexe UI-Komponenten.

Das Problem mit klassischen SPAs

In React, Vue oder Angular ist jede Seite eine JavaScript-Anwendung. Beim Laden muss das gesamte Framework heruntergeladen, geparst und ausgeführt werden — auch für Seiten die kaum Interaktivität brauchen. Bei Astro ist JavaScript die Ausnahme: Nur Komponenten die explizit als interaktiv markiert werden, laden JavaScript. Eine Seite mit einem Theme-Toggle und einem Newsletter-Formular lädt nur das JavaScript für genau diese zwei Komponenten.

client:*-Direktiven — wann wird hydratisiert?

client:load — sofort

client:load — sofort

Die Komponente wird sofort beim Seitenload hydratisiert. Verwenden für: Elemente die sofort nach dem Laden interaktiv sein müssen. Theme-Toggle, kritische Navigation, Login-Status. Höchste JavaScript-Priorität — sparsam verwenden.

client:idle — wenn der Browser idle ist

client:idle — wenn der Browser idle ist

Hydratisierung wenn requestIdleCallback feuert — der Browser hat Zeit. Verwenden für: wichtige aber nicht sofort kritische Interaktivität. Newsletter-Formular, Kommentar-Sektion, Social-Share-Buttons. Guter Default für die meisten interaktiven Elemente.

client:visible — wenn im Viewport

client:visible — wenn im Viewport

Hydratisierung wenn die Komponente im sichtbaren Bereich erscheint (IntersectionObserver). Verwenden für: Komponenten below the fold. Schwere Chart-Bibliotheken, Karten, komplexe Tabellen. Spart JavaScript-Ladezeit für Inhalte die nie gesehen werden.

client:media — bei Media Query

client:media — bei Media Query

Hydratisierung nur wenn eine CSS Media Query zutrifft. Verwenden für: Komponenten die nur auf bestimmten Geräten aktiv sind. Mobile-Only Navigation, Desktop-Only Sidebar. Verhindert unnötiges JavaScript auf dem jeweils anderen Gerät.

client:only — rein client-seitig

client:only — rein client-seitig

Keine Server-seitige Renderung — die Komponente existiert nur im Browser. Verwenden für: Komponenten die auf Browser-APIs angewiesen sind (localStorage, window, navigator). Wichtig: kein Server-seitiges HTML — Accessibility und SEO berücksichtigen.

React als Island einbinden

Mit der @astrojs/react-Integration können React-Komponenten direkt in .astro-Dateien verwendet werden. Die React-Komponente bleibt eine normale .tsx-Datei — die Island-Direktive wird beim Einbinden in Astro hinzugefügt. Wichtig: React-Hooks (useState, useEffect, useRef) funktionieren nur in client-seitig hydratisierten Komponenten. Ohne client:*-Direktive wird die Komponente nur server-seitig gerendert — Hooks werden ignoriert.

Mehrere Frameworks gleichzeitig

Astro erlaubt mehrere UI-Frameworks gleichzeitig — React, Vue und Svelte können auf derselben Seite als Islands eingebunden werden. Jede Island lädt nur ihre eigene Runtime. In der Praxis ist das selten sinnvoll — man wählt ein Framework und bleibt dabei. Aber bei der Migration von einem Framework zum anderen (zum Beispiel von Vue zu React) ist die Koexistenz ein echter Vorteil: schrittweise Migration ohne Big-Bang-Rewrite.

Astro-Komponenten vs. React-Islands

JavaScript im Browser

Astro-Komponente: 0 KB — React Island: React Runtime + Komponente

Interaktivität

Astro: Keine (HTML only) — React Island: Vollständig (Hooks, Events)

State

Astro: Nur server-seitig — React Island: useState, useReducer, …

Einsatz

Astro: Layout, Content, Templates — React Island: Formulare, Toggle, komplexe UI

Performance

Astro: Maximal — React Island: Abhängig von Direktive

Häufig gestellte Fragen

Können Islands untereinander kommunizieren?

Nicht direkt über Props — jede Island ist isoliert. Für Kommunikation zwischen Islands empfiehlt Astro Nano Stores (nanostores) — ein winziges State-Management das framework-agnostisch ist und zwischen mehreren Islands geteilt werden kann.

Funktionieren React Context und Redux in Astro Islands?

React Context funktioniert innerhalb einer Island — nicht zwischen Islands. Redux funktioniert ebenfalls innerhalb einer Island. Für geteilten State zwischen mehreren Islands sind Nano Stores die Astro-empfohlene Lösung.

Wie teste ich React Islands in Astro?

React Islands können mit React Testing Library wie normale React-Komponenten getestet werden — unabhängig von Astro. Für Integration-Tests (Island in der Astro-Seite) eignet sich Playwright oder Cypress.

Verlangsamen viele Islands die Seite?

Nur wenn sie alle client:load verwenden. Mit client:idle und client:visible werden Islands progressiv geladen und beeinträchtigen den initialen Seitenload nicht. Die Anzahl der Islands ist weniger wichtig als die gewählten Direktiven.