Next.js路由选择指南:Pages Router 与 App Router 的区别与适用场景

更新日期: 2025-11-17 阅读: 122 标签: 路由

Next.js提供了两种不同的路由方案:Pages Router和App Router。了解它们的差异和特点,可以帮助你为项目做出合适的选择。


Next.js路由基础

Next.js采用基于文件系统的路由管理方式。项目中的文件结构直接决定了网站的路由地址。

早期版本中,Next.js使用Pages Router作为默认方案。后来推出的App Router引入了新的开发模式,改变了构建页面的方法。


Pages Router:稳定可靠的传统方案

Pages Router采用直观的文件结构管理路由。项目通常包含一个pages文件夹,其中的每个文件对应一个网站页面。

例如,一个基础的项目结构可能如下:

└── pages
    ├── about.js
    ├── index.js
    └── team.js

其中,index.js对应首页,about.js对应关于页面。


Pages Router的特点

Pages Router以客户端为中心,通过特定函数引入服务端功能。数据获取通常在页面级别完成,主要依赖getStaticProps和getServerSideProps这两个函数。

页面跳转可以通过useRouter实现:

import { useRouter } from 'next/router';

function MyComponent() {
  const router = useRouter();
  
  const handleClick = () => {
    router.push('/about');
  };
  
  return (
    <button onClick={handleClick}>
      前往关于页面
    </button>
  );
}

这种方法比传统的页面跳转性能更好,因为它不会导致整个页面重新加载。


App Router:现代化的新方案

App Router采用了不同的文件组织方式:

src/
└── app
    ├── about
    │   └── page.js
    ├── globals.css
    ├── layout.js
    ├── login
    │   └── page.js
    ├── page.js 
    └── team
        └── route.js

这种结构的规则是:

  • 每个页面拥有独立的文件夹,文件夹名称决定URL路径
  • page.js文件负责渲染页面内容
  • 支持特殊功能文件,如loading.js、template.js和layout.js


App Router的核心特性

服务器组件是App Router的重要特性。默认情况下,所有组件都在服务端运行,这意味着:

  • 组件代码不会发送到客户端
  • 不能使用浏览器特有的功能
  • 需要通过“use client”指令明确标识客户端组件

布局系统是另一个亮点。通过layout.js文件,可以轻松创建共享布局:

// layout.js
export default function LoginLayout({ children }) {
  return <div className='login-area'>{children}</div>
}

这种布局会自动应用到所有子页面,无需额外配置。

数据获取方式也发生了变化,支持在组件内部直接获取数据:

async function BlogPost({ slug }) {
  const post = await fetch(`/api/posts/${slug}`).then(res => res.json());
  
  return (
    <article>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </article>
  );
}


两种路由方案对比

从功能角度来看:

Pages Router默认使用客户端组件,采用客户端优先的思路,数据获取在页面级别完成,布局需要通过特定方式实现,所有组件代码都会发送到客户端。

App Router默认使用服务端组件,采用服务端优先的思路,支持组件级数据获取,原生支持布局系统,只有客户端组件的代码会发送到浏览器。


性能表现

App Router在性能方面有明显优势。通过默认使用服务端组件,有效减少了发送到客户端的代码量,提升了页面加载速度。


学习难度和生态支持

Pages Router生态成熟,学习难度较低,特别适合有react开发经验的团队。

App Router生态正在快速发展,学习曲线较陡,需要理解服务端组件等新概念。


如何做出选择

选择App Router的情况:

  • 启动全新的项目
  • 项目对性能要求较高
  • 需要处理复杂的布局结构
  • 团队愿意学习新技术
  • 开发数据密集型的应用

选择Pages Router的情况:

  • 维护现有的Pages Router项目
  • 依赖的第三方库不支持App Router
  • 项目时间紧张,团队对新特性不熟悉
  • 开发简单的交互型应用

混合使用方案

Next.js支持在同一个项目中同时使用两种路由方案。这为项目迁移提供了便利,可以逐步将页面从pages目录转移到app目录。


迁移建议

从Pages Router迁移到App Router时,建议:

  • 采用渐进式迁移,先迁移部分页面
  • 将有交互需求的组件标记为客户端组件
  • 将页面级数据获取改为组件级
  • 利用新的布局系统优化代码结构


开发建议

使用App Router时要注意:

  • 明确区分服务端和客户端组件
  • 合理使用流式渲染提升用户体验
  • 充分利用缓存机制优化性能


总结

App Router代表了Next.js的发展方向,通过服务端组件等技术,在性能和开发体验方面都有显著提升。对于新项目,建议优先考虑App Router。对于现有项目,可以根据实际情况决定是否迁移。无论选择哪种方案,理解它们的特性和差异都能帮助你更好地进行技术决策。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/13196

vue路由history模式_如何去除vue项目中的#

在使用vue-cli搭建的环境中,浏览器上URL地址中是存在#的,这是由于vue-router 默认 hash 模式,不难发现#的出现真的很丑陋。官网给出了如何使用history模式mode: history

vue路由传参主要的3种方式

vue中路由传参主要的3种方式:query方式(push时使用path来匹配)、params模式(push时使用name来匹配)、location预声明参数模式(push使用path来匹配,但是它跟params模式不同)

vue动态加载路由_实现vue动态加载路由器设置

我们的通用的后台管理系统中,我们会根据权限的粗细不同,会对每个角色每个权限每个资源进行控制。同样的我们也需要实现一个这样的功能。 这篇文章我将主要讲vue端的实现,关于后台接口我就不会涉及,当我接触的时候我们的后台接口是springcloud实现。

两种前端路由的实现方式

前后端分离开发模式,后端会把路由控制丢在前端,这几天再开发单页面小的项目,手动撸了个路由。前端路由实现有两种方法。HTML5 History API包括2个方法:history.pushState()和history.replaceState(),和1个事件:window.onpopstate。hash + location.onhashchange

vue动态路由_vue-router通过接口请求动态生成路由的实现

在后台管理系统中,一般都会采用权限管理。路由菜单数据都会保存到数据库中,在vue-router 2.2版本新增了一个router.addRoutes(routes)方法,即可用它来实现动态路由了

HTML5 History 模式

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

vue router 路由鉴权(非动态路由)

原本想用动态路由的思路去做,按权限加载对应路由表,但是由于权限可以交叉(比如一个人可以同时是主题管理员和数据服务管理员),导致权限路由表还是得去做判断组合。于是放弃了这个思路,索性就在beforeEach里直接判断了。

vue中路由按需加载的几种方式

使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,webpack在打包的时候会把整个路由打包成一个js文件,如果页面一多,会导致这个文件非常大,加载缓慢

vue-router 中参数传递(params,query)

query和params的区别,query相当于get请求,在页面跳转的时候,可以在地址栏看到请求参数,然而params则相当于post请求,参数不会在地址栏中显示。

Node.js的路由

当服务端接收到HTTP请求时,可以通过onRequest() 获取到url, pathname,query,及paramParams参数;为了解析这些数据需要使用url和querystring模块

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!