Scripts et gestion d'évènements.
Vous pouvez ajouter de l’interactivité à vos composants Astro sans utiliser un framework UI comme React, Svelte, Vue, etc, en utilisant les balises HTML <script>
standard. Cela vous permet d’exécuter du JavaScript dans le navigateur et d’ajouter des fonctionnalités à vos composants Astro.
Script côté client
Les scripts peuvent être utilisés pour écouter des événements envoyer des données analytiques, jouer des animations et tout ce que JavaScript permet de faire sur le web.
Par défaut, Astro traite et regroupe les balises <script>
, ce qui permet d’importer des modules npm, d’écrire du TypeScript, etc.
Utilisation du <script>
dans Astro.
Dans les fichiers .astro
, vous pouvez ajouter du JavaScript côté client en ajoutant une (ou plusieurs) balises <script>
.
Dans cet example, l’ajout du composant <Hello />
à un page enregistrera un message dans la console du navigateur.
Regroupement de script
Par défaut, les balises <script>
sont optimisées par Astro.
- Toutes les importations seront regroupées, ce qui vous permettra d’importer des fichiers locaux ou des modules Node.
- Le script optimisé sera injecté dans le
<head>
de votre page HTML avectype="module"
. - TypeScript est entièrement supporté, y compris l’import de fichiers TypeScript.
- Si votre composant est utilisé plusieurs fois sur un page, le script ne sera inclus qu’une seule fois.
Pour éviter le regroupement de script, vous pouvez utiliser la directive is:inline
.
Le comportement de regroupement par défaut d’Astro sera désactivé dans certaines situations. En particulier, l’ajout de type="module"
ou de tout autre attribut que src
à une balise <script>
amènera Astro à traiter la balise comme si elle avait une directive is:inline
. Il en va de même lorsque le script est écrit dans une expression JSX.
📚 Consultez notre page référence des directives pour plus d’informations sur les directives disponibles des balises <script>
.
Chargement de script
Vous pouvez vouloir écrire vos scripts comme des fichiers .js
/.ts
séparés ou avoir besoin de référencer un script externe sur un autre serveur. Vous pouvez le faire en les référençant dans l’attribut src’ d’une balise <script>
.
Importer des scripts locaux
Quand l’utiliser : Si votre script se trouve dans src/
.
Astro construira, optimisera et ajoutera ces scripts à la page pour vous, en suivant ses règles de regroupement des scripts
Charger des scripts externes
Quand l’utiliser : Si votre fichier JavaScript se trouve à l’intérieur du dossier public/
ou sur un CDN.
Pour charger des scripts en dehors du dossier src/
de votre projet, incluez la directive is:inline
. Cette approche permet d’éviter le traitement JavaScript, le regroupement et l’optimisation du JavaScript qui sont fournis par Astro lorsque vous importez des scripts comme décrit ci-dessus.
Modèles communs de script
Gérer le onclick
et d’autres évènements
Certains frameworks d’interface utilisateur utilisent une syntaxe personnalisée pour la gestion des événements comme onClick={...}
(React/Preact) ou @click="..."
(Vue). Astro suit au plus près le HTML standard et n’utilise pas de syntaxe personnalisée pour les évènements.
Au lieu de cela, vous pouvez utiliser addEventListener
dans une balise <script>
pour gérer les interactions avec l’utilisateur.
Si vous avez plusieurs composants <AlertButton />
sur une page, Astro n’exécutera pas le script plusieurs fois. Les scripts sont regroupés et ne sont inclus qu’une seul fois par page. L’utilisation de querySelectorAll
garantit que ce script attache l’écouteur d’évènement à chaque bouton de la classe alert
présent sur la page.
Composants Web avec des éléments personnalisés
Vous pouvez créer vos propres éléments HTML avec un comportement personnalisé en utilisant le standard Web Components. La définition d’un élément personnalisé dans un composant .astro
vous permet de créer des composants interactifs sans avoir besoin d’une bibliothèque de Framwork utilisateur.
Dans cet exemple, nous définissons un nouvel élément HTML <astro-heart>
qui enregistre le nombre de fois que vous cliquez sur le bouton “cœur” et met à jour l’élément <span>
avec le dernier décompte.
L’utilisation d’un élément personnalisé présente deux avantages :
-
Au lieu de chercher dans toute la page en utilisant
document.querySelector()
, vous pouvez utiliserthis.querySelector()
, qui ne recherche que dans l’instance courante de l’élément personnalisé. Cela permet de travailler plus facilement avec les enfants d’une seule instance de composant à la fois. -
Bien qu’un
<script>
ne s’exécute qu’une seule fois, le navigateur exécutera la méthodeconstructor()
de notre élément personnalisé chaque fois qu’il trouvera<astro-heart>
sur la page. Cela signifie que vous pouvez écrire en toute sécurité du code pour un seul composant à la fois, même si vous avez l’intention d’utiliser ce composant plusieurs fois sur une page.
📚 Pour en savoir plus sur les éléments personnalisés, consultez le guide des composants Web réutilisables de web.dev (EN) et l’introduction aux éléments personnalisés de MDN.
Passer les variables frontmatter aux scripts
Dans les composants Astro, le code dans le frontmatter entre les codes barres “---” s’exécute sur le serveur et n’est pas disponible dans le navigateur. Pour envoyer des variables du serveur au client, nous avons besoin d’un moyen de stocker nos variables et de les lire lorsque le JavaScript s’exécute dans le navigateur.
Une façon d’y parvenir est d’utiliser les attributs data-*
pour stocker la valeur des variables dans votre sortie HTML. Les scripts, y compris les éléments personnalisés, peuvent alors lire ces attributs en utilisant la propriété dataset
d’un élément une fois que votre HTML se charge dans le navigateur.
Dans cet exemple de composant, une variable message
est stockée dans un attribut data-message
, de sorte que l’élément personnalisé puisse lire this.dataset.message
et obtenir la valeur de la variable dans le navigateur.
Nous pouvons maintenant utiliser notre composant plusieurs fois et être accueillis par un message différent à chaque fois.
C’est en fait ce qu’Astro fait dans les coulisses lorsque vous passez des props à un composant écrit avec un framework UI comme React ! Pour les composants avec une directive client:*
, Astro crée un élément personnalisé <astro-island>
avec un attribut props
qui stocke vos props côté serveur dans la sortie HTML.