Pages, layouts et routes dynamiques
Comprendre comment l'arborescence de fichiers et de dossiers détermine les URLs de votre application.
Dans Next.js (App Router), les dossiers définissent les segments d'URL et les fichiers spéciaux leur donnent un rôle précis : page.tsx expose une route publique, layout.tsx partage une interface entre plusieurs pages, loading.tsx affiche un état de chargement pendant le rendu serveur, et error.tsx capture les erreurs d'un segment. Cette convention remplace un système de configuration centralisé par une structure de fichiers lisible et intuitive.
Une route dynamique, créée en nommant un dossier [slug], permet de réutiliser une seule page pour plusieurs contenus différents : /cours/python, /cours/react et /cours/nextjs partagent le même composant. IMPORTANT : dans Next.js 16, le paramètre params est une Promise et doit être attendu avec await. On écrit donc : const { slug } = await params. Cela permet au framework d'optimiser le rendu en résolvant les paramètres de manière asynchrone.
Les nested layouts (layouts imbriqués) sont l'un des concepts les plus puissants de l'App Router. Chaque segment de route peut définir son propre layout, et ces layouts s'emboîtent automatiquement. Par exemple, un layout à la racine gère la navigation principale, tandis qu'un layout dans /dashboard ajoute une barre latérale sans dupliquer le header. Cette architecture encourage la réutilisation et maintient chaque fichier focalisé sur une seule responsabilité.
// app/cours/[slug]/page.tsx
import { getCourse } from "@/lib/data";
export default async function CoursePage({
params,
}: {
params: Promise<{ slug: string }>;
}) {
// Dans Next.js 16, params est une Promise
const { slug } = await params;
const course = await getCourse(slug);
return (
<article>
<h1>{course.title}</h1>
<p>{course.description}</p>
</article>
);
}Exercice pratique
Exercice pratique
Concevez la structure de fichiers d'un blog Next.js avec une page d'accueil, une page listant les articles, et une page dynamique pour chaque article.
- Dessinez l'arborescence du dossier app/ avec les fichiers page.tsx nécessaires.
- Ajoutez un layout.tsx racine contenant un header avec navigation.
- Créez le dossier [slug] pour les articles dynamiques avec son page.tsx.
- Ajoutez un fichier loading.tsx dans le segment des articles pour gérer le chargement.
✓Vous avez réussi si votre arborescence couvre les trois routes et si vous avez pensé à utiliser await sur params dans la page dynamique.