Next.js中的App Router与Page Router,各自的作用和使用方式,如何理解和配置使用?

App Router介绍

Next.js中的App Router是全局的路由器,它用于在应用程序的所有页面之间进行导航。它可以用于在页面之间传递状态和数据,类似于React中的Context。 App Router是通过_app.js文件中的getInitialProps方法来配置的。

在 Next.js 中,App Router 是指导整个应用程序路由行为的基本机制。它实际上是基于文件系统的路由系统,该系统会根据您项目中 pages 文件夹的结构自动生成路由。

1. 了解 App Router 工作原理

 

  1. 基于文件系统的路由:Next.js 的路由系统直接映射到您在 pages 文件夹中创建的文件和文件夹。每个文件都对应一个页面,文件路径定义了页面的 URL 路径。

  2. 约定优于配置:不需要特殊的配置文件来设置路由。按照约定,pages 文件夹中的文件和文件夹结构定义了应用程序的路由结构。

  3. 动态路由支持:Next.js 支持动态路由,您可以使用带有方括号 [] 的文件名来创建动态路由。例如,pages/post/[id].js 对应于 /post/:id 路径。

  4. 预渲染和服务端渲染:Next.js 支持静态生成、服务器端渲染和客户端渲染,根据需要对页面进行预渲染,从而实现更好的性能和 SEO。

2. 如何通过目录或配置文件设置 App Router

在 Next.js 中,您不需要特殊的配置文件来设置 App Router。它是基于文件系统的,所以您只需在 pages 文件夹中按照惯例组织您的文件即可。但是,您可以使用特殊的文件名来创建一些特定的路由。

  • _app.js:全局性的应用程序组件,可以进行一些全局配置和设置,如上一个回答中所提及的。

在 Next.js 中,_app.js 是一个特殊的文件,用于对应用程序进行自定义配置和包装。如果您使用的是函数式组件,可以通过自定义 _app.js 文件来配置全局性的内容,例如添加布局、引入全局 CSS 样式、设置全局数据获取等。

以下是一个使用函数式组件的 _app.js 的示例,展示了一些最佳的自定义配置建议:

// _app.js
import '../styles/globals.css'; // 引入全局样式
import { Provider } from 'react-redux';
import { store } from '../store/store'; // 导入 Redux Store
import Layout from '../components/Layout'; // 引入全局布局组件
import { useEffect } from 'react';
import { useRouter } from 'next/router';

function MyApp({ Component, pageProps }) {
  const router = useRouter();

  useEffect(() => {
    // 在页面切换时执行一些全局操作
    const handleRouteChange = (url) => {
      // 每次页面切换时执行的操作
      console.log('路由变化:', url);
    };

    router.events.on('routeChangeComplete', handleRouteChange);

    return () => {
      router.events.off('routeChangeComplete', handleRouteChange);
    };
  }, [router.events]);

  return (
    <Provider store={store}>
      <Layout>
        {/* 将每个页面组件作为 Component 属性传递 */}
        <Component {...pageProps} />
      </Layout>
    </Provider>
  );
}

export default MyApp;

配置建议解释:

  1. 全局样式

    _app.js 中引入全局 CSS 样式,这样它们将应用于整个应用程序。
  2. Redux Provider

    使用 Provider 包裹整个应用程序,使得所有页面都可以访问到 Redux 的状态。
  3. 全局布局组件

    _app.js 中使用 Layout 组件包裹所有页面组件,确保每个页面都共享同样的布局。
  4. 页面切换监听

    使用 useRouter 钩子监听页面切换事件,可以在页面切换时执行一些全局操作,例如记录路由变化。

 

  • _document.js:用于自定义整个页面的文档结构(如 HTML、Head 等)。

  • _error.js:用于自定义错误页面。

3. 通过目录结构设置路由

假设您的 Next.js 项目目录结构如下:

- pages/
  - index.js
  - about/
    - index.js
  - posts/
    - [id].js

在这个例子中:

  • pages/index.js 对应于应用程序的根路径 /
  • pages/about/index.js 对应于 /about 路径。
  • pages/posts/[id].js 对应于 /posts/:id 动态路径。

通过这种文件夹结构,您可以轻松地组织和管理应用程序的不同页面,并使其对应到相应的 URL 路径。

注意事项:

  • 避免在 pages 目录下创建具有重复文件名的文件或目录,因为这可能会导致路由冲突。
  • 使用文件和文件夹的名称来定义路由,但可以通过文件内的内容来定义页面的行为和展示。

Page Router 介绍

