đ 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 commeonClick
. - â 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.
"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
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
nifetch()
. - 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.
"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 ActionaddTodo
.- 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.
"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Ă©thode | Server Actions (use server ) | API Route (app/api/todos/route.ts ) |
---|---|---|
đïž ComplexitĂ© | Plus simple, pas de fetch() | NĂ©cessite fetch() et API Route |
⥠Performance | Moins dâallers-retours rĂ©seau | Requiert un appel HTTP |
đ SĂ©curitĂ© | Code non exposĂ© cĂŽtĂ© client | Accessible via fetch() |
đ RafraĂźchissement | Automatique avec revalidatePath | Doit ĂȘtre gĂ©rĂ© cĂŽtĂ© client |
đ Cas dâusage | IdĂ©al pour formulaires et interactions simples | Utile 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()
.