Skip to Content
🎉 Utilisez JS efficacement →
Next.jsServer actions ⚙Server actions

🚀 Server Actions dans Next.js 13+ : Le Remplacement des API Routes

Avec l’introduction de Server Actions dans Next.js 13+, on assiste Ă  un changement majeur dans la gestion des actions cĂŽtĂ© serveur, remplaçant progressivement les API Routes.


1ïžâƒŁ Qu’est-ce qu’une Server Action ?

Les Server Actions permettent d’exĂ©cuter des fonctions cĂŽtĂ© serveur directement depuis les composants React sans avoir besoin de crĂ©er une route API distincte.

✅ Avantages :

  • Plus besoin de dĂ©finir des API Routes (pages/api/* ou app/api/*).
  • RĂ©duction des allers-retours client-serveur.
  • SĂ©curitĂ© renforcĂ©e : les actions ne sont pas exposĂ©es cĂŽtĂ© client.
  • SimplicitĂ© et meilleure lisibilitĂ© du code.

đŸ”č Comparaison :

API Routes (app/api/*)Server Actions (use server)
Nécessite une route séparée (app/api/...)Directement définie dans les composants
Requiert un appel fetch cĂŽtĂ© clientPeut ĂȘtre appelĂ©e comme une fonction normale
Doit gĂ©rer la validation et l’état cĂŽtĂ© clientGĂšre tout sur le serveur automatiquement

Voici une version amĂ©liorĂ©e du chapitre, mettant en parallĂšle une API Route classique et une Server Action, afin d’illustrer clairement leurs diffĂ©rences.


2ïžâƒŁ MĂ©thode avec une API Route (app/api/)

DĂ©finition de l’API Route

Avec Next.js, une API Route est définie dans app/api/addComment/route.ts ou pages/api/addComment.ts.

app/api/addComment/route.ts
import { NextResponse } from "next/server"; import { db } from "@/lib/db"; // Connexion à la base de données export async function POST(req: Request) { const { comment } = await req.json(); if (!comment) { return NextResponse.json({ error: "Le commentaire est vide." }, { status: 400 }); } await db.comments.create({ data: { content: comment } }); return NextResponse.json({ success: true }); }

Utilisation cÎté client (fetch())

Le client doit envoyer une requĂȘte HTTP vers l’API.

app/comments/page.tsx
"use client"; import { useState } from "react"; export default function CommentsPage() { const [comment, setComment] = useState(""); const [status, setStatus] = useState(""); async function submitComment(e: React.FormEvent) { e.preventDefault(); setStatus("Envoi en cours..."); const response = await fetch("/api/addComment", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ comment }), }); if (response.ok) { setStatus("Commentaire ajouté !"); setComment(""); } else { setStatus("Erreur lors de l'envoi."); } } return ( <div> <h1>Ajouter un commentaire</h1> <form onSubmit={submitComment}> <textarea name="comment" value={comment} onChange={(e) => setComment(e.target.value)} /> <button type="submit">Envoyer</button> </form> <p>{status}</p> </div> ); }

✅ Points à retenir :

  • NĂ©cessite un appel fetch() cĂŽtĂ© client.
  • Une requĂȘte HTTP est envoyĂ©e au serveur.
  • L’API Route reste accessible publiquement si elle n’est pas protĂ©gĂ©e.

3ïžâƒŁ ExĂ©cution sans fetch (Appels directs)

Dans un formulaire sans Ă©tat client, on peut directement passer la Server Action dans action={maFonction}.

đŸ”č Exemple : Formulaire d’inscription

app/signup/page.tsx
import { registerUser } from "@/app/actions/register"; export default function SignupPage() { return ( <form action={registerUser}> <input type="text" name="name" placeholder="Nom" required /> <input type="email" name="email" placeholder="Email" required /> <button type="submit">S'inscrire</button> </form> ); }
app/actions/register.ts
"use server"; import { db } from "@/lib/db"; export async function registerUser(formData: FormData) { const name = formData.get("name") as string; const email = formData.get("email") as string; await db.user.create({ data: { name, email }, }); return { success: true }; }

✅ Avantages :

  • Plus besoin de fetch().
  • ExĂ©cution optimisĂ©e cĂŽtĂ© serveur.
  • SimplicitĂ© de gestion pour les formulaires.

4ïžâƒŁ Server Actions avec Authentification et SĂ©curitĂ©

Les Server Actions permettent aussi d’interagir avec l’authentification.

đŸ”č Exemple : Authentification avec NextAuth

app/actions/login.ts
"use server"; import { auth } from "@/lib/auth"; // NextAuth export async function loginUser(formData: FormData) { const email = formData.get("email"); const password = formData.get("password"); const user = await auth.verify(email, password); if (!user) return { error: "Identifiants incorrects" }; return { success: true, user }; }

✅ SĂ©curitĂ© renforcĂ©e :

  • L’authentification reste cĂŽtĂ© serveur.
  • Pas d’exposition des donnĂ©es sensibles.

5ïžâƒŁ Comparaison avec les API Routes

FonctionnalitéServer Actions (use server)API Routes (app/api/*)
📡 Mode d’appelDirectement dans le composantVia un fetch()
🔒 SĂ©curitĂ©Code non exposĂ© au clientBesoin d’une protection manuelle
⚡ PerformanceMoins de requĂȘtes rĂ©seauNĂ©cessite un appel HTTP
đŸ—ïž SimplicitéÉcriture plus compacteNĂ©cessite plus de code
🔄 RequĂȘtes complexes (Webhooks, APIs tierces)❌ Pas recommandĂ©âœ… AdaptĂ©

6ïžâƒŁ Quand utiliser Server Actions vs API Routes ?

✅ Utiliser les Server Actions quand :

  • Vous avez une interaction directe avec le serveur.
  • Vous traitez des formulaires simples (inscription, commentaire, contact
).
  • Vous voulez optimiser les requĂȘtes et Ă©viter un aller-retour client-serveur.

❌ Utiliser les API Routes quand :

  • Vous avez besoin d’une API publique pour d’autres services.
  • Vous traitez des webhooks ou des requĂȘtes externes.
  • Vous devez gĂ©rer des authentifications OAuth ou JWT complexes.

🎯 Conclusion : Pourquoi adopter les Server Actions ?

🚀 Les Server Actions simplifient l’interaction client-serveur en Ă©vitant des API Routes superflues.

✅ Avantages principaux :

  • Meilleure performance : moins de requĂȘtes HTTP.
  • Code plus clair et plus sĂ©curisĂ©.
  • IntĂ©gration facile avec les formulaires et l’authentification.
mis Ă  jour le