Changer le thème

J'ai reconstruit mon blog avec Astro 5 : score Lighthouse de 68 à 100

Easton editorial illustration: build pipeline conveyor

La semaine dernière, j’ai entièrement refondu le blog Next.js que j’utilisais depuis deux ans et je suis passé à Astro 5. Le déclencheur : un score Lighthouse à 68 — le blog chargeait si lentement qu’un ami m’a dit qu’il « tournait indéfiniment avant d’apparaître ». Après la migration, le temps de build est passé de 2 minutes à 18 secondes, et le score de performance de 68 à 98.
Cet article couvre trois sujets : pourquoi Astro est si rapide, comment l’utiliser pour un blog, et comment configurer le SEO. Si les performances de votre blog vous ont déjà frustré, la suite devrait vous aider.

68→98
Score Lighthouse
Migration de Next.js vers Astro 5
2 min→18 s
Temps de build
Réduction de 85 % du temps de build
2,1 s→0,8 s
FCP (First Contentful Paint)
Amélioration de 62 %
4,5 s→1,2 s
TTI (Time to Interactive)
Amélioration de 73 %
280 Ko→45 Ko
Taille du bundle JS
Réduction de 84 %
60 %
Core Web Vitals réussis
Sites Astro ; WordPress/Gatsby seulement 38 %
Source: Données de test sur projet réel

Pourquoi Astro mérite votre attention

Franchement, Astro ne m’intéressait pas au départ. Trop de frameworks : Next.js, Nuxt, Gatsby — on ne sait plus où donner de la tête. Je me disais : encore un outil à apprendre, est-ce que ça vaut vraiment le temps investi ?

Jusqu’à ce que je tombe sur ces chiffres —

L’enquête State of JavaScript 2024 place Astro en tête sur l’intérêt, la rétention et la satisfaction. Deuxième en adoption, juste derrière Next.js. GitHub Octoverse 2025 va plus loin : Astro serait le troisième langage à la croissance la plus rapide.

Un autre chiffre marquant : 60 % des sites Astro passent l’évaluation Core Web Vitals, contre 38 % pour WordPress et Gatsby. L’écart est net.

Et qui utilise Astro ? La doc GitHub, la doc développeurs Firebase, Smashing Magazine (migré depuis WordPress). En 2025, Google, Reuters et Typst l’adoptent aussi.

Là, j’ai vraiment réfléchi : mon blog, c’est quoi ? Des articles Markdown, de la coloration syntaxique, parfois un composant commentaires. Ai-je besoin de toute la stack full-stack de Next.js ? Pas vraiment.

Ma conclusion : si vous faites surtout du blog, de la doc ou des landing pages, Astro est probablement le meilleur choix actuel. En revanche, pour une app e-commerce ou SaaS très interactive, Next.js reste plus adapté.

Ce n’est pas une question de « meilleur » en absolu, mais de cas d’usage.

Island Architecture — le secret de la vitesse d’Astro

Vous connaissez ce cas : le contenu s’affiche, mais les boutons ne répondent pas ?

Souvent, c’est l’hydratation JavaScript. Les frameworks classiques envoient tout le JS de la page au navigateur, qui « active » progressivement l’interface. Plus la page est complexe, plus l’attente est longue.

Astro fait l’inverse. Il s’appuie sur l’Island Architecture (architecture en îlots).

Comment le voir ? Imaginez la page comme un océan de HTML statique. Seuls les composants vraiment interactifs — compteur, formulaire, zone de commentaires — « émergent » en petites îles indépendantes. Chaque îlot gère son propre JavaScript, sans gêner les autres.

En code, ça ressemble à ceci :

---
// Ce composant ne charge le JS que lorsqu'il devient visible au scroll
---
<Counter client:visible />
// Ce composant reste du HTML statique pur, sans aucun JS
<Header />