Page Router 是指应用程序中负责管理页面路由的部分。它与 App Router 相关联,但主要涉及到单个页面的路由和导航。它在每个页面中使用next/router模块进行配置和使用。Page Router 是基于文件系统的,主要依赖于 pages 文件夹中的文件和文件夹结构。但是,您可以使用一些特殊的文件和文件夹命名约定来定义特定的页面路由,通过页面的文件名和目录结构来设置。例如,pages/about.js可以通过/about路由进行访问。同时,您也可以在页面组件内部使用动态路由参数来处理特定的路径。

1. 了解Page Router 的工作原理:

  1. 基于文件系统的路由

    • 页面路由在 Next.js 中是基于文件系统的。
    • 每个页面都对应 pages 文件夹中的一个文件。文件的路径决定了页面的 URL 路径。
  2. 文件命名约定

    • 文件名决定了页面的路径。例如,pages/index.js 对应于应用程序的根路径 /
    • 通过文件夹和文件的命名和组织,可以建立不同页面之间的路由关系。
  3. 动态路由

    • Next.js 支持动态路由,您可以使用 [] 括号来创建动态路由。
    • 例如,pages/post/[id].js 对应于 /post/:id 动态路径。这使得您可以在同一个页面处理多个不同参数的请求。
  4. 页面导航

    • 使用 <Link> 组件或 next/router 中的导航方法(例如 router.push()router.replace() 等)进行页面间的导航。

页面加载

Next.js 的页面路由不仅提供了客户端路由(在浏览器中进行导航),还支持服务器端渲染和静态页面生成。

  • 服务器端渲染 (SSR):根据用户的请求,服务器动态地生成页面的 HTML 内容,然后将其发送给客户端。
  • 静态页面生成 (SSG):在构建时预先生成页面,并将生成的 HTML 文件存储在服务器上,使得访问页面时可以直接提供静态内容,提高性能和 SEO。

2. 通过路径设置 Page Router:

在 Next.js 中,没有专门的配置文件来设置页面路由。路由主要依赖于文件和文件夹的组织结构。但是,您可以使用以下方式进行一些定制:

  1. 基本的文件命名规则

    • pages 文件夹中创建文件来定义页面,文件路径决定了页面的路由路径。
    • 例如,pages/index.js 对应于根路径 /pages/about.js 对应于 /about 路径。
  2. 动态路由

    • 使用 [] 方括号来创建动态路由,以处理带有可变参数的路径。
    • 例如,pages/posts/[id].js 对应于 /posts/:id 动态路径。
  3. 自定义页面的路径

    • 您可以通过更改文件系统中的 pages 文件夹的结构来定义页面的路径。
    • 例如,通过创建 pages/blog/[slug].js 文件来定义 /blog/:slug 路径下的页面。
  4. 使用特殊文件

    • 有一些特殊的文件名(以 _ 开头)可以用来定义特殊页面,如 _app.js_document.js_error.js
    • 例如,_app.js 用于自定义应用程序的外部样式和全局布局,_document.js 用于自定义整个页面的文档结构。
  5. 动态路由参数

    • 在页面组件中,您可以使用 next/router 中的 useRouter 钩子来访问路由对象,处理动态路径参数,并根据参数来渲染页面内容。

App Router 与Page Router之间的选择

在 Next.js 中,App Router 和 Page Router 都是路由系统的组成部分,但它们具有不同的作用和职责。选择和配置使用 App Router 和 Page Router 的准则通常取决于以下考虑因素:

App Router

  1. 全局性配置:App Router 位于 _app.js 中,用于管理整个应用程序的全局配置和布局,如设置全局样式、元数据、错误处理和页面间共享的布局组件等。

  2. 页面间共享逻辑:App Router 适合用于包装整个应用程序的顶级组件,它可以定义页面间共享的逻辑、布局和数据获取方法。

  3. 全局性路由操作:App Router 通常用于监听全局的路由变化,进行全局性的路由操作和错误处理,比如处理每次页面切换时的特殊逻辑或加载动画。

Page Router

  1. 单个页面的导航和渲染:Page Router 是 Next.js 中每个页面的路由定义,基于文件系统的结构,每个文件对应一个页面。

  2. 页面级别的路由逻辑:Page Router 适合用于处理特定页面的路由逻辑,包括处理页面参数、动态路由和页面内部导航等。

  3. 页面级别的特定行为:在页面级别上,您可以控制特定页面的导航、渲染和数据获取逻辑,根据需要定制页面的行为。

