Topics

Next.js Pages Router et App Router : Clarification des différences souvent source de confusion

  • column

Next.js, un framework de développement web populaire, a introduit le nouveau App Router comme système de routage par défaut dans sa version 13.

Je suis sûr que certaines personnes travaillant sur des projets utilisant à la fois Pages Router et App Router ne savent pas quelle méthode utiliser. C'est mon cas !

Il existe notamment des différences importantes entre le routeur de pages et le routeur d'applications dans des domaines qui touchent au cœur du développement d'applications, comme la définition des routes en fonction de la structure des fichiers, la gestion des parties dynamiques des URL, le fonctionnement du rendu et la récupération des données à partir des API.

Pour me concentrer sur les points « souvent confondus », voici un bref rappel des principales différences entre Pages Router et App Router !

Différences dans le routage des fichiers

Pages Router : La simplicité de la conversion des noms de fichiers en chemins d’accès

Placé dans le répertoire des pages.js, .jsx, .ts, .tsxC'est aussi simple que le nom du fichier qui devient le chemin d'accès à l'URL.

exemple:src/page/about.tsx⇒ Le routage est/aboutCe sera.

Routeur d'applications : Organisation par dossier et nom de fichier spécifique

Routeur d'applicationssrc/appVous pouvez créer un routage en plaçant des dossiers et des fichiers en dessous.

Toutefois, si vous ajoutez un nom de fichier spécifique appelé « page » au nom de fichier utilisé pour le routage, il sera traité comme le contenu de la page correspondant à ce chemin.

exemple:src/app/about/page.tsx⇒ Le routage est/aboutCe sera.

Fichiers spéciaux qui caractérisent App Router

Outre le fichier page.tsx, App Router contient d'autres fichiers importants.

app/
├── page.tsx --> Contenu de la page. C'est le fichier que vous utiliserez le plus souvent.

├── route.tsx --> Définition de l'API (ne peut pas coexister avec page.js).

├── layout.tsx --> Apparence générale.

├── loading.tsx --> Écran de chargement.

├── error.tsx --> Écran d'erreur.

├── global-error.tsx --> Écran d'erreur global.

├── template.tsx --> Apparence générale (réinitialisation de la mise en page).

├── default.tsx --> Écran par défaut.

└── not-found.tsx --> Écran affiché lorsque la fonction notFound est levée.

Ce qui m'a personnellement surpris, c'est le fichier not-found.tsx. Il suffit de préparer cette page pour qu'elle s'affiche automatiquement lorsqu'on accède à une URL inexistante. J'ai été impressionné par sa simplicité d'implémentation.

Différences de rendu

Les composants du routeur de pages sont essentiellement conçus pour être interactifs côté client, et le rendu côté serveur est principalement effectué pour accélérer l'affichage initial et à des fins de référencement (SEO).useState ou useEffectVous pouvez utiliser librement des Hooks React comme ceux-ci dans votre composant de page et ses composants enfants.

En revanche, App Routerapp/Les composants dansSauf indication contraire, il sera traité par défaut comme un composant serveur..DoncuseState ou useEffect tel queLes hooks React ne sont pas disponiblesActions côté client, telles que onClickLes gestionnaires d'événements ne sont pas disponibles non plus.

Donc, pour créer une CSR à l'aide d'App Router,use clientÉcrire:

use client

Composant serveur et composant clientDéclarer les limitesest.use clientSi vous le déclarez, non seulement ce composant, mais aussi toutes ses importations seront considérés comme des composants clients.

Routage dynamique [○○]

Next.js fournit un mécanisme permettant de gérer les « URL dynamiques », où une partie de l'URL change en fonction de l'utilisateur ou du contenu, comme par exemple les pages de détails d'articles de blog ou d'actualités.Routage dynamiqueest.

Par exemple, supposons qu'il existe un lien qui vous amène à l'article A et à l'article B.

Par exemple, une capture d'écran d'une page contenant des liens vers l'article A et l'article B.
import Link from "next/link";
const linkStyle=`ext-lg font-bold border-b border-primary px-1`

export default function page() {
  return (
    <div>
      <div className="flex gap-6">
        <Link href="/post/A" className={linkStyle}>記事Aへのリンク</Link>
        <Link href="/post/B" className={linkStyle}>記事Bへのリンク</Link>
      </div>
    </div>
  );
}

Destinations liées

Capture d'un article/d'une page
Capture de la page post/B

Si vous souhaitez utiliser le routage dynamique,[slug]Si vous créez un fichier appelépost/Amaispost/BMais vous pouvez utiliser le même modèle.
*La dénomination entre crochets [ ] est facultative.slugCe n'est pas forcément le cas.

