App Router 和 Pages Router 怎么看
很多 Next 文档最容易让人混乱的地方,不是 API,而是两套路由系统并存。
当前可以这样理解:
Pages Router:旧主线,成熟、稳定、存量项目非常多App Router:当前主线,围绕 Server Components、布局复用、缓存和流式渲染重建了一套模型
这两套不是谁“彻底不能用”,而是侧重点已经明显不同。
Pages Router 是什么
Pages Router 就是大家更熟悉的这一套:
pages/index.tsxpages/posts/[id].tsxgetStaticPropsgetServerSidePropspages/api/*
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: { posts },
};
}
它的优点很明确:
- 心智模型简单
- React 团队容易上手
- 大量历史资料和实践都围绕这套写法
App Router 是什么
App Router 对应 app/ 目录。它不是把原路由系统改个壳,而是把几个基础能力一起重写了:
- 布局是一级能力
- Server Component 是默认状态
- 数据获取和页面渲染更紧密
- 缓存、重验证、流式渲染都是内建模型的一部分
export default async function Page() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return <PostList posts={posts} />;
}
两套最大的差异不在“文件名”,而在心智模型
Pages Router 的核心问题
- 页面在哪
- 这个页面用 SSG、SSR 还是 CSR
- 数据通过哪个生命周期函数拿
App Router 的核心问题
- 这个路由段的布局怎么组织
- 这段 UI 该在服务端还是客户端执行
- 这段数据该缓存多久,怎么失效
- 是否需要流式渲染
所以 App Router 并不只是新语法,而是问题意识变了。
一张表看差异
| 维度 | Pages Router | App Router |
|---|---|---|
| 目录入口 | pages/ | app/ |
| 页面主文件 | pages/*.tsx | page.tsx |
| 共享布局 | _app.tsx / 组件拼装 | layout.tsx |
| 数据获取 | getStaticProps / getServerSideProps | 组件里直接 fetch |
| 组件默认位置 | 客户端 React 组件 | Server Component 默认 |
| API 层 | pages/api/* | route.ts |
| 缓存模型 | 较少显式暴露 | 缓存与重验证是核心模型 |
| 推荐定位 | 存量维护、渐进迁移 | 新项目主线 |
什么时候还会继续用 Pages Router
这些场景很常见:
- 老项目已经稳定跑了多年
- 团队对
getServerSideProps很熟 - 迁移成本大于短期收益
- 项目不打算引入 Server Components 和新的缓存模型
这类项目继续维护 Pages Router 完全正常。
什么时候更适合 App Router
更适合这些场景:
- 新项目
- 需要更细的布局复用
- 想减少客户端 JS
- 需要把服务端数据获取和页面渲染贴得更近
- 准备接受新一代缓存和重验证模型
两套能不能并存
可以。
官方就支持在一个项目里同时存在 app/ 和 pages/。迁移时很常见的做法是:
- 新页面走
app/ - 旧页面先留在
pages/ - 公共组件和公共逻辑抽到共享目录
迁移时最容易误判的地方
1. 以为 App Router 只是换了目录
其实不是 。Server / Client 边界、缓存、布局、错误处理、路由段行为都会一起变化。
2. 以为所有页面都应该立刻迁完
现实项目里,分批迁移通常更稳。
3. 以为有 App Router 就完全不需要了解 Pages Router
也不对。只要会接存量项目,Pages Router 依然是基础能力。
推荐做法
如果现在开始补 Next 基础,比较稳的顺序通常是:
- 先理解 Pages Router 基本模型
- 再理解 App Router 为什么重新设计
- 最后看迁移、缓存和 Server Actions
这样更容易把新旧经验接起来。