Markdown Astro avancé : 7 astuces pour un blog 10× plus pro

Vous venez de lancer un blog avec Astro et vous rédigez votre premier article technique. Vous voulez surligner une ligne de code ? Impossible. Un encadré repliable pour avertir le lecteur ? Pas possible. Une formule mathématique dans un tuto d’algorithmes ? Aucune idée par où commencer.
Je suis passé par là. En Markdown pur, j’ai vite senti les limites : sur d’autres blogs, les blocs de code mettent en avant l’essentiel, montrent avant/après, et intègrent des composants interactifs — moi, je ne pouvais que coller du code brut.
Heureusement, Astro propose le MDX, un « Markdown renforcé » : composants et JSX dans l’article, et beaucoup plus de possibilités.
Cet article partage 7 usages avancés de Markdown/MDX dans Astro, de la configuration de base à la coloration, aux composants, aux formules et aux diagrammes — avec code et étapes complètes. À la fin, votre blog passe de « lisible » à professionnel.
Première partie : passer de Markdown à MDX
Pourquoi utiliser le MDX ?
La différence entre Markdown et MDX, c’est un peu vélo vs vélo électrique : les deux roulent, l’expérience n’a rien à voir.
Le Markdown pur ne gère que texte, blocs de code et images. Un encadré d’avertissement ? Il faut du HTML brut. Un composant interactif dans l’article ? Quasi impossible.
Le MDX, c’est Markdown + JSX. Vous pouvez :
- Importer et utiliser des composants : tout composant Astro, React ou Vue dans un
.mdx - Écrire des expressions JSX :
{variable}, boucles, conditions - Personnaliser les éléments : remplacer un
<h1>standard par votre composant stylé
Exemple concret — un encadré d’avertissement :
En Markdown pur :
<div class="warning">
<p>Attention : cette opération supprimera toutes les données !</p>
</div>
En MDX :
import Alert from '@/components/Alert.astro';
<Alert type="warning">
Attention : cette opération supprimera toutes les données !
</Alert>
Le MDX, c’est assembler des briques, pas écrire du HTML partout.
Configurer MDX en 5 minutes
Trois étapes suffisent.
Étape 1 : installer l’intégration
npx astro add mdx
La CLI installe @astrojs/mdx et met à jour la config. Répondez Yes aux questions.
Étape 2 : vérifier la configuration
Dans astro.config.mjs :
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
});
Sinon, ajoutez-le à la main.
Étape 3 : tester
Créez test.mdx dans src/pages/ ou src/content/ :
---
title: Test MDX
---
# Test MDX
Texte Markdown classique.
export const greeting = "Bonjour";
Variable : {greeting} !
<div style="padding: 1rem; background: #f0f0f0;">
Élément JSX
</div>
Lancez npm run dev : si variable et JSX s’affichent, MDX fonctionne.
Coexistence .md et .mdx
Après l’intégration MDX, les .md restent valides. Astro choisit selon l’extension :
.md: Markdown standard.mdx: MDX (composants + JSX)
Conseil : .md pour les articles simples, .mdx quand il faut des composants.
Deuxième partie : coloration du code avancée
Thème Shiki
Astro utilise Shiki par défaut — très bien. Le thème par défaut est github-dark ; vous pouvez l’adapter au style du blog.
Shiki ou Prism ?
Je recommande Shiki : intégration native, 100+ langages et thèmes, rendu côté serveur sans JS supplémentaire. Prism est correct mais demande plus de CSS et de config.
Changer le thème
Dans astro.config.mjs :
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
markdown: {
shikiConfig: {
theme: 'dracula', // github-dark, nord, monokai, dracula, etc.
},
},
});
Thèmes courants :
github-dark/github-lightdraculanordone-dark-pro
Prévisualisation : Shiki themes.
Thèmes clair / sombre
markdown: {
shikiConfig: {
themes: {
light: 'github-light',
dark: 'github-dark',
},
},
},
Shiki suit prefers-color-scheme ou votre logique de thème.
Surligner des lignes et annoter le code
Pour les tutos : « regardez cette ligne » ou « voici ce qui a changé ». Les Shiki Transformers s’en chargent.
Surligner des lignes
npm install shiki
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import { transformerNotationHighlight } from '@shikijs/transformers';
export default defineConfig({
integrations: [mdx()],
markdown: {
shikiConfig: {
theme: 'github-dark',
transformers: [transformerNotationHighlight()],
},
},
});
Dans le bloc :
```javascript
function hello() {
console.log('ligne normale');
console.log('ligne surlignée'); // [!code highlight]
}
```
Diff avant / après
import { transformerNotationDiff, transformerNotationHighlight } from '@shikijs/transformers';
markdown: {
shikiConfig: {
theme: 'github-dark',
transformers: [
transformerNotationHighlight(),
transformerNotationDiff(),
],
},
},
```javascript
function calculate(a, b) {
return a + b; // [!code --]
return a * b; // [!code ++]
}
```
-- = suppression (rouge), ++ = ajout (vert).
Focus sur une zone
import { transformerNotationFocus } from '@shikijs/transformers';
transformers: [
transformerNotationFocus(),
],
```javascript
function process() {
console.log('grisé');
console.log('mis en avant'); // [!code focus]
console.log('grisé');
}
```
Expressive Code (optionnel)
Besoin de plus que Shiki ? Expressive Code ajoute titres de blocs, copie en un clic, numéros de lignes, style terminal, comparaison côte à côte.
npx astro add astro-expressive-code
La CLI configure tout. Utile surtout pour les blogs très orientés code ; sinon Shiki + transformers suffisent.
Troisième partie : composants personnalisés
Importer et utiliser des composants
C’est la force du MDX : Alert, comparaisons de code, sections repliables, etc.
Composant Alert
src/components/Alert.astro :
---
interface Props {
type?: 'info' | 'warning' | 'error';
}
const { type = 'info' } = Astro.props;
const styles = {
info: 'bg-blue-50 border-blue-200 text-blue-800',
warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',
error: 'bg-red-50 border-red-200 text-red-800',
};
---
<div class={`border-l-4 p-4 ${styles[type]}`}>
<slot />
</div>
Dans le .mdx :
---
title: Mon article technique
---
import Alert from '@/components/Alert.astro';
# Titre
Contenu normal.
<Alert type="warning">
Attention : sauvegardez vos données avant cette commande !
</Alert>
<Alert type="info">
Astuce : le **Markdown** fonctionne aussi dans le slot du composant.
</Alert>
Composants React / Vue
import Counter from '@/components/Counter.tsx';
<Counter client:load initialCount={0} />
client:load active l’interactivité côté client.
Organisation
src/
├── components/
│ ├── mdx/
│ │ ├── Alert.astro
│ │ ├── CodeCompare.astro
│ │ ├── Callout.astro
│ │ └── Tabs.astro
Mapper la syntaxe Markdown vers des composants
Vous pouvez remplacer h1, a, img, etc. par vos composants — ancres sur les titres, icône ↗ sur les liens externes, sans modifier chaque article à la main.
Titre personnalisé
CustomHeading.astro :
---
interface Props {
level: 1 | 2 | 3 | 4 | 5 | 6;
id?: string;
}
const { level, id } = Astro.props;
const Tag = `h${level}` as any;
---
<Tag id={id} class="group relative">
<slot />
{id && (
<a href={`#${id}`} class="ml-2 opacity-0 group-hover:opacity-100 transition-opacity">
#
</a>
)}
</Tag>
Dans le .mdx :
import CustomHeading from '@/components/CustomHeading.astro';
export const components = {
h2: (props) => <CustomHeading level={2} {...props} />,
h3: (props) => <CustomHeading level={3} {...props} />,
};
## Titre de niveau 2
Au survol, lien d'ancre #.
### Titre de niveau 3
Liens externes
ExternalLink.astro :
---
interface Props {
href?: string;
}
const { href } = Astro.props;
const isExternal = href?.startsWith('http');
---
<a href={href} target={isExternal ? '_blank' : undefined} rel={isExternal ? 'noopener noreferrer' : undefined}>
<slot />
{isExternal && <span class="ml-1 text-xs">↗</span>}
</a>
import ExternalLink from '@/components/ExternalLink.astro';
export const components = {
a: ExternalLink,
};
[À propos de BetterLink](https://eastondev.com/blog/fr/about/)
[Lien externe](https://example.com)
Pour un mapping global à tous les MDX, il faut un plugin personnalisé dans astro.config.mjs — souvent le mapping par fichier suffit.
Quatrième partie : formules mathématiques et diagrammes
KaTeX pour les formules
Pour algorithmes, maths ou data science, KaTeX est rapide et compatible rendu serveur (souvent préférable à MathJax).
npm install remark-math rehype-katex katex
remark-math: parse LaTeXrehype-katex: rendu HTMLkatex: bibliothèque
astro.config.mjs :
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';
export default defineConfig({
integrations: [mdx()],
markdown: {
remarkPlugins: [remarkMath],
rehypePlugins: [rehypeKatex],
},
});
Dans le layout (MarkdownLayout.astro), dans <head> :
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"
crossorigin="anonymous"
/>
Usage
Formule en ligne ($...$) :
Équation masse-énergie : $E = mc^2$
Racines du trinôme : $x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$
Bloc ($$...$$) :
$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$
$$
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
$$
Dépannage
- CSS KaTeX chargé (onglet Network)
- Version compatible de
rehype-katex(essayer 6.x si besoin) - Syntaxe supportée : KaTeX supported
Mermaid pour flux et schémas
| Solution | Rendu | SEO | Difficulté | Note |
|---|---|---|---|---|
| rehype-mermaid | Serveur | Bon | Moyenne | ⭐⭐⭐⭐⭐ |
| astro-diagram | Serveur | Bon | Faible | ⭐⭐⭐⭐ |
| astro-mermaid | Client | Faible | Faible | ⭐⭐⭐ |
Je recommande rehype-mermaid (SVG statique, SEO).
npm install rehype-mermaid
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import rehypeMermaid from 'rehype-mermaid';
export default defineConfig({
integrations: [mdx()],
markdown: {
rehypePlugins: [
[rehypeMermaid, { strategy: 'img-svg' }]
],
},
});
Exemples
```mermaid
graph TD
A[Début] --> B{MDX installé ?}
B -->|Oui| C[Configurer la coloration]
B -->|Non| D[Installer MDX]
D --> C
C --> E[Terminé]
```
```mermaid
sequenceDiagram
Utilisateur->>Navigateur: Visite la page
Navigateur->>Serveur: Requête HTML
Serveur->>Navigateur: Page rendue
Navigateur->>Utilisateur: Affichage
```
Au npm run build, les diagrammes deviennent des SVG statiques — rapides, sans JS client.
Si erreur Puppeteer : npm install -D playwright, ou essayez astro-diagram.
Cinquième partie : astuces avancées et bonnes pratiques
Content Collections et MDX
Avec Content Collections (src/content/), le frontmatter est validé et l’API typée.
src/content/config.ts :
import { defineCollection, z } from 'astro:content';
const blog = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
description: z.string(),
pubDate: z.date(),
tags: z.array(z.string()).optional(),
draft: z.boolean().default(false),
}),
});
export const collections = { blog };
Dans le MDX :
---
title: Tutoriel MDX Astro avancé
description: Usages avancés du MDX
pubDate: 2025-12-02
tags: [Astro, MDX, Tutoriel]
---
import Alert from '@/components/Alert.astro';
# {frontmatter.title}
<Alert type="info">
Date de publication : {frontmatter.pubDate.toLocaleDateString()}
</Alert>
Table des matières avec getHeadings() :
---
import { getEntry } from 'astro:content';
const entry = await getEntry('blog', 'my-mdx-article');
const { Content, headings } = await entry.render();
---
<aside>
<h2>Sommaire</h2>
<ul>
{headings.map(h => (
<li style={`margin-left: ${(h.depth - 1) * 1}rem`}>
<a href={`#${h.slug}`}>{h.text}</a>
</li>
))}
</ul>
</aside>
<article>
<Content />
</article>
Performance et pièges
- Évitez trop de
client:load; préférez Astro pour le statique,client:visibleouclient:idlepour l’interactif. - Images : composant
Imaged’Astro plutôt que<img>brut.
import { Image } from 'astro:assets';
import cover from './cover.jpg';
<Image src={cover} alt="Image de couverture" width={800} height={600} />
- Beaucoup de MDX :
mdx({ optimize: true })accélère le build (testez le HTML généré).
| Erreur | Cause | Solution |
|---|---|---|
| Composant MDX invisible | Import manquant | Vérifier import |
| Pas d’interactivité | Pas de client:* | Ajouter client:load, etc. |
| Pas de coloration | Config Shiki | Vérifier astro.config.mjs |
| Formules absentes | CSS KaTeX | Lien CSS dans le layout |
| Build lent | Nombreux MDX | optimize: true |
Conclusion
Les 7 astuces en bref :
- MDX — une commande, 5 minutes
- Thème Shiki — style de code sur mesure
- Transformers — lignes clés et diffs
- Composants — Alert, démos interactives
- Mapping — titres, liens, styles globaux
- KaTeX — formules pro
- Mermaid — diagrammes en code, rendu serveur
Parcours suggéré : MDX + un composant → coloration si besoin → KaTeX/Mermaid pour algo/architecture → mapping avancé ensuite.
Checklist :
- MDX rendu correctement
- Coloration des blocs de code
- Composants personnalisés visibles
- Formules (si configuré)
- Diagrammes Mermaid (si configuré)
- Temps de build acceptable
Pour aller plus loin : Astro Integrations, bibliothèques MDX communautaires, View Transitions pour des transitions fluides.
Choisissez une fonctionnalité et testez-la sur votre blog. En cas de blocage, la doc officielle et la communauté Astro aident en général vite.
Au fond, le contenu compte le plus : ces outils clarifient votre expression ; ce qui fidélise les lecteurs, ce sont vos idées et votre expérience. Bonne continuation avec votre blog Astro !
Configuration avancée Markdown/MDX Astro
7 astuces pour un blog plus pro : MDX, coloration, composants, formules et diagrammes
⏱️ Estimated time: 1 hr
- 1
Step 1: Passer de Markdown à MDX
Pourquoi MDX :
• MDX = Markdown + JSX
• Import de composants, expressions JSX, styles personnalisés
• Markdown pur = contenu statique uniquement
Installation :
• npx astro add mdx (ou npm install @astrojs/mdx)
• astro.config.mjs : integrations: [mdx()]
Fichiers .mdx :
• Renommer .md en .mdx ou créer un nouveau fichier
• Importer et utiliser des composants dans l'article - 2
Step 2: Configurer la coloration avec Shiki
Shiki :
• Intégré par défaut dans Astro
Thème :
• markdown.shikiConfig.theme dans astro.config.mjs
• Thèmes : github-dark, monokai, dracula, etc.
Lignes et diffs :
• @shikijs/transformers
• // [!code highlight], // [!code --], // [!code ++] - 3
Step 3: Intégrer des composants personnalisés
Créer les composants :
• Alert.astro, Callout.astro dans src/components/
Usage MDX :
• import Alert from '@/components/Alert.astro';
• <Alert type="warning">Message</Alert>
Mapping :
• export const components = { h2: CustomHeading, a: ExternalLink } - 4
Step 4: Afficher des formules avec KaTeX
Installation :
• npm install remark-math rehype-katex katex
Config :
• remarkPlugins: [remarkMath]
• rehypePlugins: [rehypeKatex]
• CSS KaTeX dans le layout
Syntaxe :
• Inline : $...$
• Bloc : $$...$$ - 5
Step 5: Diagrammes avec Mermaid
Installation :
• npm install rehype-mermaid
Config :
• rehypePlugins: [[rehypeMermaid, { strategy: 'img-svg' }]]
Usage :
• Blocs ```mermaid dans Markdown/MDX
• Rendu serveur au build (SVG statique)
FAQ
Quelle différence entre MDX et Markdown ? Pourquoi MDX ?
• MDX = Markdown + JSX : composants, expressions, styles personnalisés
• Markdown = texte, code, images statiques
Encadré d'avertissement :
• Markdown : HTML brut
• MDX : import Alert + <Alert type="warning">...</Alert>
Capacités MDX :
• import de composants Astro/React/Vue
• {variable}, boucles, conditions
• remplacement des balises standard (h1, etc.)
Comment configurer MDX dans Astro ?
• npx astro add mdx ou npm install @astrojs/mdx
• integrations: [mdx()] dans astro.config.mjs
Fichiers :
• Créer ou renommer en .mdx
• Importer des composants en tête de fichier
Vérification :
• npm run dev et contrôler le rendu des composants et JSX
Comment configurer le thème de coloration du code ?
• markdown.shikiConfig.theme ou themes { light, dark }
Transformers :
• transformerNotationHighlight pour surligner une ligne
• transformerNotationDiff pour afficher les changements
• Commentaires // [!code highlight] dans les blocs
Comment intégrer des composants personnalisés dans le MDX ?
• Créer Alert.astro, Callout.astro, etc. dans src/components/
• import en haut du .mdx
• Utiliser comme JSX : <Alert type="info">...</Alert>
Mapping :
• export const components pour h2, a, img, etc.
• Style uniforme sans modifier chaque article
Comment afficher formules mathématiques et diagrammes ?
1. npm install remark-math rehype-katex katex
2. remarkPlugins + rehypePlugins dans astro.config.mjs
3. CSS KaTeX dans le layout
4. $...$ inline, $$...$$ en bloc
Diagrammes (Mermaid) :
1. npm install rehype-mermaid
2. rehypePlugins avec strategy img-svg
3. Blocs code mermaid dans l'article
Quels problèmes courants avec le MDX et leurs solutions ?
• Composant invisible → vérifier import
• Pas d'interactivité → ajouter client:load ou client:visible
• Pas de coloration → config Shiki
• Formules absentes → CSS KaTeX
• Build lent → mdx({ optimize: true })
optimize: true accélère le build mais peut modifier le HTML — tester avant prod.
8 min de lecture · Publié le: 2 déc. 2025 · Mis à jour le: 27 juil. 2026
Guide Astro
Si vous arrivez depuis la recherche, le plus rapide est de passer à l’article précédent ou suivant de cette série.
Précédent
Guide complet Astro Content Collections : du concept à la validation Schema
Comprenez le fonctionnement d'Astro Content Collections, configurez content.config.ts de zéro, maîtrisez la validation Zod Schema et un système de contenu typé — avec exemples complets et solutions aux erreurs courantes.
Partie 3 sur 18
Suivant
5 meilleurs thèmes de blog Astro, avec tutoriel d'installation et de configuration
Vous voulez lancer un blog rapidement mais hésitez sur le thème ? Cet article présente 5 thèmes Astro testés (AstroPaper, Astro Air Blog, etc.), un tutoriel d'installation détaillé et des solutions aux problèmes courants — blog personnel en 30 minutes.
Partie 5 sur 18



Commentaires
Connectez-vous avec GitHub pour laisser un commentaire