Logo
Published on

Next.js 入门到进阶:(七) App Router vs Pages Router

Authors
  • avatar
    Name
    xiaobai
    Twitter

如果你在 Next.js 13 之前有过开发经验,你所熟悉的可能是 pages 目录。本系列教程全面拥抱了新的 App Router,但了解它与旧的 Pages Router 的区别,对于理解 Next.js 的演进和做出技术选型至关重要。

核心理念差异

  • Pages Router: 以页面为中心。每个文件都是一个独立的页面,拥有自己的数据获取方法 (getServerSideProps, getStaticProps)。路由之间的共享布局需要通过自定义的 _app.tsx_document.tsx 文件来实现,相对繁琐。

  • App Router: 以组件布局为中心。引入了 React Server Components (RSC) 的概念,默认所有组件都是在服务端渲染的。它天生支持嵌套布局和流式渲染 (Streaming),让构建复杂的用户界面变得更加容易和高效。

主要特性对比

特性Pages Router (pages 目录)App Router (app 目录)
路由文件pages/about.tsx 创建 /aboutapp/about/page.tsx 创建 /about
布局通过 _app.tsx 和组件嵌套实现,比较受限内置支持,通过 layout.tsx 文件实现嵌套布局
组件模型只有客户端组件服务端组件 (默认) + 客户端组件 ('use client')
数据获取页面级数据获取: getServerSideProps, getStaticProps组件级数据获取: 直接在 async 组件中使用 fetch
API 路由pages/api/hello.tsapp/api/hello/route.ts
渲染SSG, SSR, CSRSSG, SSR, CSR, ISR, 流式渲染 (Streaming)
代码分割基于页面自动分割基于路由段 (segment) 自动分割
特殊文件_app.tsx, _document.tsx, _error.tsxlayout.tsx, page.tsx, loading.tsx, error.tsx, template.tsx, not-found.tsx

App Router 的关键优势

1. 嵌套布局 (Nested Layouts)

在 App Router 中,你可以轻松地为一组页面创建共享的 UI。例如,app/dashboard/layout.tsx 会自动应用到所有以 /dashboard/ 开头的路由,如 /dashboard/settings/dashboard/profile。更棒的是,在这些页面之间切换时,布局本身不会重新渲染,只有页面的内容会更新,这极大地提升了性能和用户体验。

2. 服务端组件 (Server Components)

这是 App Router 最具革命性的特性。

  • 直接访问后端资源: 服务端组件可以直接访问数据库、文件系统或内部 API,无需额外创建 API 层。
  • 减少客户端包体积: 大量的依赖库(如日期处理、Markdown 解析库)可以只保留在服务端,不会被打包进客户端的 JavaScript 文件中。
  • 安全性: 敏感数据和逻辑(如 API 密钥)可以安全地保留在服务端,不会泄露到浏览器。
  • 更好的性能: 组件在服务端渲染成 HTML,浏览器只需进行绘制,首屏加载速度更快。

3. 流式渲染 (Streaming) 与 Suspense

App Router 与 React Suspense 深度集成,支持流式渲染。这意味着你可以将页面的 UI 分成多个块,服务器会按块的渲染顺序,逐步将它们发送到浏览器。

用户可以先看到页面的整体布局和已经渲染好的部分(如骨架屏 loading.tsx),而无需等待整个页面的数据都加载完毕。这显著改善了感知性能,尤其对于数据依赖复杂的页面。

4. 简化的数据获取

如前一章所述,数据获取变得异常简单。不再需要区分 getServerSidePropsgetStaticProps,只需在服务端组件中 async/await fetch 即可。通过 fetch 的缓存和 revalidate 选项,可以灵活地控制页面的渲染策略(SSG, SSR, ISR)。

何时选择 Pages Router?

尽管 App Router 是未来的方向,但在某些情况下,Pages Router 仍然是一个可行的选择:

  • 现有项目: 对于已经使用 Pages Router 构建的大型成熟项目,立即迁移的成本可能很高。Next.js 允许在同一个项目中同时使用两种路由,可以进行渐进式迁移。
  • 生态系统兼容性: 某些依赖于旧有 Next.js 行为的第三方库可能尚未完全适配 App Router。

总结

App Router 是 Next.js 团队对现代 Web 开发深思熟虑后的结果。它通过引入服务端组件、嵌套布局、流式渲染等先进概念,解决了 Pages Router 在构建大型复杂应用时遇到的一些痛点。

对于所有新项目,强烈推荐使用 App Router。它提供了更优的性能、更好的开发体验和更强的扩展性。

本系列教程到此已涵盖了 Next.js 开发的核心概念。在最后一篇中,我们将讨论如何将你的 Next.js 应用部署到生产环境。