Skip to Content
🎉 Utilisez JS efficacement →
Next.jsServer actions ⚙React server components

🚀 Utilisation des Server Actions avec les React Server Components (RSC)

Les React Server Components (RSC) sont un Ă©lĂ©ment clĂ© de l’architecture de Next.js 13+ avec le dossier app/.
Ils permettent d’exĂ©cuter du code cĂŽtĂ© serveur par dĂ©faut, rĂ©duisant le JavaScript envoyĂ© au client et amĂ©liorant les performances.

👉

Les Server Actions sont parfaitement intégrées aux RSC, offrant une interaction fluide entre le serveur et le client.


1ïžâƒŁ Rappel : Server Components vs Client Components

React Server Components (RSC)

  • ⚡ ExĂ©cutĂ©s uniquement cĂŽtĂ© serveur.
  • ❌ Pas d’accĂšs Ă  useState, useEffect, ni aux Ă©vĂ©nements comme onClick.
  • ✅ IdĂ©al pour rĂ©cupĂ©rer et afficher des donnĂ©es sans surcharge cĂŽtĂ© client.

Client Components ("use client")

  • ✅ UtilisĂ©s pour l’interactivitĂ© (formulaires, boutons, animations).
  • ⚡ Peuvent appeler des Server Actions pour exĂ©cuter du code cĂŽtĂ© serveur.

2ïžâƒŁ Utilisation des Server Actions dans un Server Component

Nous allons crĂ©er une page Server Component qui affiche des donnĂ©es venant d’une base et permet d’ajouter un Ă©lĂ©ment via une Server Action.

app/actions/todos.ts
"use server"; import { db } from "@/lib/db"; export async function getTodos() { return await db.todo.findMany(); } export async function addTodo(formData: FormData) { const title = formData.get("title") as string; if (!title) return { error: "Le titre est requis" }; await db.todo.create({ data: { title } }); return { success: "Tùche ajoutée !" }; }

📌 Étape 1 : Afficher les tñches avec un Server Component

app/todos/page.tsx
import { getTodos } from "@/app/actions/todos"; export default async function TodosPage() { const todos = await getTodos(); // Appel direct cÎté serveur return ( <div className="max-w-md mx-auto p-4 border rounded-lg shadow-lg"> <h1 className="text-xl font-bold mb-4">Liste des tùches</h1> <ul> {todos.map((todo) => ( <li key={todo.id} className="border-b py-2">{todo.title}</li> ))} </ul> <AddTodoForm /> </div> ); }

✅ Explication :

  • getTodos() est appelĂ© directement dans le Server Component.
  • Il rĂ©cupĂšre les tĂąches en base de donnĂ©es sans utiliser useEffect ni fetch().
  • Aucune donnĂ©e inutile n’est envoyĂ©e au client, ce qui optimise les performances.

📌 Étape 2 : Ajouter un formulaire avec une Server Action

🚹

Un Server Component ne peut pas gérer onSubmit.
Nous devons utiliser un Client Component pour gérer le formulaire.

app/todos/AddTodoForm.tsx
"use client"; import { useState } from "react"; import { addTodo } from "@/app/actions/todos"; export default function AddTodoForm() { const [status, setStatus] = useState<string | null>(null); async function handleSubmit(formData: FormData) { const result = await addTodo(formData); if (result?.error) setStatus(result.error); else setStatus(result.success); } return ( <form action={handleSubmit} className="mt-4 space-y-3"> <input type="text" name="title" placeholder="Nouvelle tĂąche" className="w-full p-2 border rounded" required /> <button type="submit" className="w-full bg-green-500 text-white py-2 rounded"> Ajouter </button> {status && <p className="mt-2 text-center">{status}</p>} </form> ); }

✅ Explication :

  • "use client" rend le composant interactif.
  • handleSubmit appelle directement la Server Action addTodo.
  • Pas besoin de fetch() ni d’API externe.

3ïžâƒŁ RafraĂźchir automatiquement la liste aprĂšs ajout

Actuellement, l’ajout fonctionne mais la liste ne se met pas à jour automatiquement.
Nous pouvons utiliser Server Actions avec revalidatePath() pour forcer la mise à jour des données.

app/actions/todos.ts
"use server"; import { db } from "@/lib/db"; import { revalidatePath } from "next/cache"; export async function getTodos() { return await db.todo.findMany(); } export async function addTodo(formData: FormData) { const title = formData.get("title") as string; if (!title) return { error: "Le titre est requis" }; await db.todo.create({ data: { title } }); revalidatePath("/todos"); // đŸ”„ Force la mise Ă  jour return { success: "TĂąche ajoutĂ©e !" }; }

✅ Effet :
DĂšs qu’une tĂąche est ajoutĂ©e, Next.js rafraĂźchit automatiquement la page /todos et affiche la nouvelle liste.


4ïžâƒŁ Comparaison avec une API Route

đŸ”č MĂ©thodeServer Actions (use server)API Route (app/api/todos/route.ts)
đŸ—ïž ComplexitĂ©Plus simple, pas de fetch()NĂ©cessite fetch() et API Route
⚡ PerformanceMoins d’allers-retours rĂ©seauRequiert un appel HTTP
🔒 SĂ©curitĂ©Code non exposĂ© cĂŽtĂ© clientAccessible via fetch()
🔄 RafraĂźchissementAutomatique avec revalidatePathDoit ĂȘtre gĂ©rĂ© cĂŽtĂ© client
🏆 Cas d’usageIdĂ©al pour formulaires et interactions simplesUtile pour APIs publiques et webhooks

🎯 Conclusion : Pourquoi utiliser Server Actions avec RSC ?

🚀 Les Server Actions et React Server Components simplifient le dĂ©veloppement full-stack avec Next.js 13+.

✅ Avantages :

  • Code plus simple et optimisĂ©.
  • Moins de JavaScript cĂŽtĂ© client, meilleur SEO et performances.
  • Pas besoin d’API Routes ou de fetch() pour charger les donnĂ©es.
  • Mise Ă  jour automatique avec revalidatePath().
mis Ă  jour le