Vous voyez client:visible ? C’est une directive Astro : « n’activer ce composant que quand l’utilisateur le voit ». Il existe aussi client:load (activation au chargement) et client:idle (activation quand le navigateur est inactif).

Résultat concret ? Mon FCP est passé de 2,1 s à 0,8 s, le TTI de 4,5 s à 1,2 s. Côté bundle : 280 Ko de JS, il n’en reste plus que 45 Ko.

Soyons justes : si toute votre page est interactive, Astro n’est peut-être pas le meilleur choix. Son avantage, c’est le contenu majoritairement statique. Pour un blog ou une doc, c’est un changement de niveau.

Server Islands — la nouveauté d’Astro 5

Astro 5 ajoute les Server Islands, assez intéressantes.

Avant : page surtout statique, mais un bloc dynamique (avatar, panier) — que faire ? Tout rendre dynamique, ou renoncer à la personnalisation.

L’idée des Server Islands : d’abord un shell HTML statique, puis injection côté serveur des parties dynamiques.

Officiellement : « performance et personnalisation ne s’excluent plus ». En test, c’est effectivement fluide.

Content Layer — une nouvelle façon de gérer le contenu

Au-delà de 100 articles, un problème revient : la gestion du contenu devient le bazar.

L’approche classique : empiler des Markdown dans src/content, organisés par le système de fichiers. Ça va au début ; ensuite, retrouver un fichier ou brancher un CMS devient pénible.

Le Content Layer d’Astro 5 change la donne.

Au cœur, un mécanisme Loader. Vous chargez depuis n’importe où : Markdown local, Strapi, Contentful, Notion, ou une API maison. Les sources sont unifiées, la gestion devient plus claire.

// astro.config.mjs
import { defineCollection, z } from 'astro:content';
const blog = defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
  schema: z.object({
    title: z.string(),
    pubDate: z.date(),
    tags: z.array(z.string()),
  }),
});

Cette config charge tous les Markdown de ./src/content/blog ; chaque article doit avoir title, pubDate et tags.

Côté perf, Astro annonce jusqu’à 5× plus rapide pour le Markdown, 2× pour le MDX, et 25 à 50 % de mémoire en moins. Sur mon blog, le build est passé de 2 minutes à 18 secondes — probablement grâce à ça.

J’utilise aujourd’hui un glob loader sur du Markdown local. Prochaine étape : Notion, pour séparer rédaction et publication.

View Transitions — des changements de page fluides

Section plus courte, on passe vite.

Astro 5 renomme l’ancien composant ViewTransitions en ClientRouter — même rôle, nom plus précis pour le routage côté client.

---
import { ClientRouter } from 'astro:transitions';
---
<html>
  <head>
    <ClientRouter />
  </head>
  <body>
    <!-- Votre contenu -->
  </body>
</html>

Avec ce composant, les changements de page ont une transition au lieu d’un saut sec. L’expérience s’améliore nettement.

En 2025, l’API View Transitions native est supportée par presque tous les navigateurs modernes ; Firefox était le dernier. ClientRouter dégrade gracieusement sur les navigateurs non compatibles.

Pour partager un état entre pages (lecteur audio qui continue), ClientRouter est le bon choix. Pour une simple animation, les View Transitions CSS natives suffisent souvent.

Configuration SEO en pratique

Partie importante. Beaucoup pensent qu’Astro « va vite, c’est bon » — le SEO compte aussi. Les moteurs regardent la structure et les métadonnées, pas seulement la vitesse.

Ma première config SEO m’a coûté pas mal d’erreurs. Voici ce qui fonctionne.

Configuration du sitemap

Commencez par le sitemap — basique et facile à oublier.

npx astro add sitemap

Puis dans astro.config.mjs, ajoutez l’URL du site :

import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
  site: 'https://yourdomain.com', // N'oubliez pas cette ligne !
  integrations: [sitemap()],
});