Routeur d'applications

/app/post/[slug]/page.tsx

export default aysinc function PostPage({ params }: { params: Promise<{ slug: string }>) {
  const {slug}= await params;
  return (
    <div>
      <h1>記事: {slug}</h1>
    </div>
  );
}

paramsNous utilisons.params.slugvers l'URL[slug]La pièce sera incluse.

paramsAuparavant, l'acquisition des paramètres n'avait pas besoin d'être asynchrone, mais à partir de Next.js 15, elle est devenue asynchrone.propsIl semble que vous deviez le définir comme un type Promise.

Pour les pages Rouer

/pages/post/[slug].tsx


import { useRouter } from 'next/router';

export default function PostPage() {
  const router = useRouter();
  const { slug } = router.query;

  return (
    <div>
      <h1>記事: {slug}</h1>
    </div>
  );
}

useRouterNous utilisons.router.query.slugvers l'URL[slug]La valeur de la pièce sera saisie.

méthode d'acquisition de données API

microCMS, qui est largement présenté dans cette chronique Liberogic, fonctionne bien avec des frameworks comme Next.js.

Routeur d'applications

Faites simplefetchouaysnc awaitVous pouvez utiliser

cependant,use clientLe fichier qui contient cette déclaration deviendra un CSR.aysnc awaitne sera plus utilisable !


async function getPost() {
  const res = await fetch(`https://.../api/data/`);

  // エラーハンドリング例
  if (!res.ok) {
     throw new Error(`Failed to fetch post: ${res.status}`);
  }

  return res.json();
}

Callee

export default function Example() {
   const data = await getPost()
   // ... data を使って表示 ...
}

Pour les pages du routeur

getStaticPropsLes données obtenues à l'aide depropsau composant de page.


export async function getServerSideProps(context) {
  // context.req, context.res などにアクセス可能
  const res = await fetch(`https://.../api/data/`, {
     headers: { Cookie: context.req.headers.cookie } // 例: Cookieを渡す
  });
  const data = await res.json();

  return {
    props: {
      data,
    },
  };
}

Callee

export default function Example({ data }) {
  // ... data を使って表示 ...
}

Comprenez les deux routeurs et maîtrisez Next.js !

Dans mon cas, le premier projet pour lequel j'ai utilisé Next.js était App Router.

Plus tard, alors que je travaillais sur un autre projet et que j'utilisais Pages Router, je me suis demandé : « Lors de la création d'une nouvelle page, le nom du fichier doit-il être index.tsx ou page.tsx ? »

Cet article ne couvre qu'une petite partie de Next.js, mais en examinant les différences entre App Router et Pages Router, j'ai pu me faire une idée plus claire de son fonctionnement.

Personnellement, j'apprécie la facilité avec laquelle on peut écrire des App Routers, mais j'aimerais aussi pouvoir gérer des projets Pages Router.

L'idéal serait d'acquérir une compréhension plus approfondie de Next.js et de pouvoir utiliser différents routeurs en fonction du projet ou du travail !

Écrit par

Je fais du développement front-end avec JavaScript, React et Next.js, en me concentrant sur le balisage. Je suis ravi lorsqu'un site sur lequel j'ai travaillé est publié avec succès ! Mon passe-temps est la guitare. J'aime autant écrire que jouer du code !

Hiratchi

Développeur front-end / Arrivé en 2022

Consultez l'article de ce membre du personnel

Nous sommes fiers de la fiabilité de notre équipe et de notre réactivité.

Chez Liberogic, notre personnel expérimenté fait avancer les projets de manière proactive, ce qui explique pourquoi nous sommes très appréciés de nos clients.
Nous veillons à ce que les chefs de projet et les directeurs soient correctement désignés afin de garantir le bon déroulement de l'ensemble du projet. Nous prévenons les dépassements de coûts liés aux engagements initiaux et allouons les ressources aux personnes compétentes aux postes appropriés. Notre capacité à appréhender rapidement les enjeux du projet, à établir et à soumettre des devis est reconnue.

Veuillez noter que nous ne participons pas activement à des travaux sur site de type SES.

Nous prenons en charge la quasi-totalité des principaux outils de gestion de projet et de messagerie instantanée, notamment Slack, Teams, Redmine, Backlog, Asana, Jira, Notion, Google Workspace, Zoom et Webex.

Dans les projets de grande envergure utilisant des SES et des technologies offshoreAvez-vous des problèmes techniques ou des inquiétudes quant à la manière de les résoudre ?

Étude de cas