đ Exercice : Optimisation SEO avec Next.js
đŻ Objectif
Mettre en place les bonnes pratiques SEO dans une application Next.js en travaillant sur les mĂ©tadonnĂ©es, les Open Graph & Twitter Cards, et la gĂ©nĂ©ration dâun sitemap et dâun robots.txt.
đ Code source : đ GitHubâ đ
đ Ătape 1 : DĂ©finir les mĂ©tadonnĂ©es SEO
1ïžâŁ Ajouter des mĂ©tadonnĂ©es globales dans layout.tsx
- Ouvrez le fichier
app/layout.tsx
- Ajoutez un objet
metadata
avec les informations suivantes :title
: Nom du sitedescription
: Une courte description du sitekeywords
: Liste de mots-clés
đ Exemple :
app/layout.tsx
export const metadata = {
title: "Mon Super Site",
description: "Découvrez des articles passionnants sur le développement web.",
keywords: ["next.js", "seo", "développement web"],
};
- Lancez le projet et inspectez la page avec les DevTools (
F12
>Elements
>head
) pour vérifier que les balises<title>
et<meta>
sont bien générées.
2ïžâŁ Ajouter des mĂ©tadonnĂ©es dynamiques avec generateMetadata()
- Dans
app/blog/[id]/page.tsx
, créez une fonctiongenerateMetadata()
pour générer un titre et une description unique pour chaque article de blog.
đ Exemple :
app/blog/[id]/page.tsx
import { notFound } from "next/navigation";
export async function getPostBySlug(id: string) {
const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
if (!response.ok) {
notFound()
}
const post = await response.json();
return {
title: post.title,
excerpt: post.body.substring(0, 150) + "...", // Prend les 150 premiers caractĂšres du contenu
content: post.body,
image: `https://via.placeholder.com/600x400?text=${encodeURIComponent(post.title)}`, // Image générée
};
}
export async function generateMetadata({ params }: { params: { id: string } }) {
const post = await getPostBySlug((await params).id); // Fonction fictive récupérant un article
return {
title: post.title,
description: post.excerpt,
};
}
export default async function PostPage({ params }: { params: { id: string } }) {
const post = await getPostBySlug((await params).id); // Fonction fictive récupérant un article
return <div>
<h1>{post.title}</h1>
</div>
}
- Ouvrez un article dans le navigateur et vérifiez que le titre change bien en fonction du contenu du blog.
đŒ Ătape 2 : Ajouter Open Graph et Twitter Cards
- Modifiez
generateMetadata()
pour inclure des balises Open Graph et Twitter Cards avec une image de partage.
đ Exemple :
app/blog/[id]/page.tsx
export async function generateMetadata({ params }) {
const post = await getPostBySlug(params.id);
return {
title: post.title,
description: post.excerpt,
openGraph: {
title: post.title,
description: post.excerpt,
images: [{ url: `https://via.placeholder.com/600x400?text=${encodeURIComponent(post.title)}` }],
type: "article",
},
twitter: {
card: "summary_large_image",
title: post.title,
description: post.excerpt,
images: [`https://via.placeholder.com/600x400?text=${encodeURIComponent(post.title)}`],
},
};
}
- Testez les balises gĂ©nĂ©rĂ©es avec lâoutil Meta Tagsâ ou lâoutil Sharing Debuggerâ.
đș Ătape 3 : GĂ©nĂ©rer un sitemap et un robots.txt
1ïžâŁ GĂ©nĂ©rer un sitemap.xml
dynamique
- Dans
app/sitemap.ts
, créez un sitemap listant dynamiquement toutes les pages du blog.
đ Exemple :
app/sitemap.ts
export async function getAllPosts() {
const response = await fetch("https://jsonplaceholder.typicode.com/posts");
if (!response.ok) {
throw new Error("Impossible de récupérer les articles");
}
const posts = await response.json();
return posts.map((post) => ({
slug: post.id.toString(), // JSONPlaceholder utilise des IDs numériques
updatedAt: new Date().toISOString(), // Simule une date de mise Ă jour
}));
}
export default async function sitemap() {
const posts = await getAllPosts();
return posts.map((post) => ({
url: `https://example.com/blog/${post.slug}`,
lastModified: post.updatedAt,
}));
}
- VĂ©rifiez que votre sitemap fonctionne en visitant
http://localhost:3000/sitemap.xml
.
2ïžâŁ Ajouter un robots.txt
- Dans le dossier
public/
, ajoutez un fichierrobots.txt
avec les directives suivantes :
đ Exemple :
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
- VĂ©rifiez le fichier en accĂ©dant Ă
http://localhost:3000/robots.txt
.
â Validation finale
- Vérifier les métadonnées SEO avec Lighthouse (Chrome DevTools > Audits > SEO).
- Tester Open Graph et Twitter Cards avec Meta Tagsâ.
- Sâassurer que
sitemap.xml
etrobots.txt
sont bien accessibles dans le navigateur.
đ FĂ©licitations ! Votre site Next.js est maintenant optimisĂ© pour le SEO.
mis Ă jour le