Skripte und Ereignisbehandlung
Du kannst deinen Astro-Komponenten Interaktivität hinzufügen, ohne ein UI-Framework wie React, Svelte, Vue usw. zu verwenden, indem du standardmäßige HTML-<script>
-Tags verwendest. So kannst du JavaScript im Browser ausführen lassen und deinen Astro-Komponenten Funktionen hinzufügen.
Client-seitige Skripte
Skripte können verwendet werden, um Event-Listener hinzuzufügen, Analysedaten zu senden, Animationen abzuspielen und alles andere, was JavaScript im Web ermöglicht.
Standardmäßig verarbeitet und bündelt Astro <script>
-Tags und unterstützt damit den Import von npm-Modulen, das Schreiben von TypeScript und mehr.
Verwendung von <script>
in Astro
In .astro
-Dateien kannst du clientseitiges JavaScript hinzufügen, indem du ein (oder mehrere) <script>
-Tags hinzufügst.
In diesem Beispiel wird durch das Hinzufügen der Komponente <Hello />
zu einer Seite eine Nachricht auf der Browserkonsole aufgezeichnet.
Script bundling
<script>
-Tags werden standardmäßig von Astro verarbeitet.
- Alle Importe werden gebündelt, sodass du lokale Dateien oder Node-Module importieren kannst.
- Das verarbeitete Skript wird in den
<head>
-Block deiner Seite mittype="module"
eingefügt. - TypeScript wird vollständig unterstützt, einschließlich des Imports von TypeScript-Dateien.
- Wenn deine Komponente mehrmals auf einer Seite verwendet wird, wird das Skript nur einmal eingebunden.
Um die Bündelung des Skripts zu vermeiden, kannst du die Direktive is:inline
verwenden.
Das Hinzufügen von type="module"
oder eines anderen Attributs als src
zu einem <script>
-Tag deaktiviert das Standard-Bündelungsverhalten von Astro und behandelt den Tag so, als hätte er eine is:inline
-Direktive.
📚 Auf unserer Seite directives reference (EN) findest du weitere Informationen über die Direktiven, die für <script>
-Tags verfügbar sind.
Skripte laden
Vielleicht möchtest du deine Skripte als separate .js
/.ts
-Dateien schreiben oder du musst auf ein externes Skript auf einem anderen Server verweisen. Das kannst du tun, indem du im Attribut src
eines <script>
-Tags auf diese Dateien verweist.
Lokale Skripte importieren
Wann sollte man das verwenden: Wenn dein Skript innerhalb von src/
liegt.
Astro erstellt und optimiert diese Skripte für dich und fügt sie der Seite hinzu, indem es die Skriptbündelungsregeln befolgt.
Externe Skripte laden
Wann sollte man das verwenden: Wenn deine JavaScript-Datei in public/
oder in einem CDN liegt.
Um Skripte außerhalb des Ordners src/
deines Projekts zu laden, füge die Direktive is:inline
ein. Dieser Ansatz überspringt die Verarbeitung, Bündelung und Optimierung von JavaScript, die Astro beim Import von Skripten wie oben beschrieben vornimmt.
Gemeinsame Skript-Pattern
onclick
und andere Ereignisse verarbeiten
Einige UI-Frameworks verwenden eine eigene Syntax für die Ereignisbehandlung wie onClick={...}
(React/Preact) oder @click="..."
(Vue). Astro hält sich enger an den HTML-Standard und verwendet keine eigene Syntax für Ereignisse.
Stattdessen kannst du addEventListener
in einem <script>
Tag verwenden, um Benutzerinteraktionen zu verarbeiten.
Wenn du mehrere <AlertButton />
-Komponenten auf einer Seite hast, führt Astro das Skript nicht mehrfach aus. Skripte werden gebündelt und nur einmal pro Seite eingebunden. Die Verwendung von querySelectorAll
stellt sicher, dass dieses Skript den Event-Listener an jede Schaltfläche mit der Klasse alert
auf der Seite anhängt.
Webkomponenten mit benutzerdefinierten Elementen
Du kannst deine eigenen HTML-Elemente mit benutzerdefiniertem Verhalten mithilfe des Webkomponenten-Standards erstellen. Wenn du ein benutzerdefiniertes Element in einer .astro
-Komponente definierst, kannst du interaktive Komponenten erstellen, ohne ein UI-Framework zu benötigen.
In diesem Beispiel definieren wir ein neues <astro-heart>
HTML-Element, das aufzeichnet, wie oft du auf den Herz-Button klickst und das <span>
mit der Anzahl aktualisiert.
Die Verwendung eines benutzerdefinierten Elements hat hier zwei Vorteile:
-
Anstatt die gesamte Seite mit
document.querySelector()
zu durchsuchen, kannst duthis.querySelector()
verwenden, das nur innerhalb der aktuellen benutzerdefinierten Elementinstanz sucht. Das macht es einfacher, jeweils nur mit den Children einer Komponenteninstanz zu arbeiten. -
Obwohl ein
<script>
nur einmal ausgeführt wird, führt der Browser die Methodeconstructor()
unseres benutzerdefinierten Elements jedes Mal aus, wenn er<astro-heart>
auf der Seite findet. Das bedeutet, dass du gefahrlos Code für jeweils eine Komponente schreiben kannst, auch wenn du diese Komponente mehrmals auf einer Seite verwenden willst.
📚 Mehr über benutzerdefinierte Elemente erfährst du in web.dev’s Reusable Web Components guide und MDN’s introduction to custom elements.
Übergabe von Frontmatter-Variablen an Skripte
In Astro-Komponenten läuft der Code in Frontmatter zwischen den ---
-Zeichen auf dem Server und ist im Browser nicht verfügbar. Um Variablen vom Server an den Client zu senden, brauchen wir eine Möglichkeit, unsere Variablen zu speichern und sie dann zu lesen, wenn JavaScript im Browser läuft.
Eine Möglichkeit, dies zu tun, ist die Verwendung von data-*
-Attributen, um den Wert von Variablen in deiner HTML-Ausgabe zu speichern. Skripte, einschließlich benutzerdefinierter Elemente, können diese Attribute dann mit der Eigenschaft dataset
eines Elements lesen, sobald dein HTML im Browser geladen ist.
In dieser Beispielkomponente wird eine message
-Eigenschaft in einem data-message
-Attribut gespeichert, sodass das benutzerdefinierte Element this.dataset.message
lesen und den Wert der Eigenschaft im Browser abrufen kann.
Jetzt können wir unsere Komponente mehrmals verwenden und werden jedes Mal mit einer anderen Nachricht begrüßt.
Genau das macht Astro hinter den Kulissen, wenn du Props an eine Komponente übergibst, die mit einem UI-Framework wie React geschrieben wurde! Für Komponenten mit einer client:*
-Direktive erstellt Astro ein benutzerdefiniertes <astro-island>
-Element mit einem props
-Attribut, das deine serverseitigen Props in der HTML-Ausgabe speichert.