Skip to content

Next.js路由:App Router与Pages Router对比

引言

Next.js提供两种路由系统:App Router(应用路由)Pages Router(页面路由)。本文将通过核心差异分析、性能对比和使用场景实践,帮助你理解两种路由模型的本质区别及其适用场景。

核心差异总览

特性App RouterPages Router
路由类型服务端为中心客户端为中心
默认组件类型服务端组件客户端组件
路由定义使用嵌套文件夹定义路由结构文件直接对应路由路径
布局系统支持嵌套/动态布局布局静态定义
数据获取方式fetch函数 + React扩展getServerSideProps等专用方法
动态路由语法不同但支持原生支持
优先级高于Pages RouterApp Router未匹配时作为回退
SEO优化默认服务端渲染需手动配置服务端渲染

版本兼容性提醒

Next.js v13.4+ 开始正式推荐使用App Router作为新项目的首选方案

详细功能对比

1. 路由定义方式

  • App Router
    使用文件夹结构隐式创建路由,例如:

    /app/
    ├── dashboard/
    │   └── page.tsx  → /dashboard
    └── settings/
        └── page.tsx  → /settings

    支持嵌套和分组路由,文件组织更灵活

  • Pages Router
    遵循"文件即路由"原则:

    jsx
    // pages/about.js → 对应路由 /about
    export default function About() {
      return <div>关于我们</div>
    }

    目录结构直接映射URL路径

2. 数据获取机制

jsx
// App Router 示例
async function getData() {
  const res = await fetch('https://api.example.com/data')
  return res.json()
}

export default async function Page() {
  const data = await getData()
  return <main>{data.content}</main>
}
jsx
// Pages Router 示例
export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data')
  const data = await res.json()
  return { props: { data } }
}

export default function Page({ data }) {
  return <div>{data.content}</div>
}

注意数据获取差异

App Router直接在组件中使用标准fetch,而Pages Router需要特定的数据获取函数(getServerSideProps、getStaticProps等)

3. 布局系统实现

App Router支持渐进式布局嵌套

jsx
// app/dashboard/layout.js
export default function DashboardLayout({ children }) {
  return (
    <section>
      <DashboardNav />
      {children}
    </section>
  )
}

Pages Router需手动实现布局传递

jsx
// components/MainLayout.js
export default function MainLayout({ children }) {
  return (
    <div>
      <Header />
      <main>{children}</main>
      <Footer />
    </div>
  )
}

// 每个页面都需要显式包裹
export default function HomePage() {
  return (
    <MainLayout>
      <HomeContent />
    </MainLayout>
  )
}

4. 核心架构差异

架构维度App RouterPages Router
渲染方式默认服务端渲染 + 流式传输客户端渲染(CSR)为主
组件模型支持React Server Components(RSC)纯客户端组件
学习曲线较高(需掌握RSC概念)较低
新功能支持支持服务端动作/元数据API等新特性

性能与SEO对比

性能表现

  1. 首屏加载速度

    • App Router:通过服务端组件实现HTML直接输出,首屏加载更快
    • Pages Router:需加载JS后渲染内容,存在白屏时间
  2. 资源优化

  3. 数据吞吐效率

    • App Router:组件级数据获取,无效数据不阻塞页面
    • Pages Router:整页数据就绪后才渲染内容

SEO优化能力

优化维度App RouterPages Router
默认渲染方式SSRCSR
元数据管理内置API需next/head
静态生成支持支持
动态内容索引更优需额外配置

SEO建议

内容密集型网站(如博客/电商)优选App Router,其默认SSR特性更利于搜索引擎爬取

使用场景决策指南

✅ 推荐使用App Router

  1. 全新项目(优先获得最新功能)
  2. 高内容时效性需求(新闻/实时数据)
  3. 复杂布局系统(多级嵌套/动态布局)
  4. 需要增量静态再生(ISR)功能
  5. 多媒体网站(流式传输优化体验)

⚠️ 可考虑Pages Router

  1. 现有项目迁移成本过高时
  2. 纯静态站点(SSG)需求简单时
  3. 需要短期快速原型验证
  4. 团队熟悉传统React开发模式

升级迁移路径

迁移须知

  1. 二者可在同一项目中并存(优先匹配App Router)
  2. 公共组件需调整为"use client"标记
  3. 数据获取方式需要重构
  4. 建议通过官方向导工具(next migrate)操作

结论与最佳实践

决策要素建议方案
新项目开始首选App Router
复杂应用开发强烈推荐App Router
简单静态站点Pages Router足够
现有项目维护逐步迁移
需要前沿功能App Router独占

最终建议

2025年起启动的项目应优先使用App Router,它代表了Next.js的未来发展方向,虽然学习曲线较陡峭,但通过:

  1. 逐步掌握服务端组件概念
  2. 实践流式传输和服务器操作
  3. 利用嵌套布局优化代码结构 您将获得更优性能体验和开发效率

官方数据显示App Router在TTFB(首字节时间)上平均比Pages Router快27%,在FCP(首次内容渲染)上性能提升63%