La première fois, j’avais oublié site : le sitemap était en chemins relatifs, Google ne le prenait pas. J’ai mis plusieurs jours à comprendre.

Gestion des balises meta

Chaque article doit avoir son title et sa description. Je les centralise dans le frontmatter Markdown :

---
title: "Guide d'optimisation des performances Astro 5"
description: "Island Architecture et Content Layer d'Astro 5 expliqués en profondeur..."
publishDate: 2025-11-20
ogImage: "/images/astro-5-cover.png"
---

Puis dans le layout :

---
const { title, description, ogImage } = Astro.props.frontmatter;
---
<head>
  <title>{title}</title>
  <meta name="description" content={description} />
  <meta property="og:title" content={title} />
  <meta property="og:description" content={description} />
  <meta property="og:image" content={ogImage} />
  <link rel="canonical" href={Astro.url} />
</head>

L’URL canonique évite que le même contenu soit traité comme dupliqué.

Données structurées (JSON-LD)

Souvent ignorées, mais utiles pour le SEO : indiquer qu’il s’agit d’un article, qui est l’auteur, quand c’est publié.

<script type="application/ld+json">
  {JSON.stringify({
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "headline": title,
    "datePublished": publishDate,
    "author": {
      "@type": "Person",
      "name": "Votre nom"
    }
  })}
</script>

Vérifiez avec le Schema.org Validator.

Tendances SEO 2025

Quelques points importants cette année :

  1. Les LLM crawllent aussi vos pages. Moteurs et IA s’appuient sur un contenu structuré ; la clarté bat le bourrage de mots-clés.
  2. Les liens internes comptent. Au moins 3 par page, sinon l’indexation peut en pâtir.
  3. Principe E-E-A-T — expérience, expertise, autorité, fiabilité : ce n’est pas du folklore, c’est un facteur réel chez Google.

Checklist SEO

À cocher après configuration :

  • sitemap.xml généré et accessible
  • title et description uniques par page
  • attribut alt sur toutes les images
  • JSON-LD structuré ajouté
  • robots.txt correct
  • au moins 3 liens internes par page

Optimisation des images — un tueur de perf sous-estimé

Ça paraît simple, mais compresser ne suffit pas.

Astro intègre astro:assets et un composant Image très capable :

---
import { Image } from 'astro:assets';
import myImage from '../assets/hero.png';
---
<Image
  src={myImage}
  alt="Hero image"
  widths={[400, 800, 1200]}
  format="webp"
/>

Ce code :

  1. Déduit largeur/hauteur pour limiter le CLS
  2. Génère plusieurs tailles, chargées selon le navigateur
  3. Convertit en WebP pour un poids plus faible

Point clé : mettez les images dans src, pas dans public. Astro optimise src, pas public. J’avais mis au mauvais endroit — des fichiers énormes.

Astuce : pour une image distante, inferSize récupère les dimensions :

<Image
  src="https://example.com/image.jpg"
  alt="Remote image"
  inferSize
/>

Résultat ? Le projet open source AstroEdge : 4,2 Mo → 0,8 Mo (−82 %), score perf 79 → 100.

Astro 5 ajoute aussi le recadrage expérimental et le support SVG — voir la doc officielle.

Migration depuis d’autres frameworks

Depuis Astro 4 ou un autre framework, lecture rapide.

Changements majeurs d’Astro 5 :

  1. ViewTransitionsClientRouter
  2. Astro.glob() déprécié → import.meta.glob() ou getCollection()
  3. Mode hybrid fusionné dans la sortie static
  4. Service d’images : Squoosh → Sharp
  5. Protection CSRF activée par défaut

Commande de migration :

npx @astrojs/upgrade

Elle gère la plupart des compatibilités et signale le reste.

Depuis Next.js ou Gatsby, c’est plus lourd — mais Astro accepte les composants React : migrez d’abord les pages, remplacez les composants progressivement.

Pour conclure

