Tous les articles
Mer. 6 mai 2026 · 4 min de lecture

🟢 AdonisJS : le Laravel du monde Node, sans le folklore JavaScript

AdonisJS

📚 Introduction

Côté Node.js, le choix d’un framework est historiquement plus douloureux que côté PHP. Express reste minimaliste, NestJS impose Angular dans la tête, Fastify est rapide mais nu, et la majorité des projets finissent par assembler dix ou quinze librairies pour reconstituer ce qu’un framework full-stack offre par défaut.

AdonisJS prend le contre-pied. Inspiré directement de Laravel, c’est un framework Node.js TypeScript first, qui livre dans la même boîte l’ORM, la validation, l’authentification, les queues, le CLI, les tests, les migrations, le mailer. Si vous avez aimé Laravel en PHP, vous allez très vite vous sentir chez vous.

🧩 La philosophie : convention over configuration

AdonisJS reprend ce qui fait la force de Laravel : un cadre opinionné qui prend des décisions à votre place sur 80 % des sujets, et qui ne vous laisse libre que sur les 20 % qui comptent vraiment pour votre métier.

// start/routes.ts
import router from '@adonisjs/core/services/router';
import { middleware } from '#start/kernel';
 
router.resource('invoices', '#controllers/invoices_controller').middleware(middleware.auth());

Les conventions sont familières si vous venez de Laravel : structure app/, controllers/, models/, services/, fichier routes.ts central, providers, container d’IoC, événements. La courbe d’apprentissage est plus courte qu’on ne le pense.

🗃️ Lucid, l’ORM façon Eloquent

L’ORM officiel s’appelle Lucid. Il s’inspire d’Eloquent et de son ActiveRecord, en y ajoutant le typage statique de TypeScript.

import { BaseModel, column, hasMany } from '@adonisjs/lucid/orm';
import type { HasMany } from '@adonisjs/lucid/types/relations';
 
export default class User extends BaseModel {
	@column({ isPrimary: true })
	declare id: number;
 
	@column()
	declare email: string;
 
	@hasMany(() => Invoice)
	declare invoices: HasMany<typeof Invoice>;
}

Migrations, seeders, factories : tout est livré, et la commande node ace joue le rôle d’Artisan. Pour un développeur Laravel, le mapping mental est immédiat.

🔐 Authentification et validation natives

L’authentification (sessions, access tokens API, basic auth) est livrée out-of-the-box, avec un guard par défaut configurable. Pas besoin d’aller chercher Passport, NextAuth ou Lucia : un node ace add @adonisjs/auth --guard=session suffit pour bootstrap le tout. Pour l’OAuth social (GitHub, Google, etc.), le package compagnon Ally prend le relais avec node ace add @adonisjs/ally.

La validation s’appuie sur VineJS, le validateur maison, qui produit des types TypeScript depuis le schéma :

import vine from '@vinejs/vine';
 
export const createInvoiceValidator = vine.compile(
	vine.object({
		amount: vine.number().positive(),
		customerEmail: vine.string().email(),
		notes: vine.string().optional()
	})
);

C’est lisible, c’est typé, et la séparation validator/controller reste claire.

🚀 Queues, events, mailer, scheduler

Tout ce qui fait la vie d’une vraie application est inclus :

  • Queues (Redis, BullMQ) avec retry, backoff et failed jobs.
  • Events internes et listeners typés.
  • Mailer avec drivers SMTP, Resend, Mailgun, SparkPost, SES.
  • Scheduler type cron pour les tâches récurrentes.
  • Tests intégrés via @japa/runner.

Comme avec Laravel, la promesse est simple : un seul package.json, une seule cohérence, un seul style de code à apprendre pour toute la stack.

🪶 Pourquoi AdonisJS plutôt que Node + 10 libs ?

Le calcul est le même que celui que je fais entre Laravel et “PHP nu” : un framework full-stack n’est pas magique, mais il vous évite des dizaines de décisions techniques qui n’apportent aucune valeur à votre produit. Sur un projet Node typique, le coût caché d’assembler Express + Prisma + Zod + Passport + BullMQ + tsx + Vitest + un cron tiers est largement supérieur à celui d’apprendre AdonisJS.

Quelques scénarios où je sortirais AdonisJS de la boîte sans hésiter :

  • Une API métier Node.js / TypeScript à fort enjeu de cohérence (multi-tenants, RBAC, audit).
  • Un back-office ou un outil interne à durée de vie longue.
  • Le pendant JavaScript d’une application PHP existante, pour partager les conventions au sein d’une même équipe.
  • Le service edge d’un produit qui a déjà un cœur Laravel ou Symfony côté serveur.

🤝 Vous venez de Laravel ? Vous serez à l’aise

Le mapping est presque 1:1 :

LaravelAdonisJS
php artisannode ace
EloquentLucid
FormRequestVineJS validators
Service ContainerIoC Container
Events / ListenersEvents / Listeners
Horizon (queues)BullMQ via le package queue
SocialiteAlly (@adonisjs/ally)
Cashier, Sanctum, etc.Auth + packages communautaires

Pour les développeurs PHP qui veulent élargir leur stack (voir aussi Bun vs Node en 2026 pour le choix du runtime), c’est probablement la transition la plus douce vers JavaScript.

⚠️ Quelques précautions

  • L’écosystème reste plus petit que celui de Laravel : moins de packages communautaires, moins de tutos sur Stack Overflow, mais une communauté très active sur Discord et GitHub.
  • TypeScript est obligatoire. Pour une équipe qui n’a pas encore basculé, prévoyez un mois de montée en compétence collective avant de lancer un projet majeur.
  • Le runtime reste Node : pour des cold starts proches du zéro, regardez aussi du côté de Bun comme runtime alternatif (compatible sur la plupart des cas).

🎉 Conclusion

AdonisJS coche les bonnes cases : framework full-stack, conventions claires, TypeScript natif, ergonomie héritée de Laravel. Pour un développeur PHP curieux de Node, c’est de loin la rampe d’accès la plus confortable. Pour une équipe Node qui cherche à arrêter de réinventer la stack à chaque nouveau projet, c’est probablement le framework qui mérite le plus d’attention en 2026.

🔗 Liens utiles