RSC für Astro-Entwickler
(overreacted.io)- Astro und React Server Components (RSC) setzen die Trennung von Server- und Client-Code auf ähnliche Weise um
- In Astro übernehmen Astro Components und Client Islands jeweils unterschiedliche funktionale Rollen
- RSC teilt dasselbe Konzept in Server Components und Client Components auf und legt die Grenze mit der Direktive
'use client'fest - Im Vergleich zu Astro bietet RSC mehr Flexibilität beim Aufbau interaktiver UIs und beim Teilen von Code
- Beide Modelle haben eine Struktur, in der Daten nur in eine Richtung vom Server zum Client fließen
Einführung und Grundkonzepte
- Astro bietet zwei zentrale Komponententypen: Astro Components und Client Islands
- Astro Components haben die Erweiterung
.astro, werden nur auf dem Server oder zur Build-Zeit ausgeführt und können Aufgaben erledigen, die im Client nicht möglich sind, etwa Dateisystemzugriff, DB-Abfragen oder Aufrufe interner Services - Client Islands sind Komponenten für React, Vue usw., laufen im Browser und übernehmen die Teile mit Benutzerinteraktion
- Innerhalb eines Astro Components kann ein Client Island gerendert werden, aber ein Client Island kann keinen Astro Component aufrufen
- Diese Struktur garantiert die Unidirektionalität, bei der Daten immer nur vom Server zum Client fließen
Codebeispiel und Rollentrennung
- Im Beispielcode liest
PostPreview.astroauf dem Server eine Datei ein, holt den Titel und übergibt diese Daten an ein Client Island LikeButtonist in React geschrieben und übernimmt nach dem Laden im Browser Statusänderungen sowie Klick-Events der Nutzer- Astro Components und Client Islands laufen in verschiedenen Welten, und auch die Datenübergabe erfolgt nur vom Astro Component nach unten
Vergleich mit React Server Components (RSC)
- Auch in RSC wird ähnlich wie in Astro zwischen Server Components und Client Components unterschieden
- In React Server Components werden Server Components als JavaScript-Funktionen definiert, und mit der Direktive 'use client' wird klar festgelegt, wo Client-Code beginnt
- In RSC kann dieselbe Komponenten-Datei sowohl Server- als auch Client-Rollen übernehmen; anders als bei Astro lassen sich Grenzen je nach Bedarf allein durch die Deklaration von
'use client'verschieben, ohne Dateierweiterungen oder separate Trennung - Wenn eine Komponente clientseitige Funktionen (z. B.
useState) oder serverseitige Funktionen (z. B. DB-Zugriff) verwendet, führt ein Einsatz in der falschen Umgebung zu einem Build-Fehler, was klares Feedback liefert
Visuelle und strukturelle Unterschiede zwischen Astro und RSC
- Astro hat durch die Trennung von
.astro-Dateien und JS/TS-Dateien klare Grenzen - Da in RSC grundsätzlich alles React ist, sind Code-Sharing und Flexibilität deutlich besser
- Zum Beispiel können neutrale Komponenten, die weder State noch Server-Funktionen verwenden (etwa ein Markdown-Parser), auf beiden Seiten eingesetzt werden
- In RSC wird anhand des Import-Pfads automatisch entschieden, in welcher Welt die jeweilige Komponente läuft
Vorteile und Grenzen des RSC-Modells
- Der Vorteil von RSC liegt in Code-Wiederverwendung und flexibler Rollenverschiebung
- Jede Komponente kann je nach Bedarf allein durch die Deklaration von
'use client'die Grenze leicht verschieben - In Astro kann die Umwandlung von Code umständlich sein, wenn sich der statische oder dynamische Charakter einer UI ändert; RSC löst das deutlich einfacher
- Jede Komponente kann je nach Bedarf allein durch die Deklaration von
- Ein Nachteil von RSC ist die höhere Lernkurve
- Entwickler müssen ständig im Blick behalten, „in welcher Welt“ sie sich gerade befinden, bekommen bei Fehlern aber durch Build-Fehler schnelles Feedback
- In Astro wird die Struktur komplexer, je mehr dynamische Teile eine UI hat; in RSC ist dagegen der gesamte React-Baum integriert, sodass State- und Context-Weitergabe natürlicher funktioniert
Astro mit HTML-Fokus und RSC mit React-Tree-Fokus
- Das Ergebnis von Astro ist HTML; bei jedem Seitenwechsel wird alles neu geladen, und es bietet keine vollständig SPA-artige Erfahrung
- Das Ergebnis von RSC ist ein React Tree (anfangs HTML, bei Navigationen Übertragung als JSON usw.)
- Dadurch lassen sich die Vorteile von SPA und MPA kombinieren
- Es ist möglich, teilweise Aktualisierungen direkt vom Server einzuspielen, sodass sich dynamische Daten leicht übernehmen und Client-State erhalten lassen
Unterstützung für fortgeschrittene React-Funktionen
- Durch die gemischte Server-Client-Tree-Struktur werden fortgeschrittene React-Funktionen (z. B.
<Suspense>, View Transitions usw.) natürlich integriert unterstützt - Auch deklarativ auf dem Client behandelte Loading-States sowie Verzögerungen bei Fonts, Bildern, JavaScript und Styles lassen sich verwalten
- Alle React-Funktionen arbeiten End-to-End über die Server-Client-Grenze hinweg
Einordnung von RSC und Astro
- Astro ist ein vollständiges Framework, während RSC eher ein Building Block oder ein Standard für Frameworks ist
- Offizielle RSC-Implementierungen gibt es in Next.js App Router und Parcel RSC
Fazit und Empfehlung
- Die Developer Experience (DX) von RSC ist noch etwas rau, aber es lohnt sich, sie kennenzulernen
- Wer Astro noch nicht ausprobiert hat, dem ist es zu empfehlen; für Entwickler, denen RSC schwerfällt, bietet Astro einen sanfteren Einstieg
- Auch für Entwickler, die bisher nur clientseitiges React verwendet haben, kann Astro unerwartete Erfahrungen bei der Problemlösung liefern
3 Kommentare
Ich refaktoriere gerade eine alte React-App zu Astro.
Im Text wird der „integrierte Kontext“ hervorgehoben. Man sollte sich bewusst sein, dass ein „integrierter Kontext“ zwar beim schnellen Aufbau eines Services hilft, aber irgendwann zu technischer Schuld werden kann.
Aus Sicht der langfristigen Wartbarkeit eines Services ist eine „lose Kopplung unabhängiger Module“ besser als eine „integrierte enge Kopplung“.
Und Astro ist dafür das flexibelste Framework.
Astro: JavaScript mit minimalem Umfang ausliefern
Astro 3.0 Release
Hacker-News-Kommentar
use client.