Quand j’ai décidé de créer ce blog, j’ai hésité entre deux frameworks : Astro et Next.js. Les deux sont excellents, mais pour des raisons très différentes.

Le contexte

Mon besoin était simple :

  • Un blog avec des articles en Markdown
  • Du syntax highlighting pour les blocs de code
  • Des embeds audio/vidéo
  • Zéro JS inutile côté client
  • Facile à déployer sur un hébergement classique

Next.js : le couteau suisse

Next.js est incroyable pour les applications web dynamiques. Server-side rendering, API routes, middleware — la totale.

// pages/blog/[slug].js (Next.js)
import { getPostBySlug, getAllPosts } from '../../lib/api';
import markdownToHtml from '../../lib/markdown';

export default function Post({ post }) {
  return (
    <article>
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
    </article>
  );
}

export async function getStaticPaths() {
  const posts = getAllPosts();
  return {
    paths: posts.map((post) => ({ params: { slug: post.slug } })),
    fallback: false,
  };
}

Le problème ? Pour un blog statique, c’est overkill. Le bundle JS est plus lourd qu’il ne devrait l’être, et la config peut vite devenir complexe.

Astro : le bon outil

Astro a été conçu pour le contenu. Il génère du HTML statique par défaut et n’envoie du JavaScript que quand c’est nécessaire.

---
// src/pages/blog/[slug].astro
const { slug } = Astro.params;
const post = await getPost(slug);
---

<article>
  <h1>{post.title}</h1>
  <Content />
</article>

Zéro JavaScript envoyé au navigateur pour afficher un article. Les performances sont imbattables.

Le verdict

CritèreAstroNext.js
Contenu statique⭐⭐⭐⭐⭐
Apps dynamiques⭐⭐⭐
Taille du bundle~0 KB JS~80+ KB JS
Markdown natif❌ (plugin)
Courbe d’apprentissageFacileMoyenne

Pour un blog/portfolio : Astro sans hésitation. Pour une SaaS ou une app complexe : Next.js.

“The best framework is the one that lets you ship.” — Moi, probablement.