đ Server Components vs Client Components dans Next.js
Avec lâintroduction du App Router (app/
), Next.js 13+ repose sur une architecture hybride basée sur Server Components et Client Components. Cette approche optimise le rendu, améliore les performances et réduit la quantité de JavaScript envoyée au client.
1ïžâŁ Quâest-ce quâun Server Component ?
đ Les Server Components (par dĂ©faut) sont rendus cĂŽtĂ© serveur et envoyĂ©s sous forme de HTML au navigateur.
đ â
Avantages :
- Aucun JavaScript cĂŽtĂ© client â amĂ©liore la performance.
- AccĂšs direct aux bases de donnĂ©es et API â sans exposer de code sensible.
- OptimisĂ© pour le streaming â le rendu peut ĂȘtre progressif.
đ Exemple de Server Component (par dĂ©faut)
async function getData() {
const res = await fetch("https://jsonplaceholder.typicode.com/posts/1");
const data = await res.json();
return data;
}
export default async function Home() {
const post = await getData();
return (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
);
}
â Ce composant est exĂ©cutĂ© uniquement sur le serveur et le client ne charge aucun JavaScript pour afficher le contenu.
2ïžâŁ Quâest-ce quâun Client Component ? ('use client'
)
đ Un Client Component est un composant React classique qui sâexĂ©cute dans le navigateur.
đ ⥠NĂ©cessaire si :
- Le composant utilise un state (
useState
) ou un effet (useEffect
). - Il y a des interactions utilisateur (clicks, formulairesâŠ).
- Il utilise des events handlers (
onClick
,onChange
, etc.).
đ Exemple de Client Component
"use client"; // Obligatoire pour un Client Component
import { useState } from "react";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Compteur : {count}</p>
<button onClick={() => setCount(count + 1)}>Incrémenter</button>
</div>
);
}
â Ce composant fonctionne uniquement cĂŽtĂ© client et peut ĂȘtre utilisĂ© dans un Server Component.
3ïžâŁ Comment mĂ©langer Server et Client Components ?
đ On peut insĂ©rer un Client Component dans un Server Component, mais pas lâinverse !
đ Exemple : Un Server Component qui intĂšgre un Client Component
import Counter from "./components/Counter"; // Client Component
export default function Home() {
return (
<div>
<h1>Bienvenue</h1>
<Counter />
</div>
);
}
â
Seul Counter.tsx
est chargé cÎté client, tout le reste est statique et optimisé par Next.js.
4ïžâŁ DiffĂ©rences entre Server et Client Components
⥠CritĂšre | đ Server Components (par dĂ©faut) | đ„ Client Components (use client ) |
---|---|---|
Exécuté sur | Serveur | Navigateur |
Envoi du JS au client ? | â Non | â Oui |
Peut utiliser useState et useEffect ? | â Non | â Oui |
Peut appeler directement une base de donnĂ©es ? | â Oui | â Non |
Peut contenir des events (onClick , onChange ) ? | â Non | â Oui |
Rendu optimisĂ© | â Oui (SSR & streaming) | â Non (hydration cĂŽtĂ© client) |
5ïžâŁ Cas dâusage : Quand utiliser lâun ou lâautre ?
â Utiliser des Server Components quand :
- On veut Ă©viter dâenvoyer du JavaScript au client.
- On récupÚre des données dynamiques (API, base de données).
- On veut bénéficier du streaming pour afficher progressivement le contenu.
â Utiliser des Client Components quand :
- On a des Ă©tats (
useState
) ou des effets (useEffect
). - On a des événements utilisateur (
onClick
,onChange
). - On utilise des bibliothĂšques interactives comme Framer Motion, RechartsâŠ
đŻ Conclusion : Pourquoi cette approche hybride ?
â
Meilleure performance â Moins de JavaScript cĂŽtĂ© client.
â
Meilleure UX â Rendu rapide et progressif (streaming).
â
Plus de sĂ©curitĂ© â Les appels API et base de donnĂ©es restent cachĂ©s du client.