Next.js: Next.js 16 简介

Next.js 16 是 Vercel 推出的 React 全栈框架的最新版本——它把文件系统路由、服务端渲染、静态生成、增量静态再生成和局部预渲染整合在一个开发框架中,让全栈开发变得简单。

本教程面向有 React 基础的前端开发者,从 App Router 入门讲起,直到你能用 Next.js 16 构建生产级全栈应用。

1. 你将学到


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 智能缓存。

TSX
// 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 构建全栈应用。

100%
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

▶ 示例:创建并启动一个 Next.js 16 项目

BASH
# 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

输出:

TEXT 📖 仅展示
▲ Next.js 16.2.10
- Local: http://localhost:3000
✓ Ready in 876ms (Turbopack)

(1) ▶ 示例:一个 Next.js 页面能做什么

TSX
// 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>
  );
}

输出:

TEXT 📖 仅展示
<h1>Welcome to Next.js 16</h1>
<p>Server-rendered content: sunt aut facere repellat provident</p>

4. 从 Pages Router 到 App Router

(1) 历史演进

100%
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 的核心变化是:组件默认在服务端执行

TSX
// 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 代码对比

TSX
// ============================================
// 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>;
}

输出:

TEXT 📖 仅展示
Pages Router: 18 行代码(含 getServerSideProps)
App Router: 8 行代码(直接 async component)
节省 55% 样板代码

5. Next.js 16 新特性全景

(1) 五大核心特性

100%
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 即时热更新体验

BASH
# 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

输出:

TEXT 📖 仅展示
Turbopack 启动时间: 876ms
热更新时间: 3ms
对比 Webpack 冷启动: 5-10s

(3) Partial Prerendering (PPR)

PPR 是 Next.js 16 最核心的创新——它允许一个页面中静态部分预渲染成 HTML,动态部分通过 Suspense 边界流式加载。

100%
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 声明式缓存

TSX
// 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 组合实战

TSX
// ============================================
// 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>
  );
}
TSX
// 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>
  );
}

输出:

TEXT 📖 仅展示
页面加载时:
1. 静态头部(导航栏)立即显示
2. 推荐区域显示骨架屏(灰色占位动画)
3. 数据就绪后,4 个商品卡片流式渲染
4. 同一用户 1 小时内重复访问走缓存,无需重新 fetch

(5) React 19 深度集成

Next.js 16 内置 React 19,支持:

(3) ▶ 示例:React 19 Server Actions 快速表单

TSX
// ============================================
// 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>
  );
}

输出:

TEXT 📖 仅展示
表单提交后:
1. handleSubmit 函数在服务端执行
2. formData 自动收集表单字段
3. redirect 执行服务端 303 重定向
4. 无需编写 API Route / fetch 代码

6. 框架对比:Next.js vs Remix vs Nuxt vs Astro

(1) 四框架定位

100%
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) ▶ 示例:同个页面在四个框架中的写法

TSX
// ============================================
// 同一个"用户列表"页面的四框架写法对比
// ============================================

// 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>)}

输出:

TEXT 📖 仅展示
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) 不适合的场景


8. 完整示例:多渲染策略混合页面

TSX
// ============================================
// 综合示例:电商商品详情页
// 功能: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>
  );
}

预期输出:

TEXT 📖 仅展示
1. 商品基本信息瞬间显示(SSG 静态 HTML)
2. 推荐区域显示 "Loading recommendations..." 占位
3. 评论区域显示 "Loading reviews..." 占位
4. 推荐内容流式渲染(PPR)
5. 评论内容缓存 1 小时后按需更新(ISR)
6. 整个页面具有完整 SEO 元数据

❓ 常见问题

Q Next.js 16 需要 React 19 吗?
A 是的,Next.js 16 内置 React 19,并且 React 19 的新功能(Server Actions、use()、useOptimistic)在 Next.js 中全部可用。你不需要单独安装 React,npm create-next-app 会自动安装匹配版本。
Q App Router 和 Pages Router 可以混用吗?
A Next.js 15 支持混用,但 Next.js 16 已不再推荐 Pages Router。如果你有旧项目,官方建议逐步迁移到 App Router。新项目一律使用 App Router。
Q PPR 和 ISR 有什么区别?
A PPR(Partial Prerendering)是页内级别的混合——静态部分预渲染 HTML,动态部分流式加载。ISR(Incremental Static Regeneration)是页级别的——整个页面静态生成,按时间间隔重新生成。简单说:PPR = 一页内动静结合,ISR = 整页定时更新。
Q Turbopack 比 Webpack 快多少?
A Next.js 官方数据显示 Turbopack 冷启动比 Webpack 快 10 倍(876ms vs 8s),热更新快 50 倍(3ms vs 150ms)。在大型项目中差异更大。
Q Next.js 适合做 API 后端吗?
A 可以,但不推荐作为唯一后端。Next.js 的 Route Handlers 适合 BFF 层(Backend For Frontend),复杂业务逻辑建议用独立后端(Express / Fastify),Next.js 专注于前端 + BFF。
Q Next.js 16 支持 Docker 自托管吗?
A 支持。Next.js 16 的 output: 'standalone' 模式可以输出独立目录,配合 Docker 多阶段构建和 Nginx 反向代理实现自托管部署。

📖 小节


📝 作业

  1. 基础题(⭐):阅读 Next.js 16 官方 Homepage(nextjs.org),用你自己的话写出 Next.js 的 3 个核心定位(50 字以内)。

  2. 进阶题(⭐⭐):用 create-next-app 创建一个新项目(npx create-next-app@latest my-app --ts --tailwind),启动开发服务器,截图控制台输出,标注出 Turbopack 启动时间。

  3. 挑战题(⭐⭐⭐):选择一个你之前用 React SPA 做过的项目(或一个你熟悉的产品),分析它如果用 Next.js 16 重写,哪些部分应该用 SSG、哪些应该用 SSR、哪些可以用 PPR。写一个 200 字以内的迁移计划。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