动态渲染(Server-Side Rendering,SSR)是在每次请求时在服务器渲染页面。 每个用户/每次请求都会获得最新的内容,适合需要实时数据或个性化内容的场景。
核心特性:
headers(), cookies(), searchParams使用任何一个 Dynamic API 都会自动触发动态渲染
dynamic = 'force-dynamic';在页面或布局中导出 dynamic 配置
fetch 使用 no-store 选项会触发动态渲染
标题:
动态渲染页面
描述:
这个页面每次请求都会重新渲染
渲染时间:
2025-12-27T12:37:08.638Z
✅ 每次刷新都会变化(证明每次都重新渲染)
请求计数:
222
✅ 每次刷新都是新的随机数
User-Agent:
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.c
✅ 从 headers() 获取(触发动态渲染)
pnpm build在构建日志中,这个页面会显示为:ƒ /rendering-test/dynamic
ƒ 表示动态渲染(Dynamic/SSR)
渲染时间和请求计数每次都会变化(每次都重新渲染)
每次访问页面,都会打印新的 [DYNAMIC RENDERING] 日志
右键 → 查看页面源代码,可以看到服务端渲染的完整 HTML(包括当前的时间戳)
Document 类型的请求大小通常比静态页面大(因为包含了动态数据)
// app/dashboard/page.tsx
import { cookies, headers } from 'next/headers';
// 方法 1:明确指定动态渲染
export const dynamic = 'force-dynamic';
export default async function Dashboard() {
// 方法 2:使用 Dynamic API(自动触发动态渲染)
const cookieStore = await cookies();
const headersList = await headers();
const userId = cookieStore.get('userId');
// 每次请求都执行
const userData = await fetchUserData(userId);
return (
<div>
<h1>Welcome, {userData.name}!</h1>
<UserStats data={userData} />
</div>
);
}
// 方法 3:fetch 使用 no-store
async function fetchUserData(userId) {
const res = await fetch(`https://api.example.com/users/${userId}`, {
cache: 'no-store', // 触发动态渲染
});
return res.json();
}