L’essentiel :

  1. Island Architecture : zéro JS par défaut, perf naturellement en avance
  2. Content Layer : contenu unifié, toute source de données
  3. SEO : quelques étapes simples, chacune importante
  4. Images : gros levier caché, ne pas négliger
  5. View Transitions : navigation plus fluide

Vous hésitez sur le framework de votre blog ? Prenez une demi-heure pour le template officiel Astro et mesurez build + Lighthouse.

npm create astro@latest -- --template blog

Template prêt à l’emploi — ajustez la config et publiez.

Ressources utiles :

Prochain article prévu : tutoriel Astro + Tailwind + MDX pour un blog technique — restez connectés si ça vous intéresse.

Quel framework utilise votre blog ? Les perfs vous ont-elles déjà posé problème ? Dites-le en commentaire.

Migration complète de Next.js vers Astro 5

De la préparation à la config SEO : étapes pour passer le score Lighthouse de 68 à 98

Estimated time: PT4H

  1. 1

    Step 1: Comprendre l’Island Architecture et les gains de perf

    Cœur de l’Island Architecture :
  2. 2

    Step 2: Configurer le Content Layer

    Le Content Layer repose sur les Loaders :
  3. 3

    Step 3: • Test réel

    build de 2 min à 18 s
  4. 4

    Step 4: Configurer le SEO

    Sitemap :
  5. 5

    Step 5: • Commande

    npx astro add sitemap
  6. 6

    Step 6: • Dans astro.config.mjs

    site: ‘https://yourdomain.com’
  7. 7

    Step 7: • Liens internes

    au moins 3 par page
  8. 8

    Step 8: Optimiser les images

    Module astro:assets et composant Image :
  9. 9

    Step 9: • Images distantes

    inferSize pour les dimensions
  10. 10

    Step 10: Configurer View Transitions

    Astro 5 renomme ViewTransitions en ClientRouter — même rôle, nom plus précis pour le routage client. Usage : import { ClientRouter } from ‘astro:transitions’, puis <ClientRouter /> dans <head>. Les changements de page ont une transition au lieu d’un saut sec. En 2025, l’API View Transitions native est supportée par presque tous les navigateurs (Firefox en dernier) ; ClientRouter dégrade sur les anciens. Pour un état partagé entre pages (lecteur audio), ClientRouter convient. Pour une simple animation, les View Transitions CSS natives suffisent.
  11. 11

    Step 11: Migrer depuis d’autres frameworks

    Changements Astro 5 : ViewTransitions → ClientRouter ; Astro.glob() déprécié → import.meta.glob() ou getCollection() ; mode hybrid fusionné dans static ; images Squoosh → Sharp ; CSRF activé par défaut. Migration : npx @astrojs/upgrade (gère la plupart des compatibilités). Depuis Next.js ou Gatsby, plus de travail — Astro supporte React : migrez les pages d’abord, remplacez les composants ensuite.

FAQ

Quel gain de performance après une migration Next.js → Astro 5 ? Données concrètes ?
Données de test sur projet réel :
• Temps de build : 2 min → 18 s (−85 %)
• Score Lighthouse : 68 → 98 (+44 %)
• FCP : 2,1 s → 0,8 s (+62 %)
• TTI : 4,5 s → 1,2 s (+73 %)
• Bundle JS : 280 Ko → 45 Ko (−84 %)

Enquête State of JavaScript 2024 :
• Astro en tête sur intérêt, rétention et satisfaction
• 60 % des sites Astro passent Core Web Vitals vs 38 % WordPress/Gatsby

Astro apporte un avantage net en performance, surtout pour les sites orientés contenu.
Qu'est-ce que l'Island Architecture d'Astro ? Comment la comprendre et l'utiliser ?
Cœur de l'Island Architecture :
• Page = océan de HTML statique ; seuls les composants interactifs (compteur, formulaire, commentaires) émergent en îlots
• Chaque îlot gère son JavaScript indépendamment

