Un peu de contexte : pourquoi on en parle autant en ce moment

Depuis quelques années, le monde du développement web fait sa révolution tranquille. Après avoir tout balancé côté client avec le fameux Single Page Application (SPA), la tendance s'inverse : on revient au serveur, mais en gardant le meilleur de React. Bienvenue dans l'ère des React Server Components (RSC), popularisés par Next.js avec son App Router depuis la version 13.

Concrètement, c'est quoi le problème qu'on essaie de résoudre ? Pendant des années, on a envoyé des mégas bundles JavaScript au navigateur pour que React puisse tout construire côté client. Résultat : des utilisateurs avec une connexion moyenne (ou un vieux téléphone) qui regardent une page blanche pendant deux secondes avant que quoi que ce soit ne s'affiche. Pas terrible pour l'expérience utilisateur, ni pour le SEO d'ailleurs.

Server Components vs Client Components : le duo gagnant

L'idée derrière les RSC, c'est de faire un tri intelligent entre ce qui doit tourner côté client (interactivité, état, hooks comme useState) et ce qui peut très bien être calculé une bonne fois pour toutes sur le serveur.

Dans Next.js App Router, tout composant est un Server Component par défaut. Il ne descend jamais de JavaScript au navigateur, il est simplement rendu en HTML côté serveur. Si vous avez besoin d'interactivité, vous ajoutez la directive magique en haut du fichier :

'use client';

import { useState } from 'react';

export default function Compteur() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Clics : {count}
    </button>
  );
}

Sans cette directive, ce composant n'aurait même pas pu utiliser useState. C'est le signal qu'on envoie à React et à Next.js : "celui-là, il faut le charger et l'hydrater côté navigateur".

Pourquoi c'est aussi puissant : l'accès direct aux données

Le vrai kiff des Server Components, c'est qu'ils peuvent être asynchrones et accéder directement à votre base de données ou à une API, sans passer par une route API intermédiaire. Fini le useEffect + fetch + gestion de loading state juste pour afficher une liste d'articles.

// app/articles/page.jsx (Server Component par défaut)
async function getArticles() {
  const res = await fetch('https://api.youonline.fr/articles', {
    next: { revalidate: 3600 } // cache 1h, ISR-like
  });
  return res.json();
}

export default async function ArticlesPage() {
  const articles = await getArticles();

  return (
    <ul>
      {articles.map((article) => (
        <li key={article.id}>{article.titre}</li>
      ))}
    </ul>
  );
}

Vous voyez le truc ? Pas de useState, pas de useEffect, pas de skeleton loader qui clignote. Le HTML arrive déjà rempli. C'est propre, c'est rapide, et c'est bien meilleur pour le référencement naturel puisque Google voit directement du contenu structuré.

Le mélange des deux mondes : composition intelligente

La vraie force de cette architecture, c'est qu'on peut imbriquer des Client Components dans des Server Components. Vous gardez donc un maximum de rendu côté serveur (rapide, léger) et vous n'isolez l'interactivité que là où c'est vraiment nécessaire : un bouton "j'aime", un formulaire, un menu déroulant.

// Server Component
import BoutonLike from './BoutonLike'; // client component

export default async function Article({ id }) {
  const data = await getArticle(id);

  return (
    <article>
      <h1>{data.titre}</h1>
      <p>{data.contenu}</p>
      <BoutonLike articleId={id} />
    </article>
  );
}

Résultat : seul le code JS du BoutonLike est envoyé au navigateur. Le reste, c'est du HTML tout prêt. Votre bundle JavaScript fond littéralement, et vos utilisateurs vous disent merci (même s'ils ne savent pas pourquoi la page charge plus vite).

Attention aux pièges classiques

Comme toute nouvelle techno, il y a quelques règles à respecter pour ne pas se prendre les pieds dans le tapis :

  • Pas de hooks React dans un Server Component. Ni useState, ni useEffect, ni useContext. Ces composants ne s'exécutent qu'une fois côté serveur, ils n'ont pas de cycle de vie côté client.
  • Les props passées d'un Server Component à un Client Component doivent être sérialisables. Pas de fonctions, pas de classes complexes, pas de dates non converties. Uniquement du JSON-compatible.
  • Ne mettez pas 'use client' partout par réflexe. C'est la tentation numéro un des développeurs qui débutent avec l'App Router. Résultat : on se retrouve avec une app quasi 100% client, exactement le problème qu'on essayait d'éviter.
  • Attention au cache. Next.js met en cache agressivement les fetch par défaut. Pensez à bien configurer revalidate ou cache: 'no-store' selon vos besoins, sinon vous risquez d'afficher des données périmées.

Et pour le SEO, ça donne quoi concrètement ?

Chez YouOnline, on le voit tous les jours avec nos clients : le rendu côté serveur, ce n'est pas juste une question de perf technique, c'est un vrai levier business. Un site qui affiche du contenu HTML complet dès la première réponse serveur, c'est un site que Google indexe plus facilement, plus rapidement, et avec moins d'ambiguïté sur le contenu réel de la page. Les Server Components poussent cette logique encore plus loin qu'un simple SSR classique, en réduisant drastiquement le JavaScript inutile qui alourdit le Time To Interactive.

Faut-il migrer tous ses projets vers ça maintenant ?

Pas de panique, on ne vous dit pas de tout réécrire demain matin. Si vous démarrez un nouveau projet Next.js, l'App Router avec Server Components est clairement la voie recommandée aujourd'hui. Si vous avez un projet existant en Pages Router ou en Create React App, la migration mérite réflexion : elle apporte de vrais gains de perf, mais elle demande de repenser l'architecture de vos composants et la façon dont vous gérez vos données.

Ce qui est sûr, c'est que cette approche "serveur par défaut, client par exception" est en train de devenir un standard. Remix s'en inspire aussi à sa manière, et on peut parier que d'autres frameworks vont suivre le mouvement dans les prochaines années.

En résumé

Les Server Components ne sont pas juste une nouvelle mode de développeur qui aime les nouveautés brillantes. C'est une réponse concrète à un vrai problème : trop de JavaScript envoyé pour rien, trop de complexité pour afficher du contenu somme toute assez simple. En triant intelligemment ce qui doit vraiment vivre côté client, on gagne en performance, en simplicité de code, et en visibilité SEO. Bref, tout le monde y gagne : vos utilisateurs, votre référencement, et vous-même qui écrivez moins de code de gestion d'état pour rien.

Partager