{"id":1727,"date":"2026-09-17T01:14:12","date_gmt":"2026-09-17T01:14:12","guid":{"rendered":"https:\/\/nguyot.fr\/index.php\/2026\/09\/17\/migration-pages-directory-app-router-nextjs\/"},"modified":"2026-09-17T01:14:17","modified_gmt":"2026-09-17T01:14:17","slug":"migration-pages-directory-app-router-nextjs","status":"publish","type":"post","link":"https:\/\/nguyot.fr\/index.php\/2026\/09\/17\/migration-pages-directory-app-router-nextjs\/","title":{"rendered":"Migrer de Pages Directory vers App Router sur Next.js"},"content":{"rendered":"<div class=\"wwc\">\nL&rsquo;essentiel \u00e0 retenir : <strong>la migration vers l&rsquo;App Router impose les React Server Components<\/strong> pour r\u00e9duire drastiquement le JavaScript client et acc\u00e9l\u00e9rer le First Contentful Paint. Cette architecture hybride, combin\u00e9e aux layouts persistants et aux Server Actions, <strong>simplifie la gestion des donn\u00e9es<\/strong> tout en s\u00e9curisant vos cl\u00e9s API. Vous optimisez ainsi radicalement les <strong>performances mobiles et la maintenance<\/strong> de votre code.\n<\/div>\n<p>Next.js 13.4 marque un tournant architectural majeur avec l&rsquo;introduction officielle de l&rsquo;App Router. Ce nouveau syst\u00e8me de routage bas\u00e9 sur les React Server Components permet de <strong>r\u00e9duire drastiquement le JavaScript<\/strong> envoy\u00e9 au navigateur en ex\u00e9cutant la logique directement sur le serveur.<\/p>\n<p>Pourtant, abandonner le r\u00e9pertoire Pages au profit d&rsquo;une structure imbriqu\u00e9e peut sembler complexe sans une m\u00e9thodologie rigoureuse. Cet article d\u00e9taille les \u00e9tapes pour <strong>r\u00e9ussir votre migration pages directory vers app router next.js<\/strong> afin d&rsquo;optimiser vos performances et la maintenabilit\u00e9 de votre code. On d\u00e9cortique ensemble les changements de paradigmes n\u00e9cessaires pour moderniser votre application.<\/p>\n<ol>\n<li><a href=\"#pourquoi-entamer-la-migration-pages-directory-vers-app-router-next-js\">Pourquoi entamer la migration pages directory vers app router next.js ?<\/a><\/li>\n<li><a href=\"#preparer-votre-environnement-pour-une-coexistence-sans-risque\">Pr\u00e9parer votre environnement pour une coexistence sans risque<\/a><\/li>\n<li><a href=\"#refondre-la-structure-globale-via-le-root-layout\">Refondre la structure globale via le Root Layout<\/a><\/li>\n<li><a href=\"#moderniser-la-recuperation-de-donnees-avec-les-server-components\">Moderniser la r\u00e9cup\u00e9ration de donn\u00e9es avec les Server Components<\/a><\/li>\n<li><a href=\"#adapter-l-interactivite-et-la-navigation-aux-nouveaux-standards\">Adapter l&rsquo;interactivit\u00e9 et la navigation aux nouveaux standards<\/a><\/li>\n<li><a href=\"#optimiser-le-seo-et-les-traitements-serveurs-avances\">Optimiser le SEO et les traitements serveurs avanc\u00e9s<\/a><\/li>\n<\/ol>\n<h2 id=\"pourquoi-entamer-la-migration-pages-directory-vers-app-router-next-js\">Pourquoi entamer la migration pages directory vers app router next.js ?<\/h2>\n<p>L&rsquo;App Router de Next.js impose les React Server Components pour r\u00e9duire le JavaScript client, le routage imbriqu\u00e9 via des layouts persistants et une gestion native du cache. Cette architecture hybride <strong>optimise radicalement le First Contentful Paint<\/strong>. Cette mutation repose sur un nouveau paradigme de rendu serveur.<\/p>\n<div style=\"position: relative;padding-bottom: 56.25%;height: 0;overflow: hidden;max-width: 100%;margin: 1.5rem 0\">\n<\/div>\n<div class=\"wwc wwc-info\">\n<div class=\"wwc-title\">React Server Components (RSC)<\/div>\n<p>Les RSC s&rsquo;ex\u00e9cutent exclusivement sur le serveur. Ils n&rsquo;envoient aucun JavaScript au navigateur, ce qui <strong>am\u00e9liore le First Contentful Paint<\/strong> en d\u00e9chargeant la logique du client.<\/p>\n<\/div>\n<h3>Comprendre le fonctionnement des React Server Components<\/h3>\n<p>Par d\u00e9faut, tout composant dans le r\u00e9pertoire app est un Server Component. <strong>Il s&rsquo;ex\u00e9cute uniquement sur le serveur<\/strong>. Vous ne surchargez donc jamais le navigateur inutilement.<\/p>\n<p>Aucun code JavaScript n&rsquo;est envoy\u00e9 pour ces \u00e9l\u00e9ments. Cela <strong>all\u00e8ge consid\u00e9rablement le poids des pages<\/strong>. Vos utilisateurs gagnent en confort.<\/p>\n<p>Les performances sur mobiles deviennent excellentes. La puissance du serveur remplace celle du terminal. C&rsquo;est un atout majeur.<\/p>\n<p>Le rendu initial est instantan\u00e9. La fluidit\u00e9 globale impressionne.<\/p>\n<blockquote><p>Les React Server Components ne sont pas juste une option, c&rsquo;est le socle d&rsquo;une architecture web moderne et performante.<\/p><\/blockquote>\n<h3>R\u00e9duire le poids des bundles JavaScript c\u00f4t\u00e9 client<\/h3>\n<p>Le framework \u00e9limine les d\u00e9pendances inutiles du bundle final. Seuls les <strong>composants marqu\u00e9s \u00ab\u00a0use client\u00a0\u00bb sont exp\u00e9di\u00e9s<\/strong>. C&rsquo;est une cure d&rsquo;amaigrissement radicale.<\/p>\n<p>L&rsquo;ancien Pages Router fonctionnait diff\u00e9remment. Auparavant, chaque page tra\u00eenait un surplus de logique superflu. <strong>Le gaspillage \u00e9tait fr\u00e9quent<\/strong>.<\/p>\n<p>Moins de JavaScript signifie moins de bugs potentiels. La maintenance devient plus simple. <strong>Vos \u00e9quipes gagnent en productivit\u00e9<\/strong>.<\/p>\n<p>C&rsquo;est un levier pour <a href=\"https:\/\/nguyot.fr\/index.php\/2026\/08\/24\/audit-code-react-native-entreprise\/\"><strong>r\u00e9ussir l&rsquo;audit de code de votre application<\/strong><\/a> avec efficacit\u00e9.<\/p>\n<div class=\"wwc\">\n<div class=\"wwc-header\">\n<div class=\"wwc-title\"><\/div>\n<div class=\"wwc-subtitle\"><\/div>\n<div class=\"wwc-subtitle\"><\/div>\n<\/p><\/div>\n<div class=\"wwc-body\">\n<div class=\"wwc-grid\" style=\"--wwc-grid-cols: 1\">\n<div style=\"display:contents\">\n &lt;button class=&quot;wwc-secondary&quot; x-on:click=&quot;((scores.A = scores.A + (opt.scores.A || 0)) || true) &amp;&amp; ((scores.B = scores.B + (opt.scores.B || 0)) || true) &amp;&amp; ((scores.C = scores.C + (opt.scores.C || 0)) || true) &amp;&amp; (current <\/button>\n <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"wwc-body\">\n<div class=\"wwc-grid\" style=\"--wwc-grid-cols: 1\">\n<div class=\"wwc-column wwc-icon-pro\">\n<div>= scores.B &amp;&amp; scores.A &gt;= scores.C ? &lsquo;A&rsquo; : (scores.B &gt;= scores.C ? &lsquo;B&rsquo; : (&lsquo;C&rsquo;))].title\u00a0\u00bb&gt;<\/div>\n<p>= scores.B &amp;&amp; scores.A &gt;= scores.C ? &lsquo;A&rsquo; : (scores.B &gt;= scores.C ? &lsquo;B&rsquo; : (&lsquo;C&rsquo;))].text\u00a0\u00bb&gt;<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"wwc-footer\">\n <button class=\"wwc-secondary\"><\/button>\n <\/div>\n<\/div>\n<h3>Exploiter les avantages du routage imbriqu\u00e9<\/h3>\n<p>Les Nested Layouts permettent d&#8217;embo\u00eeter des interfaces sans recharger les \u00e9l\u00e9ments communs. Le code devient modulaire. L&rsquo;organisation de vos fichiers sources change radicalement. La <strong>lisibilit\u00e9 s&rsquo;en trouve renforc\u00e9e<\/strong> instantan\u00e9ment.<\/p>\n<p>L&rsquo;\u00e9tat persiste durant la navigation. Seul le segment modifi\u00e9 est mis \u00e0 jour. L&rsquo;utilisateur ne subit <strong>aucune interruption visuelle<\/strong>. Le contexte reste stable.<\/p>\n<p>Next.js <strong>optimise les ressources via le rendu partiel<\/strong>. Il t\u00e9l\u00e9charge uniquement le strict n\u00e9cessaire. L&rsquo;efficacit\u00e9 est totale.<\/p>\n<div class=\"wwc wwc-grid\">\n<div class=\"wwc-column wwc-icon-pro\">\n<div class=\"wwc-title\">Avantages Migration<\/div>\n<ul>\n<li><strong>R\u00e9duction drastique du JS<\/strong> client.<\/li>\n<li><strong>Layouts persistants sans rechargement<\/strong>.<\/li>\n<li><strong>Chargement de donn\u00e9es simplifi\u00e9<\/strong>.<\/li>\n<\/ul><\/div>\n<div class=\"wwc-column wwc-icon-con\">\n<div class=\"wwc-title\">Inconv\u00e9nients<\/div>\n<ul>\n<li><strong>Courbe d&rsquo;apprentissage<\/strong> initiale.<\/li>\n<li><strong>Refactorisation des hooks clients<\/strong>.<\/li>\n<\/ul><\/div>\n<\/div>\n<h2 id=\"preparer-votre-environnement-pour-une-coexistence-sans-risque\">Pr\u00e9parer votre environnement pour une coexistence sans risque<\/h2>\n<p>Avant de toucher au code, vous devez <strong>s\u00e9curiser votre terrain de jeu<\/strong> pour \u00e9viter que tout n&rsquo;explose en plein vol.<\/p>\n<h3>Mettre \u00e0 jour les d\u00e9pendances vers la derni\u00e8re version<\/h3>\n<p>V\u00e9rifiez d&rsquo;abord vos versions de React et Next.js. Une version obsol\u00e8te bloquera les <strong>nouvelles fonctionnalit\u00e9s du r\u00e9pertoire \u00ab\u00a0app\u00a0\u00bb<\/strong>. Soyez rigoureux sur cette \u00e9tape pr\u00e9liminaire indispensable.<\/p>\n<p>Identifiez les <strong>librairies externes probl\u00e9matiques<\/strong>. Certaines ne supportent pas encore les Server Components. Il faudra peut-\u00eatre trouver des alternatives ou attendre des mises \u00e0 jour sp\u00e9cifiques.<\/p>\n<figure style=\"margin: 1.5rem 0\"><img decoding=\"async\" src=\"https:\/\/nguyot.fr\/wp-content\/uploads\/2026\/09\/dark-data-center-with-blue-lights.jpg\" alt=\"Pr\u00e9parer votre environnement pour une coexistence sans risque\" style=\"width: 100%;height: auto;border-radius: 8px\" loading=\"lazy\" \/><\/figure>\n<p>Utilisez les outils de diagnostic officiels. Ils pointent souvent les <strong>incompatibilit\u00e9s majeures<\/strong> avant m\u00eame la compilation.<\/p>\n<div class=\"wwc\">\n<div class=\"wwc-title\">\u00c9tapes de s\u00e9curisation de l&rsquo;environnement<\/div>\n<ol>\n<li><strong>Mettre \u00e0 jour Next.js<\/strong> vers la version 13.4 ou sup\u00e9rieure.<\/li>\n<li><strong>Cr\u00e9er le r\u00e9pertoire \u00ab\u00a0app\u00a0\u00bb<\/strong> \u00e0 la racine du projet.<\/li>\n<li><strong>Configurer next.config.js<\/strong> pour les fonctionnalit\u00e9s exp\u00e9rimentales.<\/li>\n<li><strong>Identifier et isoler<\/strong> les biblioth\u00e8ques externes incompatibles.<\/li>\n<\/ol>\n<\/div>\n<h3>Configurer le r\u00e9pertoire app parall\u00e8lement aux pages<\/h3>\n<p>Cr\u00e9ez le dossier \u00ab\u00a0app\u00a0\u00bb \u00e0 la racine sans toucher au dossier \u00ab\u00a0pages\u00a0\u00bb. <strong>Les deux peuvent cohabiter durant toute la phase de transition<\/strong>. C&rsquo;est la cl\u00e9 d&rsquo;une migration sereine.<\/p>\n<p>Comprenez la <strong>priorit\u00e9 des routes<\/strong>. Le r\u00e9pertoire \u00ab\u00a0app\u00a0\u00bb prend le dessus en cas de doublon de nom de fichier.<\/p>\n<p>Modifiez votre fichier next.config.js. Activez les options exp\u00e9rimentales si n\u00e9cessaire pour supporter les derni\u00e8res avanc\u00e9es comme <a href=\"https:\/\/nguyot.fr\/index.php\/2026\/07\/01\/optimiser-core-web-vitals-nextjs\/\"><strong>optimiser les core web vitals<\/strong> avec next.js<\/a>.<\/p>\n<h3>Utiliser les rewrites pour une transition progressive<\/h3>\n<p>Mettez en place des <strong>redirections internes intelligentes<\/strong>. Cela permet de tester vos nouvelles pages \u00ab\u00a0app\u00a0\u00bb en conditions r\u00e9elles. Vous gardez le contr\u00f4le total sur le trafic.<\/p>\n<p>Garantissez la continuit\u00e9 du service. Vos utilisateurs ne doivent percevoir aucun changement de comportement. <strong>La stabilit\u00e9 de la plateforme<\/strong> reste votre priorit\u00e9 absolue.<\/p>\n<p>En fait, <strong>migrer de Pages Directory vers App Router sur Next.js<\/strong> demande une granularit\u00e9 fine pour \u00e9viter les r\u00e9gressions.<\/p>\n<ul>\n<li>Test A\/B facilit\u00e9 : <strong>Comparez les performances<\/strong> entre les deux routeurs.<\/li>\n<li><strong>Rollback instantan\u00e9<\/strong> : Revenez en arri\u00e8re rapidement en cas de bug.<\/li>\n<li><strong>Isolation des erreurs<\/strong> : Limitez les probl\u00e8mes \u00e0 un segment sp\u00e9cifique.<\/li>\n<li><strong>D\u00e9ploiement granulaire<\/strong> : Migrez vos pages une par une sans risque global.<\/li>\n<\/ul>\n<div class=\"wwc wwc-grid\">\n<div class=\"wwc-column wwc-icon-pro\">\n<div class=\"wwc-title\">Avantages de la coexistence<\/div>\n<ul>\n<li><strong>Migration incr\u00e9mentale page par page<\/strong>.<\/li>\n<li><strong>Adoption des Server Components<\/strong> sans refonte totale.<\/li>\n<li><strong>Maintien de la stabilit\u00e9<\/strong> des routes existantes.<\/li>\n<\/ul><\/div>\n<div class=\"wwc-column wwc-icon-con\">\n<div class=\"wwc-title\">Contraintes techniques<\/div>\n<ul>\n<li><strong>Navigation \u00ab\u00a0hard\u00a0\u00bb<\/strong> entre les deux syst\u00e8mes.<\/li>\n<li><strong>Pas de pr\u00e9chargement<\/strong> automatique inter-routeurs.<\/li>\n<li><strong>Gestion double des hooks<\/strong> de navigation.<\/li>\n<\/ul><\/div>\n<\/div>\n<h2 id=\"refondre-la-structure-globale-via-le-root-layout\">Refondre la structure globale via le Root Layout<\/h2>\n<p>Une fois l&rsquo;environnement pr\u00eat, il est temps de <strong>s&rsquo;attaquer au squelette m\u00eame de votre application : le layout<\/strong>.<\/p>\n<h3>Fusionner _app et _document dans le fichier layout.tsx<\/h3>\n<p><strong>Transf\u00e9rez votre logique globale<\/strong> vers le nouveau Root Layout. C&rsquo;est ici que vous d\u00e9finissez les balises HTML et Body. Simplifiez votre structure en \u00e9liminant les anciens fichiers.<\/p>\n<p>Remplacez le composant Head par l&rsquo;API Metadata. C&rsquo;est beaucoup plus propre et performant pour le SEO. <strong>Centralisez vos balises m\u00e9ta<\/strong> directement dans ce fichier racine.<\/p>\n<figure style=\"margin: 1.5rem 0\"><img decoding=\"async\" src=\"https:\/\/nguyot.fr\/wp-content\/uploads\/2026\/09\/migrer-de-pages-a-app-router.jpg\" alt=\"Refondre la structure globale via le Root Layout\" style=\"width: 100%;height: auto;border-radius: 8px\" loading=\"lazy\" \/><\/figure>\n<p>Importez vos <strong>styles CSS globaux<\/strong> ici. N&rsquo;oubliez pas d&rsquo;inclure vos scripts tiers de mani\u00e8re optimis\u00e9e.<\/p>\n<h3>Int\u00e9grer les polices Google avec next\/font<\/h3>\n<p>Configurez l&rsquo;optimisation automatique des polices. Next.js <strong>t\u00e9l\u00e9charge les fichiers au moment du build<\/strong>. Cela \u00e9vite les requ\u00eates r\u00e9seau inutiles vers les serveurs de Google.<\/p>\n<p>Supprimez les imports CSS classiques. Utilisez le module d\u00e9di\u00e9 pour une <strong>int\u00e9gration parfaite<\/strong>. C&rsquo;est bien plus efficace.<\/p>\n<p>Observez les <strong>b\u00e9n\u00e9fices sur le Cumulative Layout Shift<\/strong>. Vos textes ne sautent plus au chargement. Pensez d&rsquo;ailleurs \u00e0 <a href=\"https:\/\/nguyot.fr\/index.php\/2026\/07\/04\/seo-pour-ai-overviews-google\/\">optimiser vos contenus pour les ai overviews<\/a>.<\/p>\n<h3>G\u00e9rer les \u00e9tats de chargement avec loading.js<\/h3>\n<p>Cr\u00e9ez des <strong>interfaces de chargement instantan\u00e9es<\/strong> avec loading.js. Ce fichier g\u00e9n\u00e8re automatiquement des squelettes d&rsquo;attente pour vos utilisateurs. C&rsquo;est une m\u00e9thode simple pour am\u00e9liorer la perception de vitesse. Ne laissez plus vos visiteurs devant un \u00e9cran blanc.<\/p>\n<p>Utilisez React Suspense pour le streaming. Le contenu s&rsquo;affiche au fur et \u00e0 mesure de sa disponibilit\u00e9. C&rsquo;est une avanc\u00e9e majeure pour l&rsquo;exp\u00e9rience utilisateur globale.<\/p>\n<p>Am\u00e9liorez le ressenti de fluidit\u00e9. La <strong>navigation entre les pages devient beaucoup plus organique et r\u00e9active<\/strong>.<\/p>\n<h2 id=\"moderniser-la-recuperation-de-donnees-avec-les-server-components\">Moderniser la r\u00e9cup\u00e9ration de donn\u00e9es avec les Server Components<\/h2>\n<p>Le c\u0153ur du changement r\u00e9side dans la fa\u00e7on dont vous allez <strong>chercher vos donn\u00e9es sans alourdir<\/strong> le client.<\/p>\n<h3>Remplacer getServerSideProps par des composants asynchrones<\/h3>\n<p>Utilisez la syntaxe async\/await directement dans vos composants. Plus besoin de fonctions complexes en dehors de votre logique. <strong>Le code devient enfin lisible<\/strong> et facile \u00e0 suivre.<\/p>\n<p>Supprimez le transfert de props. Les donn\u00e9es restent sur le serveur. C&rsquo;est un <strong>gain de s\u00e9curit\u00e9 et de poids<\/strong> non n\u00e9gligeable.<\/p>\n<p><strong>S\u00e9curisez vos appels API sensibles<\/strong>. Vos cl\u00e9s secr\u00e8tes ne quittent jamais l&rsquo;environnement serveur. Cela facilite grandement le <a href=\"https:\/\/nguyot.fr\/index.php\/2026\/07\/08\/developper-saas-nextjs-nodejs\/\">d\u00e9veloppement d&rsquo;un saas avec next.js et node.js<\/a>.<\/p>\n<h3>Utiliser generateStaticParams pour vos routes dynamiques<\/h3>\n<p>Remplacez getStaticPaths par cette nouvelle API simplifi\u00e9e. Elle permet de <strong>g\u00e9n\u00e9rer vos routes au moment de la compilation<\/strong>. C&rsquo;est rapide, efficace et beaucoup moins verbeux qu&rsquo;auparavant.<\/p>\n<p>D\u00e9taillez la g\u00e9n\u00e9ration des segments. Le build produit des <strong>fichiers statiques pour chaque param\u00e8tre d\u00e9fini<\/strong>. C&rsquo;est excellent pour le SEO.<\/p>\n<div style=\"overflow:auto;max-width:100%\">\n<div class=\"wwc wwc-table\">\n<table>\n<thead>\n<tr>\n<th>Concept<\/th>\n<th>Ancienne M\u00e9thode (Pages)<\/th>\n<th>Nouvelle M\u00e9thode (App)<\/th>\n<th>Avantage<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Rendu dynamique<\/td>\n<td>getServerSideProps<\/td>\n<td>async component<\/td>\n<td>Moins de JS client<\/td>\n<\/tr>\n<tr>\n<td>Rendu statique<\/td>\n<td>getStaticProps<\/td>\n<td>fetch<\/td>\n<td>Syntaxe native<\/td>\n<\/tr>\n<tr>\n<td>Routes dynamiques<\/td>\n<td>getStaticPaths<\/td>\n<td>generateStaticParams<\/td>\n<td>Type-safe et simple<\/td>\n<\/tr>\n<tr>\n<td>Cache<\/td>\n<td>Manuel<\/td>\n<td>fetch options<\/td>\n<td>Granularit\u00e9 fine<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n<\/div>\n<h3>Configurer la revalidation des donn\u00e9es avec fetch<\/h3>\n<p>Ma\u00eetrisez les options de cache de fetch. Next.js \u00e9tend l&rsquo;API native pour g\u00e9rer la persistance des donn\u00e9es. Vous d\u00e9cidez <strong>pr\u00e9cis\u00e9ment quand rafra\u00eechir<\/strong> vos informations.<\/p>\n<figure style=\"margin: 1.5rem 0\"><img decoding=\"async\" src=\"https:\/\/nguyot.fr\/wp-content\/uploads\/2026\/09\/server-component-macro.jpg\" alt=\"Moderniser la r\u00e9cup\u00e9ration de donn\u00e9es avec les Server Components\" style=\"width: 100%;height: auto;border-radius: 8px\" loading=\"lazy\" \/><\/figure>\n<p>Mettez en \u0153uvre la revalidation temporelle. L&rsquo;Incremental Static Regeneration devient plus granulaire. Vous pouvez cibler des <strong>segments sp\u00e9cifiques de votre page pour la mise \u00e0 jour<\/strong>.<\/p>\n<p>Diff\u00e9renciez le rendu statique du dynamique. Forcez le comportement souhait\u00e9 via les options de configuration. C&rsquo;est une <strong>souplesse indispensable pour les donn\u00e9es changeantes<\/strong>.<\/p>\n<h2 id=\"adapter-l-interactivite-et-la-navigation-aux-nouveaux-standards\">Adapter l&rsquo;interactivit\u00e9 et la navigation aux nouveaux standards<\/h2>\n<p>Naviguer et interagir demande maintenant de <strong>bien s\u00e9parer ce qui bouge de ce qui reste statique<\/strong> sur le serveur.<\/p>\n<h3>Passer de next\/router vers le module next\/navigation<\/h3>\n<p>Mettez \u00e0 jour vos hooks de routage. Utilisez d\u00e9sormais <strong>useRouter, usePathname et useSearchParams<\/strong>. Ces outils sont con\u00e7us sp\u00e9cifiquement pour la nouvelle architecture par segments.<\/p>\n<p>Adaptez vos redirections programmatiques. La logique c\u00f4t\u00e9 client change l\u00e9g\u00e8rement de syntaxe. Soyez attentifs aux <strong>nouveaux types de retours<\/strong>.<\/p>\n<p>Comprenez les \u00e9v\u00e9nements de route. Certains anciens comportements ont disparu au profit d&rsquo;<strong>une approche plus pr\u00e9visible<\/strong>. Pensez-y lors de la <a href=\"https:\/\/nguyot.fr\/index.php\/2026\/08\/25\/migration-application-native-react-native\/\">migration de votre application native<\/a>.<\/p>\n<h3>Isoler l&rsquo;interactivit\u00e9 avec la directive use client<\/h3>\n<p>D\u00e9terminez les composants qui n\u00e9cessitent du JavaScript. Ajoutez la directive \u00ab\u00a0use client\u00a0\u00bb au sommet de ces fichiers. C&rsquo;est le signal pour le framework d&rsquo;<strong>inclure le code client<\/strong>.<\/p>\n<p>D\u00e9placez vos hooks d&rsquo;\u00e9tat. <strong>Gardez-les le plus bas possible<\/strong> dans l&rsquo;arbre. Cela pr\u00e9serve les performances de vos composants parents.<\/p>\n<p>Optimisez votre hi\u00e9rarchie. Conservez un maximum de composants sur le serveur pour <strong>r\u00e9duire le bundle<\/strong>. C&rsquo;est une gymnastique mentale n\u00e9cessaire pour tout d\u00e9veloppeur Next.js.<\/p>\n<div class=\"wwc wwc-warning\">\n<div class=\"wwc-title\">Attention aux erreurs d&rsquo;ex\u00e9cution<\/div>\n<p>N&rsquo;utilisez jamais de hooks comme useState ou useEffect dans des <strong>Server Components<\/strong>. Placez toujours &lsquo;use client&rsquo; en haut des fichiers n\u00e9cessitant de l&rsquo;interactivit\u00e9 et maintenez ces composants bas dans l&rsquo;arborescence pour limiter la taille du bundle.<\/p>\n<\/div>\n<h3>Int\u00e9grer les contextes React dans une architecture hybride<\/h3>\n<p>Cr\u00e9ez des <strong>providers clients d\u00e9di\u00e9s<\/strong>. Ils doivent encapsuler vos composants serveurs sans les transformer. C&rsquo;est la seule fa\u00e7on d&rsquo;utiliser Context API dans le r\u00e9pertoire \u00ab\u00a0app\u00a0\u00bb.<\/p>\n<p>G\u00e9rez votre \u00e9tat global intelligemment. <strong>Ne sacrifiez pas la vitesse pour la commodit\u00e9<\/strong>. Trop de contextes peuvent ralentir l&rsquo;hydratation initiale de votre application.<\/p>\n<p>\u00c9vitez les erreurs d&rsquo;hydratation fr\u00e9quentes. Assurez-vous que les donn\u00e9es initiales sont coh\u00e9rentes entre le serveur et le client. La rigueur ici vous \u00e9vitera bien des maux de t\u00eate.<\/p>\n<h2 id=\"optimiser-le-seo-et-les-traitements-serveurs-avances\">Optimiser le SEO et les traitements serveurs avanc\u00e9s<\/h2>\n<p>Pour finir, voyons comment <strong>propulser votre visibilit\u00e9 et simplifier vos \u00e9changes de donn\u00e9es<\/strong> avec le serveur.<\/p>\n<h3>D\u00e9clarer les m\u00e9tadonn\u00e9es SEO via l&rsquo;objet metadata<\/h3>\n<p><strong>Exportez des objets metadata statiques<\/strong> pour vos pages simples. C&rsquo;est la m\u00e9thode recommand\u00e9e par Next.js pour le r\u00e9f\u00e9rencement. C&rsquo;est simple, efficace et parfaitement typ\u00e9.<\/p>\n<p><strong>G\u00e9n\u00e9rez des m\u00e9tadonn\u00e9es dynamiques<\/strong> si besoin. Utilisez la fonction generateMetadata pour adapter vos titres aux contenus. C&rsquo;est id\u00e9al pour les articles.<\/p>\n<p>Centralisez vos configurations Open Graph. <strong>Vos partages sur les r\u00e9seaux sociaux seront toujours impeccables<\/strong>. Pensez-y au moment de <a href=\"https:\/\/nguyot.fr\/index.php\/2026\/08\/14\/react-native-flutter-application-metier\/\">choisir entre react native ou flutter<\/a> pour vos projets mobiles.<\/p>\n<h3>Transformer les API routes en Route Handlers<\/h3>\n<p><strong>R\u00e9\u00e9crivez vos anciennes API<\/strong> vers le format route.ts. Utilisez les standards modernes Web Request et Response. C&rsquo;est une mise \u00e0 jour n\u00e9cessaire pour la coh\u00e9rence globale.<\/p>\n<p>G\u00e9rez les m\u00e9thodes HTTP proprement. Chaque verbe poss\u00e8de sa propre fonction export\u00e9e. Le <strong>code est ainsi beaucoup plus structur\u00e9 et lisible<\/strong>.<\/p>\n<blockquote><p>Les Route Handlers apportent une standardisation bienvenue, alignant Next.js sur <strong>les API Web natives<\/strong> pour une meilleure interop\u00e9rabilit\u00e9.<\/p><\/blockquote>\n<h3>Simplifier les mutations avec les Server Actions<\/h3>\n<p>Supprimez les API interm\u00e9diaires pour vos formulaires. Les Server Actions permettent d&rsquo;envoyer des donn\u00e9es directement au serveur. C&rsquo;est une <strong>r\u00e9duction drastique de la complexit\u00e9<\/strong> de votre code. Vous gagnez en temps de d\u00e9veloppement et en s\u00e9curit\u00e9.<\/p>\n<div class=\"wwc wwc-tip\">\n<div class=\"wwc-title\">Astuce technique<\/div>\n<p>Les Server Actions \u00e9liminent le besoin de routes API interm\u00e9diaires en <strong>autorisant des fonctions serveur directes dans les formulaires<\/strong>, r\u00e9duisant la complexit\u00e9 du code tout en renfor\u00e7ant la s\u00e9curit\u00e9.<\/p>\n<\/div>\n<p>Ex\u00e9cutez du <strong>code serveur s\u00e9curis\u00e9<\/strong>. Vos fonctions sont prot\u00e9g\u00e9es nativement contre les injections. C&rsquo;est une approche moderne de la gestion des donn\u00e9es utilisateur.<\/p>\n<p>Revalidez automatiquement votre cache. <strong>Vos interfaces se mettent \u00e0 jour<\/strong> d\u00e8s que la modification est confirm\u00e9e.<\/p>\n<p>La migration pages directory vers app router next.js propulse vos performances gr\u00e2ce aux Server Components et au routage imbriqu\u00e9. Modernisez votre architecture d\u00e8s maintenant pour all\u00e9ger vos bundles et s\u00e9curiser vos donn\u00e9es nativement. Adoptez ce nouveau standard pour b\u00e2tir des <strong>interfaces ultra-rapides et p\u00e9rennes<\/strong>.<\/p>\n<h2>FAQ<\/h2>\n<h3>Est-il possible de faire cohabiter le Pages Router et l&rsquo;App Router dans un m\u00eame projet Next.js ?<\/h3>\n<p>Absolument. La migration peut s&rsquo;effectuer de mani\u00e8re incr\u00e9mentale. Vous pouvez cr\u00e9er le r\u00e9pertoire app \u00e0 la racine de votre projet tout en conservant votre dossier pages existant. <strong>Les deux syst\u00e8mes de routage coexistent sans conflit<\/strong>, ce qui vous permet de migrer vos routes une par une en toute s\u00e9curit\u00e9.<\/p>\n<p>Notez toutefois qu&rsquo;en cas de doublon de nom de fichier entre les deux r\u00e9pertoires, <strong>le r\u00e9pertoire app prendra la priorit\u00e9 sur le Pages Router<\/strong>. Cette approche hybride est la cl\u00e9 pour moderniser votre architecture sans risquer une interruption de service globale.<\/p>\n<h3>Par quoi remplacer les fonctions getServerSideProps et getStaticProps lors de la migration ?<\/h3>\n<p>Avec l&rsquo;App Router, ces fonctions disparaissent au profit d&rsquo;une syntaxe beaucoup plus naturelle. Vous utilisez d\u00e9sormais des <strong>Server Components asynchrones<\/strong>. Il vous suffit de d\u00e9clarer votre composant avec le mot-cl\u00e9 <code>async<\/code> et d&rsquo;utiliser <code>await fetch()<\/code> directement dans le corps de votre fonction pour r\u00e9cup\u00e9rer vos donn\u00e9es.<\/p>\n<p>Cette m\u00e9thode <strong>simplifie radicalement votre code<\/strong> : les donn\u00e9es restent sur le serveur et ne sont plus transf\u00e9r\u00e9es inutilement au client via des props. Pour la g\u00e9n\u00e9ration statique, l&rsquo;API <code>generateStaticParams<\/code> remplace avantageusement l&rsquo;ancien <code>getStaticPaths<\/code>, offrant une gestion des routes dynamiques plus performante et moins verbeuse.<\/p>\n<h3>Comment g\u00e9rer les m\u00e9tadonn\u00e9es SEO sans le composant Head de Next.js ?<\/h3>\n<p>L&rsquo;ancien composant <code>next\/head<\/code> est remplac\u00e9 par l&rsquo;<strong>API Metadata, une solution plus robuste et mieux int\u00e9gr\u00e9e<\/strong> au moteur de rendu. Vous devez d\u00e9sormais exporter un objet <code>metadata<\/code> statique ou utiliser la fonction <code>generateMetadata<\/code> pour les contenus dynamiques directement dans vos fichiers <code>layout.tsx<\/code> ou <code>page.tsx<\/code>.<\/p>\n<p>Cette approche centralise la gestion de vos balises titres, descriptions et configurations Open Graph. Elle garantit que vos m\u00e9tadonn\u00e9es sont correctement g\u00e9n\u00e9r\u00e9es c\u00f4t\u00e9 serveur, ce qui <strong>optimise radicalement votre indexation par les moteurs de recherche et la qualit\u00e9 de vos partages sur les r\u00e9seaux sociaux<\/strong>.<\/p>\n<h3>Pourquoi mes hooks React comme useState ne fonctionnent-ils plus par d\u00e9faut dans le dossier app ?<\/h3>\n<p>Dans l&rsquo;App Router, tous les composants situ\u00e9s dans le r\u00e9pertoire app sont des <strong>React Server Components par d\u00e9faut<\/strong>. Ils s&rsquo;ex\u00e9cutent exclusivement sur le serveur et ne supportent donc pas les hooks li\u00e9s au cycle de vie du navigateur ou \u00e0 l&rsquo;\u00e9tat interactif.<\/p>\n<p>Pour utiliser <code>useState<\/code>, <code>useEffect<\/code> ou des contextes, vous devez imp\u00e9rativement <strong>ajouter la directive &lsquo;use client&rsquo;<\/strong> tout en haut de votre fichier. La strat\u00e9gie recommand\u00e9e consiste \u00e0 garder vos composants serveurs le plus haut possible dans l&rsquo;arbre et \u00e0 n&rsquo;isoler que les \u00e9l\u00e9ments interactifs dans des Client Components sp\u00e9cifiques pour all\u00e9ger le bundle JavaScript final.<\/p>\n<h3>Comment mettre \u00e0 jour la navigation et les redirections programmatiques ?<\/h3>\n<p>Le module <code>next\/router<\/code> est d\u00e9sormais obsol\u00e8te pour les composants situ\u00e9s dans le r\u00e9pertoire app. Vous devez <strong>migrer vers le nouveau module next\/navigation<\/strong>. Ce dernier propose des hooks sp\u00e9cialis\u00e9s comme <code>useRouter<\/code>, <code>usePathname<\/code> et <code>useSearchParams<\/code>, con\u00e7us pour fonctionner avec l&rsquo;architecture par segments.<\/p>\n<p>Soyez vigilant lors de cette transition : les m\u00e9thodes de redirection et la gestion des \u00e9v\u00e9nements de route ont \u00e9volu\u00e9 pour offrir un comportement plus pr\u00e9visible. Cette mise \u00e0 jour est indispensable pour garantir une <strong>navigation fluide et coh\u00e9rente<\/strong> au sein de votre nouvelle structure de fichiers.<\/p>\n<p>.wwc { &#8211;wwc-primary: #3b82f6; }<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;essentiel \u00e0 retenir : la migration vers l&rsquo;App Router impose les React Server Components pour r\u00e9duire drastiquement le JavaScript client et acc\u00e9l\u00e9rer le First Contentful Paint. Cette architecture hybride, combin\u00e9e aux layouts persistants et aux Server Actions, simplifie la gestion &#8230; <a title=\"Migrer de Pages Directory vers App Router sur Next.js\" class=\"read-more\" href=\"https:\/\/nguyot.fr\/index.php\/2026\/09\/17\/migration-pages-directory-app-router-nextjs\/\" aria-label=\"En savoir plus sur Migrer de Pages Directory vers App Router sur Next.js\">Lire plus<\/a><\/p>\n","protected":false},"author":2,"featured_media":1728,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1727","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","generate-columns","tablet-grid-50","mobile-grid-100","grid-parent","grid-50"],"_links":{"self":[{"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/posts\/1727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1727"}],"version-history":[{"count":2,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/posts\/1727\/revisions"}],"predecessor-version":[{"id":1733,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/posts\/1727\/revisions\/1733"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/media\/1728"}],"wp:attachment":[{"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/categories?post=1727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nguyot.fr\/index.php\/wp-json\/wp\/v2\/tags?post=1727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}