渲染模式
Next.js 支持多种渲染策略,可以针对不同页面选择最合适的方式。
Server Components(服务端组件)
App Router 中的组件默认为 Server Components:
// 这是一个 Server Component(默认)
async function PostList() {
const posts = await fetch('https://api.example.com/posts')
const data = await posts.json()
return (
<ul>
{data.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)
}
优势:
- 直接在服务端获取数据,减少客户端 JavaScript
- 可以直接访问数据库、文件系统等后端资源
- 敏感信息(API 密钥等)不会泄露到客户端
Client Components(客户端组件)
需要交互或浏览器 API 时使用 'use client' 指令:
'use client'
import { useState } from 'react'
export default function Counter() {
const [count, setCount] = useState(0)
return (
<button onClick={() => setCount(count + 1)}>
计数:{count}
</button>
)
}
Static Generation(静态生成)
在构建时生成 HTML:
// 构建时生成所有文章路径
export async function generateStaticParams() {
const posts = await fetch('https://api.example.com/posts').then(r => r.json())
return posts.map(post => ({
slug: post.slug,
}))
}
ISR(增量静态再生)
结合静态生成和服务端渲染的优势:
async function Page() {
const data = await fetch('https://api.example.com/data', {
next: { revalidate: 60 } // 每 60 秒重新验证
})
return <div>{/* ... */}</div>
}
渲染模式选择指南
| 场景 | 推荐模式 |
|---|---|
| 静态内容(博客、文档) | SSG |
| 动态内容 + SEO | SSR |
| 不常变化的动态内容 | ISR |
| 纯交互页面(Dashboard) | CSR |