Astro est devenu en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer) le framework de référence pour les sites de contenu : blogs, documentations, sites marketing, portfolios, e-commerce statique. Sa philosophie « Islands Architecture » (rendu HTML statique par défaut, JavaScript hydraté uniquement où nécessaire) en fait l’option la plus performante pour Lighthouse 100/100/100/100. La version 5 stable depuis fin 2024 apporte content layer, server islands, et server-side rendering hybride. Voici le guide pratique pour utiliser Astro 5 en 2026, particulièrement adapté au contexte africain où la performance des sites est critique.
Ce guide général couvre l’écosystème complet. Les articles connexes détaillent : Content Collections Astro 5, Server Islands Astro, déployer Astro sur Cloudflare Pages ou Coolify, Astro vs Next.js comparatif.
Pourquoi Astro en 2026
- Performance par défaut : zéro JS sur les pages statiques. Score Lighthouse 100 avec très peu d’effort.
- Content-first : Markdown / MDX nativement, type-safe via Content Collections
- Multi-framework UI : utilisez React, Vue, Svelte, Solid, Preact dans le même projet
- Server Islands (Astro 5) : hydratation différée de composants serveur, parfait pour personnalisation légère
- SSR hybride : statique par défaut, rendre dynamique seulement les pages qui le nécessitent
- SEO natif : sitemaps, RSS, Open Graph, structured data sans plugin
- Image optimization intégrée (WebP, AVIF, lazy loading, responsive)
- Image et i18n natifs en v5
Cas d’usage idéaux
- Blog ou site média (le cas typique d’itskillscenter.io)
- Site marketing pour SaaS, agence, freelance
- Documentation produit ou technique
- Portfolio
- E-commerce simple (1000 produits ou moins) avec Astro + Decap CMS
Prérequis
- Node.js 20+ ou Bun
- Connaissance HTML/CSS, notion de TypeScript ou JavaScript
- Niveau attendu : débutant à intermédiaire
- Temps : 1 heure pour le hello world, 1 journée pour un blog complet, 1 semaine pour un site marketing pro
Étape 1 — Créer un projet Astro
# Avec Bun (recommandé)
bun create astro@latest mon-site
# ou npm
npm create astro@latest mon-site
# Wizard interactif :
# - Where? mon-site
# - Template? "Use blog template" pour démarrer
# - Install dependencies? Yes
# - Init git repo? Yes
# - TypeScript? Strict
cd mon-site
bun run dev
# Ouvert sur http://localhost:4321
Étape 2 — Structure du projet
mon-site/
├── src/
│ ├── pages/ # Routes file-based
│ │ ├── index.astro
│ │ └── blog/
│ │ └── [slug].astro
│ ├── content/ # Collections markdown/mdx
│ │ ├── config.ts
│ │ └── blog/
│ │ └── premier-article.md
│ ├── components/
│ ├── layouts/
│ └── styles/
├── public/ # Assets statiques
├── astro.config.mjs
└── package.json
Étape 3 — Une page Astro
---
// src/pages/index.astro
import Layout from "../layouts/Base.astro";
const title = "ITSkillsCenter — Formation IT Afrique";
---
<Layout title={title}>
<section class="hero">
<h1>Formation IT pratique pour l'Afrique</h1>
<p>Cybersécurité, dev web, IA : maîtrisez les outils modernes.</p>
<a href="/formations" class="btn">Voir les formations</a>
</section>
</Layout>
<style>
.hero { padding: 4rem 2rem; text-align: center; }
h1 { font-size: 3rem; }
</style>
Étape 4 — Content Collections type-safe
Astro 5 a refondu Content Collections avec le « Content Layer » qui permet de charger du contenu depuis Markdown, MDX, JSON, ou des sources externes (Strapi, Notion, Sanity).
// src/content/config.ts
import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";
const blog = defineCollection({
loader: glob({ pattern: "**/*.md", base: "src/content/blog" }),
schema: z.object({
title: z.string().min(10).max(100),
description: z.string(),
pubDate: z.coerce.date(),
author: z.string().default("ITSkillsCenter"),
tags: z.array(z.string()).default([]),
cover: z.string().optional(),
}),
});
export const collections = { blog };
Voir notre tutoriel Content Collections Astro 5 pour le détail.
Étape 5 — Server Islands
L’innovation majeure d’Astro 5. Permet d’avoir une page principalement statique avec quelques composants rendus côté serveur à chaque requête (sans hydrater toute la page) :
// Composant rendu serveur, pas hydrate
<UserProfile server:defer>
<Skeleton slot="fallback" />
</UserProfile>
Voir notre tutoriel Server Islands.
Étape 6 — Image optimization
---
import { Image } from "astro:assets";
import cover from "../assets/dakar.jpg";
---
<Image
src={cover}
alt="Dakar"
width={1200}
height={600}
format="webp"
loading="lazy"
/>
Astro génère automatiquement plusieurs tailles, sert WebP/AVIF aux navigateurs compatibles, ajoute lazy loading. Idéal pour les visiteurs sur connexion 3G en Afrique.
Étape 7 — i18n natif
// astro.config.mjs
export default defineConfig({
i18n: {
defaultLocale: "fr",
locales: ["fr", "en", "ar"],
routing: {
prefixDefaultLocale: false,
},
},
});
Pour un site qui sert l’Afrique de l’Ouest, le multilinguisme français/anglais/arabe est un plus. Astro gère les routes /about, /en/about, /ar/about automatiquement.
Étape 8 — Déployer
- Cloudflare Pages (gratuit, edge mondial, latence Afrique excellente)
- Coolify sur VPS Hetzner
- Vercel / Netlify (managé, plan gratuit généreux)
- VPS nu via systemd + Caddy
Voir notre tutoriel déploiement Astro.
Adaptation Afrique de l’Ouest
Astro est le framework rêvé pour l’Afrique : sites ultra-légers (50-200 Ko initial vs 500 Ko-2 Mo pour un Next.js typique), pages servies depuis edge Cloudflare proche (Lagos, Casablanca), SEO natif, score Lighthouse 100. Parfait pour blogs, sites marketing, e-commerce simple où vos visiteurs sont en 3G ou Wi-Fi instable.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| Hydration mismatch | Composant client avec props serveur | Utiliser client:load avec attention |
| Build OOM | Beaucoup de pages générées | Augmenter Node memory NODE_OPTIONS=–max-old-space-size=4096 |
| Images non générées | Mauvais path | Toujours import via src/assets/ |
| Pages 404 en prod | SSR mal configuré | output: hybrid + adapter approprié |
Dans la continuité
- Content Collections Astro 5
- Server Islands Astro
- Déployer Astro sur Cloudflare Pages ou Coolify
- Astro vs Next.js comparatif
- Documentation officielle : docs.astro.build
Étape 1 — Pourquoi Astro 5 plutôt que WordPress ou Next.js en Afrique
Sur les connexions 3G fréquentes à Bamako, Ouagadougou ou en zone rurale ivoirienne, chaque kilo-octet compte. Astro 5 (sorti en stable mi-2024, version courante en janvier 2026 : 5.x) génère par défaut du HTML statique sans JavaScript inutile. Un site vitrine Astro pèse typiquement 30–80 Ko, contre 800 Ko à 2 Mo pour un site WordPress non optimisé.
Le second argument est financier. Un hébergement statique sur Cloudflare Pages, Netlify ou Vercel coûte 0 FCFA jusqu’à 100 000 visites/mois. Un VPS WordPress mutualisé démarre à 3 500 FCFA/mois, et une instance dédiée correctement sécurisée monte vite à 25 000 FCFA/mois. Pour une PME qui démarre, l’écart annuel dépasse 300 000 FCFA.
Étape 2 — Installer Node 22 LTS et créer le projet
Astro 5 exige Node 18.20.8 ou supérieur, mais la version recommandée en 2026 est Node 22 LTS (sortie en avril 2024, support jusqu’en avril 2027). Sous Ubuntu/Debian sur votre VPS Dakar ou en local :
# Installer Node 22 via nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
nvm install 22
nvm use 22
node -v # doit afficher v22.x.x
Résultat attendu : v22.11.0 ou supérieur. Si vous voyez v18.x, fermez puis rouvrez le terminal, ou exécutez nvm use 22 à nouveau.
# Créer le projet Astro
npm create astro@latest mon-site-astro
# Réponses suggérées :
# Where should we create your project ? .
# How would you like to start ? Empty
# Install dependencies ? Yes
# Initialize a new git repository ? Yes
# TypeScript ? Yes (strict)
cd mon-site-astro
npm run dev
Ouvrez http://localhost:4321. La page d’accueil par défaut s’affiche. Si le port 4321 est occupé, Astro bascule automatiquement sur 4322.
Étape 3 — Première page et layout réutilisable
Créez src/layouts/Base.astro pour mutualiser l’en-tête, le pied de page et les balises SEO. Sur l’Afrique de l’Ouest, pensez à pré-déclarer le français comme langue par défaut et à inclure une balise hreflang si vous publiez aussi en anglais.
---
// src/layouts/Base.astro
const { title = "Mon site", desc = "" } = Astro.props;
---
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>{title}</title>
<meta name="description" content={desc} />
</head>
<body>
<slot />
</body>
</html>
Puis src/pages/index.astro qui consomme ce layout :
---
import Base from "../layouts/Base.astro";
---
<Base title="Accueil — PME Dakar" desc="Site vitrine ultra-rapide">
<h1>Bienvenue</h1>
<p>Notre PME accompagne les commerçants de Dakar.</p>
</Base>
Rechargez le navigateur. Le HTML rendu fait moins de 2 Ko et ne charge aucun JavaScript — exactement ce qu’on veut sur une connexion Orange 3G à Tambacounda.
Étape 4 — Content Layer : transformer Markdown en pages
Astro 5 a remplacé l’ancien Content Collections par la Content Layer API, plus rapide (build 5–10× plus court sur gros sites) et capable de charger du contenu depuis n’importe quelle source (Markdown local, API headless, Google Sheets, Notion).
// src/content.config.ts
import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";
const articles = defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/content/articles" }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
ville: z.enum(["Dakar","Abidjan","Cotonou","Lomé"]),
excerpt: z.string().max(160),
}),
});
export const collections = { articles };
Créez src/content/articles/lancer-boutique-dakar.md :
---
title: "Lancer une boutique en ligne à Dakar"
date: 2026-01-12
ville: Dakar
excerpt: "Étapes pratiques pour ouvrir une boutique e-commerce à Dakar en 2026."
---
Voici le contenu en Markdown...
Vous devriez obtenir au build : Astro lit tous les fichiers correspondant au pattern, valide leur frontmatter contre le schéma Zod, et génère un type TypeScript automatique. Une erreur de typage = build cassé immédiatement, ce qui évite la publication d’un article sans champ obligatoire.
Étape 5 — Islands React pour les zones interactives
Astro reste statique par défaut, mais vous pouvez injecter une « island » React, Vue ou Svelte uniquement là où c’est nécessaire (formulaire de contact, panier, calculateur). Le reste de la page reste 0 ko de JS.
npx astro add react
# Astro modifie astro.config.mjs et installe @astrojs/react
// src/components/CalcFCFA.tsx
import { useState } from "react";
export default function CalcFCFA() {
const [eur, setEur] = useState(100);
const fcfa = (eur * 655.957).toLocaleString("fr-FR");
return (
<div>
<input type="number" value={eur} onChange={e => setEur(+e.target.value)} />
<p>{eur} EUR = {fcfa} FCFA</p>
</div>
);
}
---
// src/pages/calculatrice.astro
import Base from "../layouts/Base.astro";
import CalcFCFA from "../components/CalcFCFA.tsx";
---
<Base title="Convertisseur EUR FCFA">
<h1>Convertisseur instantané</h1>
<CalcFCFA client:visible />
</Base>
La directive client:visible charge React uniquement quand la calculatrice entre dans le viewport. Sur une page d’accueil sans calculatrice, le visiteur ne télécharge jamais React.
Étape 6 — Build et inspection du bundle
npm run build
# Sortie typique :
# dist/index.html 1.8 KB
# dist/calculatrice/index.html 2.1 KB
# dist/_astro/CalcFCFA.xxx.js 12 KB (gzip 4.3 KB)
# Server built in 1.42s
Auditez le dossier dist/. Aucun fichier JS ne doit apparaître pour les pages purement statiques. Si vous voyez du JS sur la page d’accueil, c’est qu’un composant a une directive client:* non nécessaire — corrigez avant déploiement.
Lancez Lighthouse sur npm run preview. Sur une page Astro standard, le score Performance dépasse 98/100 et le LCP reste sous 1,2 s même en throttling 3G — quasiment impossible à obtenir avec WordPress sans CDN.
Étape 7 — Déployer sur Cloudflare Pages depuis Dakar
Cloudflare Pages reste l’option la plus rapide pour servir un site statique en Afrique de l’Ouest grâce à ses POP de Lagos, Accra et Casablanca. Le tier gratuit couvre 500 builds/mois et un trafic illimité.
# Pousser le code sur GitHub
git add .
git commit -m "init Astro 5 site"
git remote add origin git@github.com:USER/mon-site-astro.git
git push -u origin main
Sur dash.cloudflare.com → Workers & Pages → Create application → Pages → Connect to Git. Sélectionnez le dépôt, framework preset = Astro, build command = npm run build, output directory = dist. Cliquez Save and Deploy.
Résultat type : build en 35–60 s, URL mon-site-astro.pages.dev active. Pour brancher un domaine .sn ou .ci, ajoutez-le dans Custom Domains et créez un CNAME chez votre registrar (Sonatel, NIC.ci, etc.).
Étape 8 — Mesurer depuis l’Afrique réelle
Ne vous fiez pas uniquement aux tests Lighthouse depuis votre poste. Testez depuis webpagetest.org en sélectionnant la localisation « Lagos » ou « Cape Town » et le profil réseau « 3G Slow ». Sur Astro 5 bien configuré, le Time To First Byte reste sous 600 ms et le visuel complet sous 2 s.
Pour la suite, lisez notre tutoriel Headscale + Caddy HTTPS si vous voulez sécuriser l’accès à votre staging Astro depuis un VPN privé, et notre guide LinkedIn B2B pour générer du trafic qualifié vers votre nouveau site.
Étape 9 — Maintenance et mises à jour mensuelles
Astro évolue vite : une version mineure tous les deux mois, des correctifs hebdomadaires sur les intégrations. Bloquez 30 minutes par mois pour npm outdated, lire les notes de version et appliquer npx @astrojs/upgrade qui met à jour Astro et toutes ses intégrations officielles d’un coup.
npx @astrojs/upgrade
# Astro vous propose les versions cibles, accepte avec Y
npm run build # vérifie qu'aucun breaking change ne casse le build
git diff package.json # garde une trace
git commit -am "chore: bump Astro deps"
git push # Cloudflare Pages rebuilde automatiquement
Ne sautez pas plus de deux versions majeures sans relire les notes de migration — la dette grimpe vite. Si vous gérez plusieurs sites Astro pour des clients à Dakar ou Abidjan, mutualisez ce rituel mensuel et facturez-le 25 000–40 000 FCFA par site, c’est un revenu récurrent simple.
Étape 9 — Maintenance et mises à jour mensuelles
Astro évolue vite : une version mineure tous les deux mois, des correctifs hebdomadaires sur les intégrations. Bloquez 30 minutes par mois pour npm outdated, lire les notes de version et appliquer npx @astrojs/upgrade qui met à jour Astro et toutes ses intégrations officielles d’un coup.
npx @astrojs/upgrade
# Astro vous propose les versions cibles, accepte avec Y
npm run build # vérifie qu'aucun breaking change ne casse le build
git diff package.json # garde une trace
git commit -am "chore: bump Astro deps"
git push # Cloudflare Pages rebuilde automatiquement
Ne sautez pas plus de deux versions majeures sans relire les notes de migration — la dette grimpe vite. Si vous gérez plusieurs sites Astro pour des clients à Dakar ou Abidjan, mutualisez ce rituel mensuel et facturez-le 25 000–40 000 FCFA par site, c’est un revenu récurrent simple. Pensez aussi à activer Dependabot sur GitHub pour recevoir un PR automatique dès qu’une faille de sécurité est annoncée sur l’une de vos dépendances.