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 in den Browser schicken und deine Astro-Komponenten mit Funktionen versehen.
Clientseitige Skripte
Abschnitt betitelt Clientseitige SkripteSkripte 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
Abschnitt betitelt Verwendung von <script> in AstroIn .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.
Skriptverarbeitung
Abschnitt betitelt Skriptverarbeitung<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 dort, wo es deklariert ist, mit
type="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.
Das Attribut type="module"
bewirkt, dass der Browser das Skript als JavaScript-Modul behandelt. Das hat mehrere Leistungsvorteile:
- Das Rendering wird nicht blockiert. Der Browser fährt mit der Verarbeitung des restlichen HTML fort, während das Modulskript und seine Abhängigkeiten geladen werden.
- Der Browser wartet auf die Verarbeitung von HTML, bevor er die Modulskripte ausführt. Du musst nicht auf das Ereignis
load
warten. - Die Attribute
async
unddefer
sind unnötig. Modulskripte werden immer aufgeschoben.
Das Attribut async
ist für normale Skripte nützlich, weil es verhindert, dass sie das Rendern blockieren. Modulskripte haben dieses Verhalten jedoch bereits. Wenn du async
zu einem Modulskript hinzufügst, wird es ausgeführt, bevor die Seite vollständig geladen ist. Das ist wahrscheinlich nicht das, was du willst.
Skript-Verarbeitung deaktivieren
Abschnitt betitelt Skript-Verarbeitung deaktivierenUm zu verhindern, dass Astro ein Skript verarbeitet, füge die Direktive is:inline
hinzu.
Astro wird deine Skript-Tags in manchen Situationen nicht verarbeiten. Insbesondere das Hinzufügen von type="module"
oder eines anderen Attributs als src
zu einem <script>
-Tag führt dazu, dass Astro den Tag so behandelt, als ob er eine is:inline
-Direktive hätte. Das Gleiche gilt, wenn das Skript in einem JSX-Ausdruck geschrieben wird.
<script>
Tags verfügbar sind.
JavaScript-Dateien auf deiner Seite einbinden
Abschnitt betitelt JavaScript-Dateien auf deiner Seite einbindenVielleicht 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
Abschnitt betitelt Lokale Skripte importierenWann 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 Skriptverarbeitungsregeln befolgt.
Externe Skripte laden
Abschnitt betitelt Externe Skripte ladenWann 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.
Übliche Skript-Pattern
Abschnitt betitelt Übliche Skript-Patternonclick
und andere Ereignisse verarbeiten
Abschnitt betitelt onclick und andere Ereignisse verarbeitenEinige 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
Abschnitt betitelt Webkomponenten mit benutzerdefinierten ElementenDu 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.
Übergabe von Frontmatter-Variablen an Skripte
Abschnitt betitelt Übergabe von Frontmatter-Variablen an SkripteIn 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.
Kombination von Skripten und UI-Frameworks
Abschnitt betitelt Kombination von Skripten und UI-FrameworksElemente, die von einem UI-Framework gerendert werden, sind möglicherweise noch nicht verfügbar, wenn ein <script>
-Tag ausgeführt wird. Wenn dein Skript auch mit UI-Framework-Komponenten umgehen muss, empfiehlt es sich, ein eigenes Element zu verwenden.