🚀 Routing basé sur le système de fichiers dans Next.js (app/
vs pages/
)
Next.js propose deux systèmes de routing basés sur l’arborescence des fichiers :
- Le Pages Router (
pages/
) (jusqu’à Next.js 12 et optionnel dans Next.js 13+). - Le App Router (
app/
) (introduit dans Next.js 13 et par défaut à partir de Next.js 14).
Voyons les différences et avantages de ces deux approches.
1️⃣ Routing dans pages/
(Pages Router - Ancienne méthode)
📌 Dans pages/
, chaque fichier .js
ou .tsx
dans pages/
définit une route unique.
📌 Le fichier pages/_app.js
sert de layout global pour toutes les pages.
** Exemple d’architecture pages/
:**
pages/
├── index.tsx → Route "/"
├── about.tsx → Route "/about"
├── contact.tsx → Route "/contact"
├── blog/
│ ├── index.tsx → Route "/blog"
│ ├── [id].tsx → Route "/blog/:id" (dynamic routing)
├── api/
│ ├── hello.ts → API route "/api/hello"
├── _app.tsx → Layout global
├── _document.tsx → Personnalisation du document HTML
✅ Avantages de pages/
:
✔ Facile à comprendre et rapide à mettre en place.
✔ Compatible avec Next.js 12 et inférieur.
✔ Fonctionne bien avec les API Routes (pages/api/
).
❌ Inconvénients de pages/
:
❌ Layouts difficiles à gérer → il faut dupliquer le code ou utiliser _app.js
.
❌ Moins optimisé → toutes les pages sont des Client Components par défaut.
❌ Gestion du rendu moins performante → nécessite des API Routes pour récupérer des données serveur.
2️⃣ Routing dans app/
(App Router - Nouvelle méthode)
📌 Chaque dossier dans app/
devient une route (au lieu d’un fichier .tsx
).
📌 Chaque page est définie par un fichier page.tsx
.
📌 Les layouts (layout.tsx
) permettent de structurer l’interface sans recharger les composants communs.
** Exemple d’architecture app/
:**
app/
├── layout.tsx → Layout global
├── page.tsx → Route "/"
├── about/
│ ├── page.tsx → Route "/about"
│ ├── layout.tsx → Layout spécifique à "/about"
├── blog/
│ ├── page.tsx → Route "/blog"
│ ├── [id]/ → Route dynamique "/blog/:id"
│ │ ├── page.tsx → Contenu d’un article
├── api/ → (Déprécié, remplacé par Server Actions)
├── loading.tsx → Animation de chargement globale
├── error.tsx → Gestion des erreurs globale
✅ Avantages de app/
:
✔ Layouts imbriqués (layout.tsx
) → évite de recharger des parties inutiles de l’UI.
✔ Server Components par défaut → réduit le JavaScript envoyé au client.
✔ Gestion native des métadonnées (generateMetadata()
) → plus besoin de <Head>
.
✔ Server Actions → permet de gérer des actions côté serveur sans API Routes.
❌ Inconvénients de app/
:
❌ Changement de paradigme → nécessite d’apprendre de nouvelles conventions.
❌ Moins de compatibilité avec certains anciens outils (ex: API Routes).
3️⃣ Comparaison entre pages/
et app/
Fonctionnalité | Pages Router (pages/ ) | App Router (app/ ) |
---|---|---|
Définition des routes | Basé sur les fichiers | Basé sur les dossiers |
Layouts | _app.tsx pour tout | layout.tsx par dossier |
Rendu par défaut | Client Components | Server Components |
Gestion des métadonnées | <Head> dans chaque page | generateMetadata() natif |
API Routes | pages/api/ | Remplacé par Server Actions |
Streaming et Suspense | Complexe à gérer | Intégré nativement |
Performance | Moins optimisé | Moins de JS côté client |
4️⃣ Exemple pratique : Route dynamique avec pages/
vs app/
📌 Dans pages/
(Ancienne méthode)
import { useRouter } from "next/router";
export default function BlogPost() {
const router = useRouter();
const { id } = router.query;
return <h1>Article {id}</h1>;
}
💡 Utilisation de useRouter()
pour récupérer l’ID de l’URL.
📌 Dans app/
(Nouvelle méthode)
export default function BlogPost({ params }: { params: { id: string } }) {
return <h1>Article {params.id}</h1>;
}
💡 Les paramètres (params.id
) sont passés directement dans la fonction, sans useRouter()
!
🎯 Conclusion : Quelle approche choisir ?
Si vous travaillez sur… | Recommandation |
---|---|
Un projet Next.js 12 ou antérieur | Utilisez pages/ |
Un projet existant en pages/ | Continuez en pages/ sauf si besoin d’optimisation |
Un nouveau projet en Next.js 13+ | Utilisez app/ pour profiter des nouvelles fonctionnalités |
💡 Le App Router (app/
) est la meilleure option pour un projet moderne, grâce à ses performances améliorées, Server Components et layouts flexibles. 🚀