选择和配置的准则:

  1. 全局与局部:App Router 用于全局性配置和操作,Page Router 用于页面级别的路由操作。根据需要选择合适的上下文来定义路由逻辑。

  2. 共享和特定逻辑:如果存在多个页面共享的布局、样式或逻辑,则适合在 App Router 中定义。对于单个页面的特定路由逻辑和页面内导航,应使用 Page Router。

  3. 简单和复杂性:对于简单的页面导航和全局性配置,可以使用 App Router 简化操作。对于复杂的页面路由逻辑和特定页面行为,使用 Page Router 更为灵活。

  4. 按需选择:根据项目的实际需求,灵活选择使用 App Router 和 Page Router。有些情况下,两者可能会有一定重叠,但通常用于不同的目的。

 Next.js中参考目录结构(启用src目录):

- public
- src/
  - pages/    
    - index.js
    - about/
      - index.js
    ...
  - components/
    - Header.js
    - Footer.js
    ...
  - utils/
    - api.js
    ...
  - styles/
    - globals.css
    - globals.js
    ...
  - api/
    - users.js
    - posts.js
    ...
  - store/
    - actions/
      - actionTypes.js
      - exampleActions.js
    - reducers/
      - rootReducer.js
      - exampleReducer.js
    - store.js

- next.config.js
- package.json
...

 说明:

  1. components 目录

    存放应用程序的可重用组件,可以在多个页面中使用,有助于避免重复代码。
  2. pages 目录

    包含了应用程序的页面文件,每个文件对应一个页面路由。符合 Next.js 的约定。
  3. api 目录

    包含与后端 API 交互的代码文件,通常使用函数封装 API 请求。例如,users.jsposts.js 可以包含用户和帖子相关的 API 请求。
  4. styles 目录

    存放全局样式文件和组件特定的样式文件,如 globals.css 和其他全局性样式文件。
  5. store 目录(如果使用 Redux 或其他状态管理器):

    包含了状态管理相关的文件,如 actions、reducers 和 store 的配置。这些文件用于管理应用程序的状态。
  6. utils 目录

    存放通用的辅助函数或工具函数,用于整个应用程序中的工具性操作。

注意事项:

  • 模块化开发:将代码模块化组织,使其易于理解、测试和维护。
  • 命名和注释:使用清晰的命名和必要的注释,使得代码更易于理解。
  • 根据项目需求定制:以上结构是一种常见的推荐方式,但根据具体项目的需求和团队约定,您可以根据实际情况进行适当调整。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/238972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“产学研用”深度融合,校企合作助力烟花产业数字化发展

为推动烟花行业数字化转型升级&#xff0c;充分发挥科教资源优势&#xff0c;技术成果及创新资源&#xff0c;推动构建产学研用高效协同&#xff0c;加快提升烟花产业创新能力&#xff0c;助力企业在国内外复杂的市场环境下提升发展能力及竞争能力。12月6日&#xff0c;烟花生产…

机器学习-KL散度的直观理解+代码

KL散度 直观理解&#xff1a;KL散度是一种衡量两个分布之间匹配程度的方法。通常在概率和统计中&#xff0c;我们会用更简单的近似分布来代替观察到的数据或复杂的分布&#xff0c;KL散度帮我们衡量在选择近似值时损失了多少信息。 在信息论或概率论中&#xff0c;KL散度&#…

Python实战 | 如何抓取腾讯视频

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 爬虫: 作用: 批量采集数据 / 模拟用户行为 原理: 模拟成 客户端 向 服务器 发送网络请求 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: reques…

鸿蒙Stage模型开发—创建你的第一个ArkTS应用

Stage模型开发概述 基本概念 下图展示了Stage模型中的基本概念。 图1 Stage模型概念图 UIAbility组件和ExtensionAbility组件 Stage模型提供UIAbility和ExtensionAbility两种类型的组件&#xff0c;这两种组件都有具体的类承载&#xff0c;支持面向对象的开发方式。UIAbility…

数字化转型:无形资产占比测算数据集(2007-2022年)

参考张永珅老师的做法&#xff0c;利用无形资产占比测算数字化转型程度。希望对大家有所帮助 一、数据介绍 数据名称&#xff1a;数字化转型&#xff1a;无形资产占比 数据年份&#xff1a;2007-2022年 样本数量&#xff1a;37649条 数据说明&#xff1a;包括数字化资产明细…

漏洞复现-某友UFIDA NC系统某接口未授权访问漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

玩家不爱打丧尸后,游戏策划们卷起了编鬼故事