Exemple de code :
• <Counter client:visible /> (JS chargé seulement quand visible au scroll)
• <Header /> (HTML statique pur, aucun JS)

Directives Astro :
• client:visible (activation à la visibilité)
• client:load (activation au chargement)
• client:idle (activation en idle)

Server Islands (Astro 5) :
• Shell HTML statique, puis injection serveur des parties dynamiques
• Performance et personnalisation ne s'excluent plus

Page entièrement interactive ? Astro est moins adapté. Pour blog et doc, l'avantage est majeur.
Comment configurer le Content Layer d'Astro 5 ? Quels gains de performance ?
Le Content Layer repose sur les Loaders :
• Markdown local, Strapi, Contentful, Notion, API maison
• Sources unifiées, gestion simplifiée

Exemple dans astro.config.mjs :
defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
schema: z.object({
title: z.string(),
pubDate: z.date(),
tags: z.array(z.string())
})
})

Charge tous les Markdown de ./src/content/blog ; title, pubDate et tags obligatoires.

Performance :
• Markdown jusqu'à 5× plus rapide, MDX 2×
• Mémoire −25 à 50 %
• Mon blog : build 2 min → 18 s

J'utilise un glob loader local ; prochaine étape : Notion pour séparer rédaction et publication.
Comment configurer le SEO avec Astro 5 ? Points clés ?
Sitemap :
• npx astro add sitemap
• site: 'https://yourdomain.com' dans astro.config.mjs (sinon chemins relatifs, Google ignore)

Balises meta :
• title et description uniques par article
• Frontmatter Markdown (title, description, publishDate, ogImage)
• Layout : title, meta, URL canonique (évite le duplicate content)

JSON-LD :
• Type d'article, auteur, date — souvent ignoré mais utile
• Vérifier avec Schema.org Validator

SEO 2025 :
1) Les LLM crawllent vos pages ; contenu structuré > bourrage de mots-clés
2) Liens internes : au moins 3 par page
3) E-E-A-T : facteur réel chez Google

Checklist :
• sitemap.xml accessible
• title/description uniques
• alt sur les images
• JSON-LD
• robots.txt
• ≥ 3 liens internes par page
Comment optimiser les images avec Astro ? Astuces clés ?
Module astro:assets, composant Image :
• Dimensions inférées, moins de CLS
• Tailles multiples, chargement adaptatif
• WebP pour un poids réduit

Exemple :
import { Image } from 'astro:assets'
import myImage from '../assets/hero.png'
<Image src={myImage} alt="Hero image" widths={[400, 800, 1200]} format="webp" />

Points clés :
• Images dans src, pas public
• src optimisé par Astro, public non

Image distante : inferSize
<Image src="https://example.com/image.jpg" alt="Remote image" inferSize />

Effet :
• Projet AstroEdge : 4,2 Mo → 0,8 Mo (−82 %)
• Score 79 → 100

Astro 5 : recadrage expérimental et support SVG — voir la doc.
Que faut-il savoir pour migrer vers Astro 5 depuis un autre framework ?
Changements Astro 5 :
1) ViewTransitions → ClientRouter
2) Astro.glob() déprécié → import.meta.glob() ou getCollection()
3) Hybrid fusionné dans static
4) Images : Squoosh → Sharp
5) CSRF activé par défaut

Migration :
• npx @astrojs/upgrade (compatibilité automatique + indications manuelles)

Depuis Next.js ou Gatsby :
• Plus de travail, mais composants React supportés — pages d'abord, composants ensuite

Conseil :
• Testez le template officiel 30 min (build + Lighthouse)
• npm create astro@latest -- --template blog
• Prêt à publier après quelques réglages

10 min de lecture · Publié le: 24 nov. 2025 · Mis à jour le: 27 juil. 2026

Commentaires

Connectez-vous avec GitHub pour laisser un commentaire

Easton BlogEaston Blog