BaliseTonSite

Server vs Client Components

Le concept le plus important de Next.js. Comprends-le, et tout le reste s'éclaire.

4.1Par défaut : Server Component

Bonne nouvelle : dans Next.js, tous les composants sont des Server Components par défaut. Ça veut dire qu'ils s'exécutent sur le serveur, pas dans le navigateur.

Les avantages :

  • Zéro JavaScript envoyé au navigateur pour ces composants. Page plus légère.
  • Tu peux accéder directement à ta base de données, tes fichiers, tes APIs privées.
  • Le SEO est parfait : Google voit le HTML déjà rendu.
  • Les données sensibles (clés API, mots de passe) restent côté serveur.
TSXtsx
// Ceci est un Server Component (par défaut !)
// Pas de 'use client', donc il tourne sur le serveur

export default function ArticlePage() {
  // Tu pourrais même faire un appel BDD ici directement
  return (
    <article>
      <h1>Mon article</h1>
      <p>Ce HTML est généré sur le serveur et envoyé tout prêt.</p>
    </article>
  )
}

4.2Passer en Client Component

Quand tu as besoin d'interactivité (un bouton cliquable, un formulaire, un état qui change), tu dois dire à Next.js : "Ce composant, je veux qu'il vive dans le navigateur." Pour ça, tu ajoutes 'use client' en haut du fichier :

TSXtsx
'use client'

import { useState } from 'react'

export default function LikeButton() {
  const [likes, setLikes] = useState(0)

  return (
    <button onClick={() => setLikes(likes + 1)}>
      ❤️ {likes} likes
    </button>
  )
}

Dès que tu ajoutes 'use client', ce composant et tous ses enfants deviennent des Client Components. Ils s'exécutent dans le navigateur, comme un composant React classique.

4.3Quand utiliser quoi ?

J'ai besoin de...ServerClient
Afficher du contenu statique
Récupérer des données (fetch, BDD)
Accéder à des clés API secrètes
Utiliser useState, useEffect
Gérer des clics / formulaires
Utiliser le localStorage / cookies client

4.4La bonne pratique : pousser le 'use client' le plus bas possible

L'erreur de débutant, c'est de mettre 'use client' en haut de la page entière. Mais ça envoie tout le JavaScript au navigateur. On perd l'intérêt des Server Components.

La bonne stratégie : garde ta page en Server Component et isole les parties interactives dans de petits Client Components :

TSXtsx
// app/blog/[slug]/page.tsx (Server Component)

import LikeButton from '@/components/like-button'

export default async function ArticlePage({ params }) {
  const { slug } = await params
  // Ici on récupère les données côté serveur
  const article = await getArticle(slug)

  return (
    <article>
      <h1>{article.title}</h1>
      <p>{article.content}</p>

      {/* Seul ce petit composant est un Client Component */}
      <LikeButton articleId={article.id} />
    </article>
  )
}
TSXtsx
// components/like-button.tsx (Client Component)
'use client'

import { useState } from 'react'

export default function LikeButton({ articleId }: { articleId: string }) {
  const [liked, setLiked] = useState(false)

  return (
    <button onClick={() => setLiked(!liked)}>
      {liked ? '❤️ Aimé' : '🤍 Aimer'}
    </button>
  )
}

4.5Les erreurs que tu vas forcément rencontrer

Pas de panique, tout le monde passe par là. Voici les classiques :

Error: useState is not allowed in Server Components

→ Tu as oublié 'use client' en haut du fichier qui utilise useState.

Error: Event handlers cannot be passed to Client Component props

→ Tu essaies de passer un onClick depuis un Server Component. Extrais ce bout dans un Client Component à part.

Verifie tes acquis

5 questions pour valider ce chapitre

1. Par defaut, un composant dans l'App Router est :

Valide et sauvegarde ce chapitre

Ne perds pas le fil de ton apprentissage. Chaque QCM terminé sauvegarde ton score. Crée ton profil gratuitement pour débloquer toutes les évaluations du site et retrouver tes résultats plus tard.

Commencer l'aventure
Déjà membre ?Connecte-toi