Next.js: Next.js 16 简介
Next.js 16 是 Vercel 推出的 React 全栈框架的最新版本——它把文件系统路由、服务端渲染、静态生成、增量静态再生成和局部预渲染整合在一个开发框架中,让全栈开发变得简单。
本教程面向有 React 基础的前端开发者,从 App Router 入门讲起,直到你能用 Next.js 16 构建生产级全栈应用。
1. 你将学到
- Next.js 是什么、为什么选择它
- App Router 与 Pages Router 的历史演进
- Next.js 16 的五大新特性(Turbopack / PPR /
use cache/ React 19 / Proxy) - SSR、SSG、ISR、PPR 四代渲染策略的演进
- Next.js 与 Remix、Nuxt、Astro 的框架对比
2. 一个全栈开发者的真实故事
(1) 痛点:React SPA 项目性能瓶颈
Alice 是一家 SaaS 公司的全栈开发者,维护着一个有 50,000 日活的 React SPA 任务管理平台。最近她遇到了三个棘手问题:
| 问题 | 影响 | 数据 |
|---|---|---|
| 首屏加载慢 | 用户跳出率高 | 3.2s FCP / 6.8s LCP |
| SEO 差 | Google 无法索引动态内容 | 0 条搜索结果展示 |
| 代码复用少 | 前端/后端各写一套数据逻辑 | 40% 代码重复 |
她尝试了 React Helmet、Lazy Loading、代码分割,但 SEO 问题始终无法在纯 SPA 架构中解决。
(2) Next.js 的解法
用 Next.js 16 App Router 重写应用——Server Components 服务端渲染 + PPR 静态壳 +
use cache智能缓存。
// app/dashboard/page.tsx — Server Component 默认
export default async function DashboardPage() {
const tasks = await fetch('https://api.example.com/tasks');
const projects = await fetch('https://api.example.com/projects');
return (
<div className="grid grid-cols-2 gap-4">
<TaskSummary tasks={tasks} />
<ProjectList projects={projects} />
</div>
);
}
(3) 收益
| 指标 | 改造前(React SPA) | 改造后(Next.js 16) |
|---|---|---|
| FCP | 3.2s | 0.8s |
| LCP | 6.8s | 1.5s |
| SEO 页面数 | 0 | 200+ |
| 代码重复率 | 40% | 5% |
3. Next.js 是什么
(1) 定义
Next.js 是一个基于 React 的全栈 Web 开发框架,由 Vercel 公司于 2016 年开源。它提供了文件系统路由、服务端渲染(SSR)、静态网站生成(SSG)、API 路由等开箱即用的功能,让开发者用 React 构建全栈应用。
graph TB
A[Next.js 16] --> B[App Router<br/>文件系统路由]
A --> C[渲染引擎<br/>SSR/SSG/ISR/PPR]
A --> D[数据获取<br/>Server Components]
A --> E[API Routes<br/>Route Handlers]
A --> F[构建工具<br/>Turbopack]
A --> G[生态集成<br/>Auth/DB/Cache]
style A fill:#cce5ff
style B fill:#d4edda
style C fill:#d4edda
| 核心能力 | 说明 | 解决的问题 |
|---|---|---|
| 文件系统路由 | 文件名即 URL 路径 | 无需手动配置路由 |
| Server Components | 服务端渲染零客户端 JS | 减少 bundle 体积 |
| PPR | 静态壳 + 动态内容流式 | 兼顾 SEO 与个性化 |
| Turbopack | Rust 增量构建 | 开发服务器 10x 快 |
use cache |
组件级缓存声明式 | 细粒度缓存控制 |
(2) 为什么选择 Next.js
- 全栈一体化:前端 + API + 数据获取在一个框架内
- React 官方推荐:React 文档将 Next.js 列为推荐的框架
- Vercel 生态:部署、分析、AI 集成无缝衔接
- 大厂背书:Vercel(30 亿美金)、TikTok、Notion 使用
▶ 示例:创建并启动一个 Next.js 16 项目
# 1. 使用 create-next-app 创建项目(推荐)
npx create-next-app@latest my-next-app --ts --tailwind --app
# 2. 进入项目目录
cd my-next-app
# 3. 启动开发服务器(Turbopack 默认)
npm run dev
# 4. 终端输出节选
▲ ▲ ▲ ▲ ▲ ▲
▲ Next.js 16.2.10 (Turbopack)
▲ Local: http://localhost:3000
▲ Environments: .env.local
输出:
▲ Next.js 16.2.10
- Local: http://localhost:3000
✓ Ready in 876ms (Turbopack)
(1) ▶ 示例:一个 Next.js 页面能做什么
// app/page.tsx — 一个页面 = 数据获取 + 渲染 + 交互
export default async function HomePage() {
const data = await fetch('https://jsonplaceholder.typicode.com/posts/1');
return (
<main>
<h1 className="text-2xl font-bold">Welcome to Next.js 16</h1>
<p>Server-rendered content: {data.title}</p>
</main>
);
}
输出:
<h1>Welcome to Next.js 16</h1>
<p>Server-rendered content: sunt aut facere repellat provident</p>
4. 从 Pages Router 到 App Router
(1) 历史演进
timeline
title Next.js 路由体系演进
2016 : Next.js 1.0 发布 Pages Router
2019 : 9.3 支持 SSG + getStaticProps
2021 : 12 发布, React 18 + Rust 编译器
2022 : 13 发布, App Router beta (RSC)
2023 : 14 稳定 App Router, Turbopack beta
2025 : 15 默认 App Router, React 19
2026 : 16 Turbopack 默认, PPR stable, use cache
| 版本 | 路由体系 | 数据获取方式 | 渲染模式 |
|---|---|---|---|
| v1-v12 | Pages Router | getServerSideProps / getStaticProps |
SSR / SSG |
| v13-v14 | Pages + App Router (可选) | RSC + fetch |
SSR / SSG / ISR |
| v15 | App Router (默认) | RSC + Server Actions | SSR / SSG / ISR / PPR |
| v16 | App Router (独占) | RSC + use cache |
SSR / SSG / ISR / PPR |
(2) App Router 核心思维模型
App Router 的核心变化是:组件默认在服务端执行。
// Pages Router 旧模式 (v12)
export async function getServerSideProps() {
return { props: { data: await fetchData() } };
}
export default function Page({ data }) {
return <div>{data}</div>; // 所有代码在客户端
}
// App Router 新模式 (v16)
export default async function Page() {
const data = await fetchData(); // 直接在组件中获取
return <div>{data}</div>; // 默认 Server Component
}
(1) ▶ 示例:Pages Router vs App Router 代码对比
// ============================================
// Pages Router (pages/posts/[id].tsx)
// 需要额外导出 getServerSideProps
// ============================================
export async function getServerSideProps({ params }) {
const res = await fetch(`https://api.example.com/posts/${params.id}`);
return { props: { post: await res.json() } };
}
export default function PostPage({ post }) {
return <h1>{post.title}</h1>;
}
// ============================================
// App Router (app/posts/[id]/page.tsx)
// 直接 async component,无需额外导出
// ============================================
export default async function PostPage({ params }) {
const post = await fetch(`https://api.example.com/posts/${params.id}`);
return <h1>{post.title}</h1>;
}
输出:
Pages Router: 18 行代码(含 getServerSideProps)
App Router: 8 行代码(直接 async component)
节省 55% 样板代码
5. Next.js 16 新特性全景
(1) 五大核心特性
graph LR
A[Next.js 16] --> B[Turbopack 默认<br/>开发构建 10x 快]
A --> C[PPR Stable<br/>局部预渲染]
A --> D[use cache<br/>声明式缓存]
A --> E[React 19<br/>Actions + use()]
A --> F[Proxy API<br/>取代部分 middleware]
A --> G[after()<br/>响应后任务]
style A fill:#cce5ff
style B fill:#d4edda
| 特性 | 状态 | 开发者收益 |
|---|---|---|
| Turbopack 默认 | Stable | 开发构建 10x 快,HMR 即时更新 |
| Partial Prerendering | Stable | 静态壳 SEO + 动态内容个性化 |
use cache |
Stable | 组件级缓存,替代 getStaticProps |
| React 19 | 内置 | Server Actions、use()、useOptimistic |
| Proxy API | New | 服务端代理转发,替代部分 middleware |
| after() | New | 响应后异步任务(日志/分析) |
(2) Turbopack 默认构建
Turbopack 是 Vercel 用 Rust 写的增量打包工具,在 Next.js 16 中默认开启。
| 对比项 | Webpack (v15) | Turbopack (v16) |
|---|---|---|
| 冷启动 | 5-10s | 0.5-1s |
| HMR 热更新 | 50-200ms | < 10ms |
| 构建速度 | 基线 | 10x 更快 |
| 配置量 | 复杂 | 零配置 |
(1) ▶ 示例:Turbopack 即时热更新体验
# Next.js 16 启动开发服务器,默认使用 Turbopack
npm run dev
# 控制台输出
▲ ▲
▲ Next.js 16.2
▲ - Local: http://localhost:3000
▲ - Turbopack (experimental): ✓ loaded in 876ms
# 编辑任意文件后保存 — 即时热更新
✔ Updated /app/page.tsx in 3ms
输出:
Turbopack 启动时间: 876ms
热更新时间: 3ms
对比 Webpack 冷启动: 5-10s
(3) Partial Prerendering (PPR)
PPR 是 Next.js 16 最核心的创新——它允许一个页面中静态部分预渲染成 HTML,动态部分通过 Suspense 边界流式加载。
graph TB
subgraph PPR 页面
A[静态外壳<br/>预渲染 HTML] --> B[导航栏]
A --> C[侧边栏]
A --> D[Suspense 边界<br/>---]
D --> E[动态内容<br/>流式渲染]
D --> F[用户数据<br/>流式渲染]
end
style A fill:#d4edda
style D fill:#f8d7da
| 渲染策略 | 构建时 | 请求时 | 缓存 | SEO |
|---|---|---|---|---|
| SSR | ❌ | ✅ 全量渲染 | ❌ | ✅ |
| SSG | ✅ 全量预渲染 | ❌ | ✅ | ✅ |
| ISR | ✅ 全量预渲染 | ✅ 按需重生成 | ✅ | ✅ |
| PPR | ✅ 静态壳 | ✅ 动态部分流式 | ✅ | ✅ |
(4) use cache 声明式缓存
// app/page.tsx — 使用 use cache 指令
import { unstable_cache as cache } from 'next/cache';
export default async function Page() {
const data = await getData();
return <div>{JSON.stringify(data)}</div>;
}
const getData = cache(
async () => {
return fetch('https://api.example.com/expensive-data');
},
['expensive-data'],
{ revalidate: 3600 }
);
(2) ▶ 示例:PPR + use cache 组合实战
// ============================================
// PPR 静态壳 + use cache 智能缓存
// 首页 = 静态头部 + 动态推荐内容(缓存 1 小时)
// ============================================
// app/page.tsx
import { Suspense } from 'react';
import { RecommendedProducts } from './RecommendedProducts';
export default function HomePage() {
return (
<div>
<header className="bg-gray-100 p-4">
<h1>Welcome to ShopHub</h1>
<nav>Categories | Deals | Support</nav>
</header>
{/* PPR 边界:动态推荐内容 */}
<Suspense fallback={<div className="animate-pulse h-40 bg-gray-200" />}>
<RecommendedProducts />
</Suspense>
</div>
);
}
// app/RecommendedProducts.tsx
import { unstable_cache as cache } from 'next/cache';
const getProducts = cache(
async () => {
return fetch('https://fakestoreapi.com/products?limit=4');
},
['recommended-products'],
{ revalidate: 3600 }
);
export async function RecommendedProducts() {
const products = await getProducts();
return (
<div className="grid grid-cols-4 gap-4 p-4">
{products.map(p => (
<div key={p.id} className="border rounded p-2">
<img src={p.image} alt={p.title} className="h-32" />
<p className="font-bold">{p.title}</p>
<p>${p.price}</p>
</div>
))}
</div>
);
}
输出:
页面加载时:
1. 静态头部(导航栏)立即显示
2. 推荐区域显示骨架屏(灰色占位动画)
3. 数据就绪后,4 个商品卡片流式渲染
4. 同一用户 1 小时内重复访问走缓存,无需重新 fetch
(5) React 19 深度集成
Next.js 16 内置 React 19,支持:
- Server Actions:
'use server'直接在后端执行函数 use()Hook:在 render 中读取 PromiseuseOptimistic:乐观更新 UIuseFormStatus:表单提交状态
(3) ▶ 示例:React 19 Server Actions 快速表单
// ============================================
// Server Action:表单提交直接调用后端函数
// 无需手动创建 API Route
// ============================================
// app/contact/page.tsx
export default function ContactPage() {
async function handleSubmit(formData) {
'use server';
const name = formData.get('name');
const email = formData.get('email');
// 直接写入数据库或发送邮件
console.log(`New contact: ${name} <${email}>`);
// 重定向到成功页面
redirect('/contact/success');
}
return (
<form action={handleSubmit}>
<input name="name" placeholder="Your name" required />
<input name="email" type="email" placeholder="Your email" required />
<button type="submit">Send</button>
</form>
);
}
输出:
表单提交后:
1. handleSubmit 函数在服务端执行
2. formData 自动收集表单字段
3. redirect 执行服务端 303 重定向
4. 无需编写 API Route / fetch 代码
6. 框架对比:Next.js vs Remix vs Nuxt vs Astro
(1) 四框架定位
graph TB
subgraph "全栈框架"
A[Next.js<br/>React 生态] --> B[Remix<br/>Web 标准优先]
C[Nuxt<br/>Vue 生态]
end
subgraph "静态站点"
D[Astro<br/>多框架岛屿]
end
style A fill:#cce5ff
style C fill:#d4edda
(2) 详细对比
| 维度 | Next.js 16 | Remix 2 | Nuxt 4 | Astro 5 |
|---|---|---|---|---|
| 框架基座 | React 19 | React 18 | Vue 3 / Nitro | 任意(Islands) |
| 路由类型 | 文件系统(App Router) | 文件系统 | 文件系统 | 文件系统 |
| 渲染模式 | SSR/SSG/ISR/PPR | SSR/SSG | SSR/SSG/ISR | SSG(默认)/ SSR |
| PPR | ✅ Stable | ❌ | ❌ | ❌ |
| Server Components | ✅ 默认 | ❌ | ❌ | ❌ |
use cache |
✅ Stable | ❌ | ❌ | ❌ |
| Turbopack | ✅ 默认 | ❌ | Vite | Vite |
| 构建速度 | 10x (Turbopack) | 1x | 1x | 1x |
| 数据获取 | RSC + fetch | loader + action | asyncData | 无内置 |
| API 路由 | Route Handlers | action + resource | server routes | 无 |
| 学习曲线 | 中(需 React) | 中(需 Web 标准) | 中(需 Vue) | 低(任意) |
| Star | 130k⭐ | 30k⭐ | 55k⭐ | 50k⭐ |
| 部署平台 | Vercel + 任意 | Fly + 任意 | Vercel + 任意 | Netlify + 任意 |
(3) 选型建议
| 场景 | 推荐框架 | 理由 |
|---|---|---|
| 全栈 SaaS 应用 | Next.js 16 | PPR + RSC + Server Actions 最强 |
| 内容型网站/博客 | Astro | 零 JS 输出,极致性能 |
| Web 标准优先 | Remix | 贴近 HTTP 规范、FormData |
| Vue 技术栈 | Nuxt | Vue 生态自然延伸 |
| 电商/仪表盘 | Next.js 16 | PPR 静态壳 + 动态数据隔离 |
| 静态文档站 | Astro | Islands 架构 + MDX 原生支持 |
(1) ▶ 示例:同个页面在四个框架中的写法
// ============================================
// 同一个"用户列表"页面的四框架写法对比
// ============================================
// Next.js 16 (app/users/page.tsx)
export default async function UsersPage() {
const users = await fetch('https://api.example.com/users');
return users.map(u => <div key={u.id}>{u.name}</div>);
}
// Remix 2 (app/routes/users.tsx)
export async function loader() {
return fetch('https://api.example.com/users');
}
export default function UsersPage() {
const users = useLoaderData();
return users.map(u => <div key={u.id}>{u.name}</div>);
}
// Nuxt 4 (pages/users.vue)
<script setup>
const { data: users } = await useFetch('https://api.example.com/users');
</script>
<template>
<div v-for="u in users" :key="u.id">{{ u.name }}</div>
</template>
// Astro 5 (src/pages/users.astro)
---
const response = await fetch('https://api.example.com/users');
const users = await response.json();
---
{users.map(u => <div>{u.name}</div>)}
输出:
Next.js 16: 5 行代码,零样板(默认 Server Component)
Remix 2: 12 行代码,需 loader + useLoaderData
Nuxt 4: 10 行代码,需 script setup + useFetch
Astro 5: 8 行代码,零 JS 客户端输出
7. 使用场景与选型建议
(1) Next.js 16 适合的场景
| 场景 | 说明 | 典型客户 |
|---|---|---|
| SaaS 平台 | Dashboard + 多租户 + 实时数据 | Notion、Linear |
| 电商网站 | 产品目录(SSG)+ 购物车(SSR) | TikTok Shop |
| 内容平台 | 文章(ISR)+ 推荐(流式) | Medium |
| 管理后台 | PPR 静态壳 + 动态 Widget | Vercel Dashboard |
| AI 应用 | 流式文本生成 + SSE | Vercel AI SDK |
(2) 不适合的场景
- 纯静态博客(Astro 更轻量)
- 简单落地页(纯 HTML/CSS 即可)
- 移动端原生 App(React Native / Flutter)
8. 完整示例:多渲染策略混合页面
// ============================================
// 综合示例:电商商品详情页
// 功能:SSG 静态目录 + PPR 推荐 + ISR 评论
// ============================================
// app/products/[id]/page.tsx
import { Suspense } from 'react';
import { notFound } from 'next/navigation';
// 静态页面参数生成(构建时预生成)
export async function generateStaticParams() {
const products = await fetch('https://fakestoreapi.com/products');
const ids = await products.json();
return ids.map(p => ({ id: String(p.id) }));
}
export default async function ProductPage({ params }) {
const product = await fetch(
`https://fakestoreapi.com/products/${params.id}`
);
if (!product) {
notFound();
}
return (
<div className="container mx-auto p-4">
{/* 静态部分:商品基本信息 */}
<div className="flex gap-8">
<img src={product.image} alt={product.title} className="w-64 h-64" />
<div>
<h1 className="text-2xl font-bold">{product.title}</h1>
<p className="text-xl text-green-600">${product.price}</p>
<p className="mt-4">{product.description}</p>
</div>
</div>
{/* PPR 动态边界:推荐商品 */}
<Suspense fallback={<div>Loading recommendations...</div>}>
<Recommendations category={product.category} />
</Suspense>
{/* ISR 评论区域:每小时重新生成 */}
<Suspense fallback={<div>Loading reviews...</div>}>
<Reviews productId={params.id} />
</Suspense>
</div>
);
}
// app/products/[id]/Recommendations.tsx
async function Recommendations({ category }) {
const products = await fetch(
`https://fakestoreapi.com/products/category/${category}`
);
return (
<div className="mt-8">
<h2 className="text-xl font-bold">Recommended Products</h2>
<div className="grid grid-cols-4 gap-4 mt-4">
{products.slice(0, 4).map(p => (
<div key={p.id} className="border p-2 rounded">{p.title}</div>
))}
</div>
</div>
);
}
// app/products/[id]/Reviews.tsx
async function Reviews({ productId }) {
const reviews = await fetch(
`https://api.example.com/reviews/${productId}`,
{ next: { revalidate: 3600 } }
);
return (
<div className="mt-8">
<h2 className="text-xl font-bold">Customer Reviews</h2>
{reviews.map(r => (
<div key={r.id} className="border-b py-2">
<p className="font-bold">{r.author}</p>
<p>{r.content}</p>
</div>
))}
</div>
);
}
预期输出:
1. 商品基本信息瞬间显示(SSG 静态 HTML)
2. 推荐区域显示 "Loading recommendations..." 占位
3. 评论区域显示 "Loading reviews..." 占位
4. 推荐内容流式渲染(PPR)
5. 评论内容缓存 1 小时后按需更新(ISR)
6. 整个页面具有完整 SEO 元数据
❓ 常见问题
output: 'standalone' 模式可以输出独立目录,配合 Docker 多阶段构建和 Nginx 反向代理实现自托管部署。📖 小节
- Next.js 16 是 Vercel 出品的 React 全栈框架,提供文件系统路由、渲染引擎和 API 路由
- App Router 取代 Pages Router,Server Components 默认在服务端执行,减少客户端 JS 体积
- 五大新特性:Turbopack(10x 构建速度)、PPR(局部预渲染)、
use cache(声明式缓存)、React 19、Proxy API - SSR / SSG / ISR / PPR 四代渲染策略覆盖从纯静态到全动态的完整光谱
- 与 Remix、Nuxt、Astro 相比,Next.js 16 的差异化优势在于 PPR + Server Components + Turbopack
- Next.js 16 适合全栈 SaaS、电商、内容平台,纯静态站点建议选择 Astro
- PPR 的核心思想是"静态壳 + 动态流式"——导航栏等不变部分预渲染,用户数据等变化部分边界流式
📝 作业
-
基础题(⭐):阅读 Next.js 16 官方 Homepage(nextjs.org),用你自己的话写出 Next.js 的 3 个核心定位(50 字以内)。
-
进阶题(⭐⭐):用 create-next-app 创建一个新项目(
npx create-next-app@latest my-app --ts --tailwind),启动开发服务器,截图控制台输出,标注出 Turbopack 启动时间。 -
挑战题(⭐⭐⭐):选择一个你之前用 React SPA 做过的项目(或一个你熟悉的产品),分析它如果用 Next.js 16 重写,哪些部分应该用 SSG、哪些应该用 SSR、哪些可以用 PPR。写一个 200 字以内的迁移计划。