Next.js 15.1 apporte des améliorations majeures, de nouvelles API et des optimisations pour l'expérience développeur. Les principales nouveautés incluent :
- React 19 (stable) : Le support de React 19 est désormais officiellement disponible pour le Pages Router et l'App Router.
- Meilleur débogage des erreurs : Une expérience développeur améliorée avec de meilleures source maps pour le navigateur et le terminal.
after
(stable) : Nouvelle API pour exécuter du code après l'envoi d'une réponse en streaming.forbidden
/unauthorized
(expérimental) : Nouvelles API pour une gestion plus fine des erreurs d'authentification.
Mettez à jour dès aujourd'hui, ou commencez avec :
# Utilisez l'outil de mise à jour automatique
npx @next/codemod@canary upgrade latest
# ...ou mettez à jour manuellement
npm install next@latest react@latest react-dom@latest
# ...ou créez un nouveau projet
npx create-next-app@latest
React 19 (stable)
Next.js 15.1 prend désormais pleinement en charge React 19 :
- Pour le Pages Router : Vous pouvez utiliser React 19 stable sans avoir besoin des versions Release Candidate ou Canary, tout en conservant le support de React 18.
- Pour l'App Router : Nous continuerons à fournir les versions Canary de React intégrées. Celles-ci incluent toutes les fonctionnalités stables de React 19 ainsi que les nouveautés en cours de validation dans les frameworks avant une nouvelle version de React.
Depuis la sortie de Next.js 15, une fonctionnalité majeure ajoutée à React 19 est le "préchauffage des composants frères (sibling pre-warming)".
Pour un aperçu complet des nouveautés de React 19, consultez l'article officiel sur React 19.
Amélioration du débogage des erreurs
Nous avons amélioré le débogage des erreurs dans Next.js pour vous permettre de localiser rapidement la source des problèmes, qu'ils apparaissent dans le terminal, le navigateur ou les débogueurs attachés. Ces améliorations s'appliquent à la fois à Webpack et Turbopack (maintenant stable avec Next.js 15).
Améliorations des source maps
Les erreurs sont désormais plus faciles à retracer grâce à une meilleure utilisation des source maps. Nous avons implémenté la propriété ignoreList
des source maps, qui permet à Next.js de masquer les trames de pile pour les dépendances externes, mettant ainsi en avant votre code applicatif.
Pour une cartographie des noms de méthodes légèrement plus précise, nous recommandons d'utiliser Turbopack (maintenant stable), qui offre une meilleure gestion et détection des source maps par rapport à Webpack.
Pour les auteurs de bibliothèques : Nous recommandons de renseigner la propriété
ignoreList
dans les source maps lors de la publication de vos bibliothèques, surtout si elles sont configurées comme externes (par exemple dans la configserverExternalPackages
).
Trames de pile réduites
Nous avons amélioré la logique de réduction des trames de pile pour mettre en évidence les parties les plus pertinentes de votre code.
- Dans le navigateur et l'overlay d'erreur : Les trames provenant de dépendances tierces sont masquées par défaut pour se concentrer sur votre code applicatif. Vous pouvez afficher les trames masquées en cliquant sur "Afficher les trames ignorées" dans les outils de développement ou l'overlay.
- Dans le terminal : Les trames des dépendances tierces sont également réduites par défaut, et le formatage des erreurs s'aligne désormais sur la sortie du navigateur pour une expérience de débogage cohérente. Les erreurs sont rejouées dans le navigateur pour vous assurer de ne pas manquer d'informations importantes pendant le développement si vous avez besoin de la pile d'appels complète.
Profilage amélioré
Les trames ignorées sont également reconnues par les profileurs intégrés aux navigateurs. Cela facilite le profilage de votre application, vous permettant d'identifier les fonctions lentes dans votre code sans le bruit des bibliothèques externes.
Améliorations avec l'Edge Runtime
Lors de l'utilisation de l'Edge Runtime, les erreurs s'affichent désormais de manière cohérente dans tous les environnements de développement, garantissant un débogage fluide. Auparavant, les erreurs enregistrées n'incluaient que le message sans la pile d'appels.
Avant et après
Terminal Avant :
⨯ app/page.tsx (6:11) @ eval
⨯ Error: boom
at eval (./app/page.tsx:12:15)
at Page (./app/page.tsx:11:74)
at AsyncLocalStorage.run (node:async_hooks:346:14)
at stringify (<anonymous>)
at AsyncLocalStorage.run (node:async_hooks:346:14)
at AsyncResource.runInAsyncScope (node:async_hooks:206:9)
digest: "380744807"
4 | export default function Page() {
5 | const throwError = myCallback(() => {
> 6 | throw new Error('boom')
| ^
7 | }, [])
8 |
9 | throwError()
GET / 500 in 2354ms
Terminal Après :
⨯ Error: boom
at eval (app/page.tsx:6:10)
at Page (app/page.tsx:5:32)
4 | export default function Page() {
5 | const throwError = myCallback(() => {
> 6 | throw new Error('boom')
| ^
7 | }, [])
8 |
9 | throwError() {
digest: '225828171'
}
Overlay d'erreur Avant

Overlay d'erreur Après

Ces améliorations rendent les erreurs plus claires et plus intuitives, vous permettant de consacrer votre temps à la construction de votre application plutôt qu'au débogage.
Nous sommes également ravis d'annoncer l'introduction d'une interface repensée pour l'overlay d'erreur, qui arrivera dans les prochaines versions.
after
(stable)
L'API after()
est désormais stable après son introduction dans la première RC de Next.js 15.
after()
permet d'exécuter des tâches telles que la journalisation, l'analyse et d'autres synchronisations système après que la réponse a été envoyée en streaming à l'utilisateur, sans bloquer la réponse principale.
Changements clés
Depuis son introduction, nous avons stabilisé after()
et pris en compte les retours, notamment :
- Un meilleur support pour les serveurs Next.js auto-hébergés.
- Des corrections de bugs pour les scénarios où
after()
interagissait avec d'autres fonctionnalités de Next.js. - Une meilleure extensibilité, permettant à d'autres plateformes d'injecter leurs propres primitives
waitUntil()
pour alimenterafter()
. - Le support des API runtime comme
cookies()
etheaders()
dans les Server Actions et Route Handlers.
import { after } from 'next/server';
import { log } from '@/app/utils';
export default function Layout({ children }) {
// Tâche secondaire
after(() => {
log();
});
// Tâche principale
return <>{children}</>;
}
En savoir plus sur l'API after
et comment l'utiliser dans la documentation.
forbidden
et unauthorized
(expérimental)
Next.js 15.1 inclut deux API expérimentales, forbidden()
et unauthorized()
, basées sur les retours de la communauté.
Nous aimerions avoir votre avis — essayez-les dans vos environnements de développement et partagez vos impressions dans ce fil de discussion.
Aperçu
Si vous connaissez l'App Router, vous avez probablement utilisé notFound()
pour déclencher un comportement 404 avec le fichier personnalisable not-found.tsx
. Avec la version 15.1, nous étendons cette approche aux erreurs d'autorisation :
• forbidden()
déclenche une erreur 403 avec une interface personnalisable via forbidden.tsx
.
• unauthorized()
déclenche une erreur 401 avec une interface personnalisable via unauthorized.tsx
.
Bon à savoir : Comme pour les erreurs
notFound()
, le code de statut sera200
si l'erreur est déclenchée après l'envoi des en-têtes de réponse initiaux. En savoir plus.
Activation de la fonctionnalité
Comme cette fonctionnalité est encore expérimentale, vous devrez l'activer dans votre fichier next.config.ts
:
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
experimental: {
authInterrupts: true,
},
};
export default nextConfig;
Note : Le support de
next.config.ts
a été introduit dans Next.js 15. En savoir plus.
Utilisation de forbidden()
et unauthorized()
Vous pouvez utiliser forbidden()
et unauthorized()
dans les Server Actions, Server Components, Client Components ou Route Handlers. Voici un exemple :
import { verifySession } from '@/app/lib/dal';
import { forbidden } from 'next/navigation';
export default async function AdminPage() {
const session = await verifySession();
// Vérifie si l'utilisateur a le rôle 'admin'
if (session.role !== 'admin') {
forbidden();
}
// Affiche la page admin pour les utilisateurs autorisés
return <h1>Admin Page</h1>;
}
Création de pages d'erreur personnalisées
Pour personnaliser les pages d'erreur, créez les fichiers suivants :
import Link from 'next/link';
export default function Forbidden() {
return (
<div>
<h2>Accès interdit</h2>
<p>Vous n'êtes pas autorisé à accéder à cette ressource.</p>
<Link href="/">Retour à l'accueil</Link>
</div>
);
}
import Link from 'next/link';
export default function Unauthorized() {
return (
<div>
<h2>Non autorisé</h2>
<p>Veuillez vous connecter pour accéder à cette page.</p>
<Link href="/login">Aller à la connexion</Link>
</div>
);
}
Nous tenons à remercier Clerk pour avoir proposé cette fonctionnalité via une PR et nous avoir aidés à prototyper l'API. Avant de stabiliser cette fonctionnalité dans la version 15.2, nous prévoyons d'ajouter plus de capacités et d'améliorations aux API pour prendre en charge un plus large éventail de cas d'utilisation.
Consultez la documentation des API unauthorized
et forbidden
pour plus de détails.
Autres changements
- [Fonctionnalité] Utilisation d'ESLint 9 dans
create-next-app
(PR) - [Fonctionnalité] Augmentation du nombre maximal de tags de cache à 128 (PR)
- [Fonctionnalité] Ajout d'une option pour désactiver le CssChunkingPlugin expérimental (PR)
- [Fonctionnalité] Ajout du support expérimental de l'inlining CSS (PR)
- [Amélioration] Silencement de l'avertissement Sass
legacy-js-api
(PR) - [Amélioration] Correction du rejet non géré lors de l'utilisation de rewrites (PR)
- [Amélioration] Assurance que le processus parent se termine en cas d'échec du worker webpack (PR)
- [Amélioration] Correction de l'interception de route sur une route catch-all (PR)
- [Amélioration] Correction d'un problème de clonage de réponse dans la déduplication de requêtes (PR)
- [Amélioration] Correction des redirections de Server Action entre plusieurs layouts racines (PR)
- [Amélioration] Support de la fourniture de plugins MDX sous forme de chaînes pour la compatibilité avec Turbopack (PR)
Contributeurs
Next.js est le fruit du travail combiné de plus de 3 000 développeurs individuels. Cette version a été rendue possible par :
- L'équipe Next.js : Andrew, Hendrik, Janka, Jiachi, Jimmy, Jiwon, JJ, Josh, Jude, Sam, Sebastian, Sebbie, Wyatt, et Zack.
- L'équipe Turbopack : Alex, Benjamin, Donny, Maia, Niklas, Tim, Tobias, et Will.
- L'équipe Documentation Next.js : Delba, Rich, Ismael, et Lee.
Un grand merci à @sokra, @molebox, @delbaoliveira, @eps1lon, @wbinnssmith, @JamBalaya56562, @hyungjikim, @adrian-faustino, @mottox2, @lubieowoce, @bgw, @mknichel, @wyattjoh, @huozhi, @kdy1, @mischnic, @ijjk, @icyJoseph, @acdlite, @unstubbable, @gaojude, @devjiwonchoi, @cena-ko, @lforst, @devpla, @samcx, @styfle, @ztanner, @Marukome0743, @timneutkens, @JeremieDoctrine, @ductnn, @karlhorky, @reynaldichernando, @chogyejin, @y-yagi, @philparzer, @alfawal, @Rhynden, @arlyon, @MJez29, @Goodosky, @themattmayfield, @tobySolutions, @kevinmitch14, @leerob, @emmanuelgautier, @mrhrifat, @lid0a, @boar-is, @nisabmohd, @PapatMayuri, @ovogmap, @Reflex2468, @LioRael, @betterthanhajin, @HerringtonDarkholme, @bpb54321, @ahmoin, @Kikobeats, @abdelrahmanAbouelkheir, @lumirlumir, @yeeed711, @petter, et @suu3 pour leur aide !