返回博客列表Next.js
Next.js 13 App Router 完全指南
#Next.js#React#Web Development
深入了解 Next.js 13 的新特性和 App Router 的使用方法
Next.js 13 App Router 完全指南
Next.js 13 引入了一个全新的 App Router,这是一个基于文件系统的路由系统,提供了更好的性能、更简洁的代码组织和更强大的功能。
什么是 App Router?
App Router 是 Next.js 13 中的新路由系统,它位于 app 目录下。与之前的 Pages Router 相比,它有以下优势:
- 更好的性能优化
- 内置支持布局和模板
- 更简洁的代码组织
- 支持流式渲染
- 更好的 SEO 支持
基础概念
文件约定
page.tsx- 定义路由的 UIlayout.tsx- 定义多个页面的共享 UIloading.tsx- 定义加载状态的 UIerror.tsx- 定义错误边界的 UInot-found.tsx- 定义 404 页面
路由结构
app/
├── layout.tsx // 根布局
├── page.tsx // 首页 (/)
├── about/
│ └── page.tsx // 关于页面 (/about)
└── blog/
├── page.tsx // 博客列表 (/blog)
└── [slug]/
└── page.tsx // 博客文章 (/blog/abc)
核心功能
布局系统
布局允许你在多个页面之间共享 UI:
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="zh-CN">
<body>
<Navbar />
{children}
<Footer />
</body>
</html>
)
}
数据获取
App Router 提供了多种数据获取方式:
Server Components(默认)
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 <div>{data.title}</div>
}
动态路由
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
return <article>{post.content}</article>
}
流式渲染
使用 Suspense 实现流式渲染:
import { Suspense } from 'react'
export default function Page() {
return (
<div>
<Suspense fallback={<Loading />}>
<PostContent />
</Suspense>
</div>
)
}
最佳实践
- 默认使用 Server Components - 除非需要交互,否则使用 Server Components
- 合理使用 Layout - 将共享 UI 放在布局中
- 优化数据获取 - 使用 fetch 的缓存选项
- 错误处理 - 为关键路由添加 error.tsx
- 加载状态 - 使用 loading.tsx 提供良好的用户体验
迁移指南
从 Pages Router 迁移到 App Router:
- 将
pages/目录下的文件移动到app/ - 将
_app.tsx转换为layout.tsx - 将
_document.tsx的内容移到根布局 - 更新数据获取逻辑
- 测试所有路由和功能
总结
Next.js 13 的 App Router 是一个强大的路由系统,它提供了更好的性能和开发体验。通过理解其核心概念和最佳实践,你可以构建出更快、更易维护的 Web 应用。