Configurer les balises meta SEO dans React Router 7
Apprends à créer et gérer les balises meta title et description pour optimiser le SEO de tes pages avec React Router 7. Méthode claire et rapide.
Pourquoi rajouter des balises meta ?
Les balises title et description aident Google, et les SERP à indéxer tes pages.
Dans cette leçon tu vas :
- Créer un composant
<MetaTags>réutilisable. - Injecter automatiquement
title,descriptionet image Open-Graph. - Générer ces balises depuis tes loaders pour qu’elles soient dynamiques.
- Vérifier le rendu exact avec un outil gratuit.
Objectif : toute nouvelle page bénéficie d’un SEO basique en 30 s chrono.
1. Créer un composant MetaTags réutilisable
Plutôt que copier/coller trois balises dans chaque fichier,
on centralise dans app/components/MetaTags.tsx.
1export function MetaTags({2title,3description,4imageUrl = "https://algomax.fr/images/me-converted.webp",5}: {6title: string7description: string8imageUrl?: string9}) {10return (11<>12<title>{title}</title>1314{/* SEO classique */}15<meta name="description" content={description} />1617{/* Open Graph : réseaux sociaux (LinkedIn, Twitter, Slack…) */}18<meta property="og:title" content={title} />19<meta property="og:description" content={description} />20<meta property="og:image" content={imageUrl} />21</>22)23}
Pourquoi un composant plutôt qu’un export meta()
Depuis React 19, Remix/React Router recommande d’écrire les balises inline (plus simple, aucune API à maintenir). Nous suivons cette voie pour rester à jour.
Note
L’ancienne signature export const meta: MetaFunction = () => […] fonctionne toujours. Dans une prochaîne leçon, nous l'utiliserons de nouveau.
2. Brancher MetaTags sur une page statique
Prenons la page d’accueil.
1import { MetaTags } from "~/components/MetaTags";23export default function Home() {4return (5<>6<MetaTags7title="Le site personnel de Virgile"8description="Je raconte ma vie de dev React JS, Remix et Tailwind."9/>1011{/* contenu visuel de la page */}12<main className="px-8 py-4">13<h1 className="text-3xl font-bold">Bienvenue !</h1>14</main>15</>16);17}
Ouvre DevTools → onglet Elements → <head> : tu dois voir
un <title> + <meta name="description"> fraîchement générés.
Important
h1 venuet produira souvent une description… aléatoire !
3. Rendre les metas dynamiques pour un article
Les pages statiques c’est facile à implémenter. Comment. avec un blog et des pages dynamiques ? Créons un loader qui récupère l’article et passe ses données au composant.
1import { MetaTags } from "~/components/MetaTags";2import { fetchArticle } from "~/server/articles.server";34export async function loader({ params }: Route.LoaderArgs) {5const article = await fetchArticle({ slug: params.slug });6if (!article)7throw new Response("Article introuvable", { status: 404 });8return article;9}1011export default function ArticlePage() {12const article = useLoaderData<typeof loader>();1314return (15<>16<MetaTags17title={article.title}18description={article.description}19imageUrl={article.image}20/>2122{/* reste de la mise en page */}23<h1>{article.title}</h1>24</>25);26}
Désormais :
title+descriptionchangent pour chaque slug.
4. Rendre le listing cliquable sans casser la sémantique
Dans le transcript tu as vu un mini hack :
un <Link> en position: absolute qui couvre la carte entière.
1import { Link, href } from "react-router";23export function ArticleCard({ article }: { article: Article }) {4return (5<article className="relative rounded-xl shadow-lg overflow-hidden">6<img src={article.image} alt={article.title} />7<h2 className="p-4 text-xl font-bold">{article.title}</h2>89{/* lien invisible sur toute la card */}10<Link11to={href("/blog/:slug", { slug: article.slug })}12className="absolute inset-0 z-10"13/>14</article>15);16}
- Accessibilité OK (le
h2reste dans le flux). - SEO OK : le lien entoure réellement le titre de l’article.
5. Vérifier le rendu avec un outil gratuit
Installe l’extension Meta SEO Inspector (Chrome/Firefox).
- Rafraîchis la page
/blog/react-router-7-et-seo. - Clique sur l’icône → tu dois voir
title,description,og:image. - Zéro “missing tag” = mission accomplie.
Autre option : metatags.io te montre le rendu Google, Facebook, LinkedIn et Slack en collant simplement l’URL (ton site doit être mis en ligne).
6. Que faire des pages « Login » ou « Reset password » ?
Ces pages n’ont aucun intérêt à être référencées.
1import { MetaTags } from "~/components/MetaTags";23export default function Login() {4return (5<>6<MetaTags7title="Connexion – Algomax"8description="Accède à ton dashboard…"9/>10{/* formulaire */}11</>12);13}
On peut demander gentiment aux moteurs de ne pas indexer via :
1<meta name="robots" content="noindex" />
Warning
Indexer les pages d’authentification gaspille le budget de crawl
et peut exposer des URL indésirables dans la SERP.
7. Checklist rapide avant de pousser en production
| ✔︎ | Question |
|---|---|
Chaque nouvelle route appelle <MetaTags> ? | |
| Le titre contient < 60 caractères ? | |
| La description < 160 caractères ? | |
Un og:image pertinent est fourni ? | |
Les pages sensibles possèdent noindex ? |
Passe le script :
1npm run dev
…puis visite les pages clés, extension ouverte. ✅ = feu vert pour déployer.
8. Prochaine étape
Dans la leçon suivante nous verrons robots.txt et sitemap.xml (générés comme resource routes). Google saura quelles pages crawler… et lesquelles ignorer 😉.
Important
Push tes changements (branche dev ou main).
Observe la CI, puis partage l’URL sur Slack :
si tu vois l’image et le titre corrects, tu viens de poser la première pierre
de ton SEO.
Comprendre les concepts fondamentaux
Quelle est la principale différence entre les composants client et serveur dans React ?
Optimisation des performances
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Architecture des données
Quel hook permet de gérer les effets de bord dans un composant React ?