Komponenten
Astro-Komponenten sind die Grundbausteine eines jeden Astro-Projekts. Sie sind reine HTML-Vorlagen ohne clientseitigen Laufzeit-Code.
Die Astro-Komponentensyntax ist eine Obermenge von HTML. Die Syntax wurde so konzipiert, dass sie jedem vertraut ist, der Erfahrung mit dem Schreiben von HTML oder JSX hat und bietet Unterstützung für die Verwendung von Komponenten und JavaScript-Ausdrücken. Du erkennst eine Astro-Komponente an ihrer Dateierweiterung: .astro
.
Astro-Komponenten sind extrem flexibel. Oft enthält eine Astro-Komponente eine wiederverwendbare Benutzeroberfläche der Seite, wie z. B. eine Kopfzeile oder eine Profilkarte. In anderen Fällen kann eine Astro-Komponente einen kleineren HTML-Schnipsel enthalten, z. B. eine Sammlung üblicher <meta>
-Tags, die die Suchmaschinenoptimierung erleichtern. Astro-Komponenten können sogar ein ganzes Seitenlayout enthalten.
Das Wichtigste an Astro-Komponenten ist, dass sie während des Build-Prozesses zu HTML rendern. Selbst wenn du JavaScript-Code in deinen Komponenten ausführst, wird dieser vorzeitig ausgeführt und von der endgültigen Seite, die an deine Nutzerinnen und Nutzer gesendet wird, entfernt. Das Ergebnis ist eine schnellere Seite, welche standardmäßig kein JavaScript enthält.
Komponenten-Überblick
Eine Astro-Komponente besteht aus zwei Hauptteilen: dem Komponentenskript und der Komponentenvorlage. Jeder Teil erfüllt eine andere Aufgabe, aber zusammen sollen sie ein Gerüst bieten, das sowohl einfach zu benutzen als auch ausdrucksstark genug ist, um alles zu handhaben, was du bauen möchtest.
Du kannst Komponenten innerhalb anderer Komponenten verwenden, um mehr und fortschrittlichere Benutzeroberflächen zu erstellen. Zum Beispiel könnte eine Button
-Komponente verwendet werden, um eine ButtonGroup
-Komponente wie folgt zu erstellen:
Das Komponentenskript
Astro verwendet einen Code Fence (---
), um das Komponentenskript in deiner Astro-Komponente zu identifizieren. Wenn du schon einmal Markdown geschrieben hast, kennst du vielleicht ein ähnliches Konzept, das Frontmatter genannt wird. Astros Idee eines Komponentenskripts wurde direkt von diesem Konzept inspiriert.
Du kannst das Komponentenskript verwenden, um jeden JavaScript-Code zu schreiben, den du zum Rendern deiner Vorlage benötigst. Dies kann Folgendes beinhalten:
- Importieren anderer Astro-Komponenten
- Importieren anderer Framework-Komponenten, wie z. B. React
- Importieren von Daten, wie z. B. einer JSON-Datei
- Abruf von Inhalten aus einer API oder Datenbank
- Erstellen von Variablen, auf die du in deiner Vorlage verweisen wirst
Der Code Fence soll garantieren, dass das von dir geschriebene JavaScript “eingezäunt” ist. Es wird nicht in deine Frontend-Anwendung entkommen oder in die Hände deiner Nutzerinnen und Nutzer fallen. Du kannst hier sicher Code schreiben, der teuer oder sensibel ist (z. B. eine Anfrage an deine private Datenbank), ohne dir Sorgen zu machen, dass er jemals im Browser landet.
Du kannst sogar TypeScript in deinem Komponentenskript schreiben!
Die Komponentenvorlage
Unterhalb des Komponentenskripts befindet sich die Komponentenvorlage. Die Komponentenvorlage bestimmt die HTML-Ausgabe deiner Komponente.
Wenn du hier einfaches HTML schreibst, wird deine Komponente dieses HTML in jeder Astro-Seite darstellen, die sie importiert und verwendet.
Die Syntax der Astro-Komponentenvorlagen unterstützt jedoch auch JavaScript-Ausdrücke, importierte Komponenten und spezielle Astro-Direktiven (EN). Daten und Werte, die (zur Zeit der Seitenerstellung) im Komponentenskript definiert werden, können in der Komponentenvorlage verwendet werden, um dynamisch erstelltes HTML zu erzeugen.
JSX-Ausdrücke
Du kannst lokale Variablen innerhalb des Frontmatter-Komponentenskripts einer Astro-Komponente definieren. Diese Variablen können dann unter Verwendung von JSX-Ausdrücken in die HTML-Vorlage der Komponente eingefügt werden.
Variablen
Lokale Variablen können zum HTML-Code hinzugefügt werden, indem der Variablenname in geschweifte Klammern gesetzt wird:
Dynamische Attribute
Lokale Variablen können in geschweiften Klammern verwendet werden, um Attributwerte sowohl an HTML-Elemente als auch an Komponenten zu übergeben:
Dynamisches HTML
Lokale Variablen können in JSX-ähnlichen Funktionen verwendet werden, um dynamisch generierte HTML-Elemente zu erzeugen:
Fragmente und mehrere Elemente
Im Gegensatz zu JavaScript oder JSX kann eine Astro-Komponentenvorlage mehrere Elemente darstellen, ohne dass alles in ein einziges <div>
oder <>
verpackt werden muss.
Wenn du jedoch einen Ausdruck verwendest, um dynamisch Elemente zu erstellen, solltest du diese mehreren Elemente mit einem Fragment umhüllen, genau wie du es in JavaScript oder JSX tun würdest. In Astro kannst du dazu entweder <Fragment> </Fragment>
oder die Kurzform <> </>
verwenden.
Fragmente können auch nützlich sein, um Container-Elemente bei der Verwendung von set:*
-Direktiven (EN) zu vermeiden, so wie im folgenden Beispiel:
Komponenteneigenschaften (Props)
Eine Astro-Komponente kann Eigenschaften definieren und akzeptieren. Diese Eigenschaften stehen dann der Komponentenvorlage für die Darstellung von HTML zur Verfügung. Eigenschaften sind im globalen Objekt Astro.props
in deinem Frontmatter-Skript verfügbar.
Hier ist ein Beispiel für eine Komponente, die die Eigenschaften greeting
und name
empfängt. Beachte, dass die zu empfangenden Eigenschaften aus dem globalen Objekt Astro.props
destrukturiert werden.
Du kannst deine Eigenschaften auch mit TypeScript definieren, indem du ein Typ-Interface Props
exportierst. Astro übernimmt automatisch jedes exportierte Props
-Interface und gibt Typ-Warnungen/Fehler für dein Projekt aus. Diese Eigenschaften können auch mit Standardwerten versehen werden, wenn sie aus Astro.props
destrukturiert werden.
Wenn diese Komponente importiert und in anderen Astro-Komponenten, Layouts oder Seiten gerendert wird, können diese Eigenschaften als Attribute übergeben werden:
Slots
Das <slot />
-Element ist ein Platzhalter für externe HTML-Inhalte, der es dir ermöglicht, untergeordnete Elemente aus anderen Dateien in deine Komponentenvorlage einzubinden.
Standardmäßig werden alle untergeordneten Elemente, die an eine Komponente übergeben werden, in ihrem <slot />
gerendert.
Im Gegensatz zu Eigenschaften, die als Attribute an eine Astro-Komponente übergeben werden und dort überall mit Astro.props
verwendet werden können, werden Slots als untergeordnete Elemente übergeben und dort gerendert, wo du <slot />
in der Komponentenvorlage verwendest.
Dieses Muster ist die Grundlage einer Astro-Layout-Komponente: Eine ganze Seite mit HTML-Inhalt kann mit <Layout></Layout>
-Tags „umhüllt“ und an die Layout-Komponente gesendet werden, um innerhalb der allgemeinen Seitenelemente gerendert zu werden.
Benannte Slots
Eine Astro-Komponente kann auch benannte Slots haben. Dadurch kannst du nur HTML-Elemente mit dem entsprechenden Slot-Namen an die Position eines Slots übergeben.
Verwende ein slot="my-slot"
-Attribut auf dem untergeordneten Element, das du an einen passenden <slot name="my-slot" />
-Platzhalter in deiner Komponente weiterleiten willst.
Benannte Slots können auch an UI-Framework-Komponenten übergeben werden.
Fallback-Inhalte für Slots
Slots können auch Fallback-Inhalte wiedergeben. Wenn es keine passenden untergeordneten Elemente gibt, die an einen Slot übergeben werden, wird ein <slot />
Element seine eigenen Platzhalter-Elemente anzeigen.
CSS-Stile
Die Einbindung von CSS-Stilen über <style>
-Tags wird auch innerhalb der Komponentenvorlage unterstützt.
Sie können zur Gestaltung deiner Komponenten verwendet werden. Alle Stilregeln werden automatisch auf die Komponente selbst beschränkt, um CSS-Konflikte in großen Anwendungen zu vermeiden.
Die hier definierten Stile gelten nur für Inhalte, die direkt in die Vorlage der Komponente geschrieben wurden. Untergeordnete Elemente und importierte Komponenten werden standardmäßig nicht beeinflusst.
📚 Weitere Informationen zur Anwendung von Stilen findest du unter Stile & CSS.
Clientseitige Skripte
Um JavaScript an den Browser zu senden, ohne eine Framework-Komponente (React, Svelte, Vue, Preact, SolidJS, AlpineJS, Lit) oder eine Astro-Integration (z.B. astro-XElement) zu verwenden, kannst du ein <script>
-Tag in deiner Astro-Komponentenvorlage verwenden und JavaScript an den Browser senden, das auf globaler Ebene ausgeführt wird.
Standardmäßig werden <script>
-Tags von Astro verarbeitet:
- Alle Importe werden gebündelt, sodass sie lokale Dateien oder Node-Module importieren können.
- Das verarbeitete Skript wird in den
<head>
deiner Seite mittype="module"
eingefügt. - Wenn deine Komponente mehrmals auf einer Seite verwendet wird, wird das Skript-Tag nur einmal eingefügt.
Du kannst TypeScript derzeit nicht in clientseitigen Skripten nutzen, aber du kannst eine TypeScript-Datei importieren, wenn du diese Syntax bevorzugst.
Um die Bündelung des Skripts zu vermeiden, kannst du das Attribut is:inline
verwenden.
Mehrere <script>
-Tags können in derselben astro
-Datei mit einer beliebigen Kombination der oben genannten Methoden verwendet werden.
Das Hinzufügen von type="module"
oder eines anderen Attributs zu einem <script>
-Tag deaktiviert das Standard-Bündelungsverhalten von Astro und behandelt den Tag, als ob er eine is:inline
-Direktive hätte.
📚 Siehe unsere Direktiven-Referenz (EN) für weitere Informationen über die Direktiven, die für <script>
-Tags verfügbar sind.
Laden externer Skripte
Wann dies genutzt werden sollte: Wenn deine JavaScript-Datei innerhalb von public/
liegt.
Beachte, dass dieser Ansatz die JavaScript-Verarbeitung, die Bündelung und die Optimierungen überspringt, die von Astro bereitgestellt werden, wenn du die unten beschriebene import
-Methode verwendest.
Verwendung von Hoisted Scripts
Wann dies genutzt werden sollte: Wenn dein externes Skript innerhalb von src/
liegt und es den ESM-Modultyp unterstützt.
Astro erkennt diese clientseitigen JavaScript-Importe und erstellt, optimiert und fügt das JS automatisch in die Seite ein.
Nächste Schritte
📚 Lies über Astros eingebaute Komponenten.
📚 Erfahre mehr über die Verwendung von JavaScript-Framework-Komponenten in deinem Astro-Projekt.
Learn