​全球毁灭&#xff0c;病毒入侵。躲避丧尸&#xff0c;收集物资&#xff0c;打造专属的避难所&#xff0c;一步步在混乱的末世中生存下来。 作为开放世界游戏里最经典的赛道&#xff0c;末日题材时至今日仍旧饱受广大玩家的喜爱。玩家在生存压力的刺激下&#xff0c;想方设法…

创建第一个Vue2项目-----HelloWorld

创建第一个Vue项目 第一步先去安装Vue&#xff0c;一共有两种安装方式&#xff0c;这里使用 点击这里下载&#xff1a;Vue.js 添加到自己的项目中 在使用的页面引入<script src"../js/vue.js"></script> 2. 准备好一个容器 <div id"root&qu…

自定义Taro的navBar 组件

由于业务特定&#xff0c;头部的内容会不大相同 下面是自定义的navBar 组件 首先在index.config.ts 文件中 将navigationStyle设置‘custom’&#xff0c;这样头部自带的内容就不会存在 &#xff0c;自定义navBar 这里自定义了一个计算不同设备头部胶囊的高度hook-useCustomNa…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

物联网终端设备众多,为何遥测终端机备受瞩目?

遥测终端机是一种用于数据采集、远程传输、数据存储与处理的综合体设备&#xff0c;已逐渐成为现代智能物联领域的焦点。遥测终端机集成了多种传感器与通信模块&#xff0c;能够实时采集各种环境参数&#xff0c;如温度、湿度、压力、流量等&#xff0c;同时支持无线通信&#…

9.9万做直升机产权项目合伙人 | 新机遇,共享千亿财富

你曾想过能开直升机&#xff1f;甚至想拥有一架直升机&#xff1f;那种飞跃人生的心境&#xff0c;翱翔蓝天白云。可面临居多疑问&#xff0c;比如&#xff1a;学开直升机需要怎样的条件&#xff08;年龄、学历、费用、学习内容及周期等&#xff09;?到哪里学/买直升机比较安全…

高通平台开发系列讲解(USB篇)MBIM 调试记录

文章目录 一、MBIM网卡显示二、未插入SIM卡情况显示三、SIM 无服务四、正常五、抓取QXDM log 分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍MBIM网卡调试过程的记录。 一、MBIM网卡显示 若显示黄标,则检查mbimd进程是否正常,mbim驱动是否正常。 二…

【深度学习】注意力机制(四)

本文介绍一些注意力机制的实现&#xff0c;包括VIP/CoAtNet/Scaling Local Self-Attention/PSA/CoT。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;二&#xff09; 【深度学习】注意力机制&#xff08;三&#xff09; 【深度学习…

scala集合_数组_元组_映射_列表

数组元组映射列表 1.11 集合&#xff08;scala.collection&#xff09; 集合是一种用来存储各种对象和数据的容器。Scala 集合分为可变的和不可变的集合。 1. 不可变集合可以安全的并发访问。 2. 可变集合可以在适当的地方被更新或扩展。这意味着你可以修改&#xff0c;添加…

云计算在数字营销中的作用是什么?

营销策略和云计算是一个为企业提供多种优势的系统。它使他们能够取得更大的成功&#xff0c;同时提高产量。这样做的原因是&#xff0c;可以从任何位置远程使用云集成工具和应用程序。基本上&#xff0c;该系统增强了存储设备和传播。同时&#xff0c;它减轻了公司 IT 网络的压…

《Effective C++》学习笔记

条款01&#xff1a;把 C 看成一个语言联邦 C由几个重要的次语言构成 C语言&#xff1a;区块&#xff0c;语句&#xff0c;预处理器&#xff0c;数组&#xff0c;指针等等。 类&#xff1a;class&#xff0c;封装&#xff0c;继承&#xff0c;多态......&#xff08;动态绑定等…

MyBatis-Plus - 论自定义 BaseMapper 方法『逻辑删』失效解决方案

问题描述 在上一篇我们讲过 MyBatis-Plus - 论 1 个实体类被 N 个DAO 类绑定&#xff0c;导致 MP 特性&#xff08;逻辑删&#xff09;失效的解决方案-CSDN博客 所以在这个基础上&#xff0c;我们可以很好定位到源码的分析位置。 但是今天这个问题就更奇怪了&#xff0c;已经…

apt-get update失败

一、先验证是否有网络 rootlocalhost:~# ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolution rootlocalhost:~# 说明没有网&#xff0c;参考&#xff1a;https://blog.csdn.net/qq_43445867/article/details/132384031 sudo vim /etc/resolv.con…
最新文章