Découverte d'Astro

Voir la vidéo

Bienvenue dans cette vidéo où je vous propose de découvrir Astro, un générateur de site, qui vient de passer en version 1.0 récemment.

00:00 Découverte d'Astro
04:21 Support du markdown
05:12 Le rendu statique
06:53 Le système d'îlot interactif
18:07 Autres fonctionnalités
19:05 Server side rendering
25:05 Mon avis

Encore un outil JavaScript !

Même s'il existe déjà de nombreux générateurs de site, Astro propose une approche intéréssante qui le rend intéréssant dans cet écosystème déjà chargé.

Un focus sur le rendu HTML

Le premier point particulier, par rapport à des solutions comme NextJS, est qu'il se focalise sur le rendu statique HTML et les pages n'utiliseront pas de JavaScript par défaut. Ces pages HTML peuvent être générées grâce à des fichiers .astro, des fichiers markdown ou en utilisant des librairies comme React, Svelte, Vue ou autre.
Les fichiers .astro permettront d'insérer du JavaScript au début du fichier pour effectuer de la logique (si nécessaire) pour récupérer des données lors de la compilation.

---
const projects = (await Astro.glob('./project/**/*.md'))
    .filter(({ frontmatter }) => !!frontmatter.publishDate)
    .sort(
        (a, b) =>
            new Date(b.frontmatter.publishDate).valueOf() - new Date(a.frontmatter.publishDate).valueOf()
    );
---

<section>
    {projects.map((project) => <PortfolioPreview project={project} />)}
</section>

Il est même possible d'utiliser fetch si on souhaite récupérer des données d'une API lors de la compilation

---
const todos = await fetch('https://jsonplaceholder.typicode.com/todos?_limit=10').then(r => r.json())
---
<ul>
    {todos.map((t) => (<li>{t.title}</li>))}
</ul>

En dehors de cette particularité on retrouve à peu près les mêmes fonctionnalités qu'avec d'autres outils comme la possibilité d'utiliser des routes dynamiques ou un système de pagination.

Des îlots interactifs

Le principal argument de vente d'Astro est son système d'îlots qui permet de rendre certains éléments de la page interactif avec une hydratation côté client.

<Nav />
<SiteHeader />
<main>
    <Counter client:load>
</main>

L'utilisation de la directive client permet d'indiquer que le composant doit aussi être éxécuté côté client et Astro se chargera de délivrer le JavaScript nécessaire au fonctionnement du composant sur les pages où il est utilisé. Il est aussi possible de ne charger les composants que sous certaines conditions suivant l'importance de l'élément.

<BuyButton client:load /> <!-- Le composant se charge au chargement de la page -->
<BuyButton client:idle /> <!-- Le composant se charge lorsque le navigateur n'est plus occupé -->
<BuyButton client:visible /> <!-- Le composant se charge lorsque l'élément devient visible à l'écran -->
<BuyButton client:media="(max-width: 50em)" /> <!-- Le composant se charge en fonction d'une media query -->
<BuyButton client:only /> <!-- Le composant se charge seulement côté client -->

Cette approche permet de limiter l'utilisation du JavaScript aux éléments qui en ont strictement besoin plutôt que de passer par une hydratation complète de la page comme peuvent le faire d'autre framework.

Du rendu côté serveur

Il est aussi possible d'opter pour un rendu côté serveur qui vous permettra dans ce cas d'accéder aux informations de la requête et de répondre en fonction de ce que vous recevez. Le système se repose alors sur la même API que le web avec les objets Request et Response.

export async function post ({request}) {
    const data = await request.json();
    return new Response(JSON.stringify({
        success: `Bonjour ${data.firstname} ${data.lastname}`
    }), {
        status: 200,
        headers: {
            'Content-Type':'application/json'
        }
    })
}

Vous pouvez alors choisir plusieurs adapters en fonction de l'environnement sur lequel vous souhaitez utiliser votre site. Par exemple, dans le cas de NodeJS il génèrera un fichier entry.mjs que vous pourrez inclure dans votre code serveur.

import http from 'http';
import { handler as ssrHandler } from './dist/server/entry.mjs';

http.createServer(function(req, res) {
  ssrHandler(req, res, err => {
    if(err) {
      res.writeHead(500);
      res.end(err.toString());
    } else {
      // Serve your static assets here maybe?
      // 404?
      res.writeHead(404);
      res.end();
    }
  });
}).listen(8080);

Pour quelle utilisation ?

Vous l'aurez compris, Astro revient à une approche plus classique dans la création de page web avec un rendu focalisé sur l'HTML et une navigation gérée par le navigateur plutôt que le "tout JavaScript". Cette approche conviendra assez bien aux cas de sites vitrine, portfolio, petit blog et documentations mais ne conviendra pas si vous avez besoin d'une navigation côté client ou si vous créez un site au format "application".

Publié
Technologies utilisées
Auteur :
Grafikart
Partager