Next.js 16 实战
Next.js 16 于 2026 年 3 月正式发布,带来了许多重大更新。作为目前最流行的 React 全栈框架,Next.js 16 进一步简化了开发体验,提升了性能。
本文通过一个完整的博客系统示例,带你掌握 Next.js 16 的核心特性。
核心特性:App Router 稳定版、Server Actions 正式支持、Turbopack 默认启用、部分预渲染(PPR)
环境准备
系统要求
- Node.js 20.17+ 或 22.11+
- npm / pnpm / yarn
- 推荐:VS Code + ESLint + Prettier
创建项目
# 使用 pnpm(推荐)
pnpm create next-app@latest my-blog
# 选择配置:
# - TypeScript: Yes
# - ESLint: Yes
# - Tailwind CSS: Yes
# - `src/` directory: Yes
# - App Router: Yes
# - Turbopack: Yes (默认启用)
cd my-blog
pnpm dev
Next.js 16 变化:Turbopack 现在是默认选项,开发速度比 Webpack 快 53%。
项目结构
my-blog/
├── src/
│ ├── app/ # App Router 路由
│ │ ├── layout.tsx # 根布局
│ │ ├── page.tsx # 首页
│ │ ├── blog/
│ │ │ ├── page.tsx # 博客列表
│ │ │ └── [slug]/
│ │ │ └── page.tsx # 博客详情
│ │ └── api/ # API 路由
│ ├── components/ # React 组件
│ ├── lib/ # 工具函数
│ └── styles/ # 全局样式
├── public/ # 静态资源
└── package.json
核心特性实战
1. App Router 基础
Next.js 16 中 App Router 已经是稳定版本,推荐使用。
// src/app/layout.tsx
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
{children}
)
}
关键概念:
layout.tsx:布局组件,嵌套渲染,状态保持page.tsx:页面组件,路由终点loading.tsx:加载状态error.tsx:错误边界
2. Server Components(默认)
Next.js 16 中,所有组件默认都是服务端组件(RSC)。
// src/app/blog/page.tsx - 服务端组件
import { getPosts } from '@/lib/db'
export default async function BlogPage() {
const posts = await getPosts() // 直接异步获取数据
return (
博客列表
{posts.map(post => (
{post.title}
{post.excerpt}
))}
)
}
注意:服务端组件不能使用 useState、useEffect 等客户端 Hook。
3. Client Components
需要交互时使用客户端组件:
'use client'
// src/components/SearchBox.tsx
import { useState } from 'react'
export function SearchBox() {
const [query, setQuery] = useState('')
return (
setQuery(e.target.value)}
placeholder="搜索文章..."
/>
)
}
4. Server Actions(数据突变)
Next.js 16 中 Server Actions 正式支持,可以直接在表单中调用服务端函数。
// src/app/blog/actions.ts
'use server'
import { revalidatePath } from 'next/cache'
export async function createPost(formData: FormData) {
const title = formData.get('title') as string
const content = formData.get('content') as string
// 保存到数据库
await db.post.create({ title, content })
// 重新验证缓存
revalidatePath('/blog')
}
// src/app/blog/new/page.tsx
import { createPost } from './actions'
export default function NewPostPage() {
return (
)
}
优势:
- 无需 API 路由,直接调用
- 自动处理表单验证
- 渐进增强,无 JS 也能提交
5. 数据获取模式
静态生成(SSG)
// 默认行为,构建时生成
export default async function Page() {
const data = await fetchData()
return {data}
}
按需渲染(SSR)
// 禁用缓存,每次请求渲染
export const dynamic = 'force-dynamic'
export default async function Page() {
const data = await fetchData()
return {data}
}
增量静态再生成(ISR)
// 每 60 秒重新生成
export const revalidate = 60
export default async function Page() {
const data = await fetchData()
return {data}
}
6. Turbopack 性能
Next.js 16 默认使用 Turbopack,开发速度显著提升:
| 指标 | Webpack | Turbopack |
|---|---|---|
| 冷启动 | 5.2s | 1.8s |
| HMR 更新 | 800ms | 200ms |
| 内存占用 | 1.2GB | 400MB |
# package.json 中自动启用
"scripts": {
"dev": "next dev", // 默认 Turbopack
"build": "next build",
"start": "next start"
}
实战:博客系统
数据库设计
// src/lib/db.ts
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
export async function getPosts() {
return prisma.post.findMany({
orderBy: { createdAt: 'desc' },
take: 20
})
}
export async function getPost(slug: string) {
return prisma.post.findUnique({
where: { slug }
})
}
博客列表页
// src/app/blog/page.tsx
import { getPosts } from '@/lib/db'
import Link from 'next/link'
export default async function BlogPage() {
const posts = await getPosts()
return (
博客列表
{posts.map(post => (
{post.title}
{post.excerpt}
))}
)
}
博客详情页
// src/app/blog/[slug]/page.tsx
import { getPost } from '@/lib/db'
import { notFound } from 'next/navigation'
// 生成静态参数
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map(post => ({ slug: post.slug }))
}
// 重新验证时间
export const revalidate = 3600 // 1 小时
export default async function PostPage({
params
}: {
params: { slug: string }
}) {
const post = await getPost(params.slug)
if (!post) {
notFound()
}
return (
{post.title}
{post.content}
)
}
性能优化
1. 图片优化
import Image from 'next/image'
// 自动优化格式、尺寸、懒加载
2. 字体优化
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export default function RootLayout({ children }) {
return (
{children}
)
}
3. 缓存策略
// 手动控制缓存
const data = await fetch(url, {
cache: 'force-cache', // 默认,缓存
// cache: 'no-store', // 不缓存
// next: { revalidate: 60 } // ISR
})
部署
Vercel(推荐)
# 1. 推送到 GitHub
git push
# 2. 在 Vercel 导入项目
# 3. 自动构建部署
Docker 部署
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
EXPOSE 3000
CMD ["pnpm", "start"]
总结
Next.js 16 是一个成熟的全栈框架,适合构建各种类型的 Web 应用:
- ✅ App Router:更直观的路由系统
- ✅ Server Components:默认服务端渲染,性能优秀
- ✅ Server Actions:简化数据突变
- ✅ Turbopack:开发速度提升 53%
- ✅ 部分预渲染:静态 + 动态混合渲染
学习建议:
- 先理解 RSC 和 Client Component 的区别
- 掌握 Server Actions 的使用场景
- 了解缓存和重新验证策略
- 实践一个完整项目加深理解