作为React生态中最强大的全栈框架,Next.js的每一次更新都牵动着无数开发者的心。Next.js 16带来了自App Router推出以来最重大的一次版本迭代:Turbopack正式取代Webpack成为默认构建工具,整个路由和导航系统得到全面优化,React Compiler也终于稳定可用。
本文将基于官方文档,系统性地解析Next.js 16的所有重要变化。无论你是正在考虑升级的老用户,还是准备深入学习Next.js的新人,这篇文章都将帮助你全面理解新版本的特性和升级策略。
# 升级准备工作
# 环境要求变化
Next.js 16对运行环境提出了更高的要求:
| 要求 | 变化详情 |
|---|---|
| Node.js | 最低版本20.9.0(必须为LTS),Node.js 18不再支持 |
| TypeScript | 最低版本5.1.0 |
| 浏览器 | Chrome 111+、Edge 111+、Firefox 111+、Safari 16.4+ |
# 一键升级
Next.js官方提供了强大的Codemod工具,可以自动完成大部分迁移工作:
# pnpm
pnpm dlx @next/codemod@canary upgrade latest
# npm
npx @next/codemod@canary upgrade latest
# yarn
yarn dlx @next/codemod@canary upgrade latest
# bun
bunx @next/codemod@canary upgrade latest
Codemod能够自动完成以下工作:
- 更新next.config.js使用新的turbopack配置
- 从next lint迁移到ESLint CLI
- 将废弃的middleware convention迁移到proxy
- 移除stable APIs的unstable_前缀
- 移除pages和layouts中的experimental_ppr配置
# AI辅助升级
如果你使用支持MCP(Model Context Protocol)的AI编码助手,还可以使用Next.js DevTools MCP来自动化升级过程:
{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
}
}
}
配置完成后,只需告诉AI助手"帮助我升级到Next.js 16"即可自动完成升级。
# 手动升级
如果 prefer 手动升级,需要安装最新版本:
# pnpm
pnpm add next@latest react@latest react-dom@latest
# npm
npm install next@latest react@latest react-dom@latest
# yarn
yarn add next@latest react@latest react-dom@latest
注意:如果使用TypeScript,记得同时升级
@types/react和@types/react-dom。
# Turbopack默认启用
# 重大变化
Next.js 16最重要的变化之一是Turbopack正式稳定,并在next dev和next build中默认使用。在此之前,你需要通过--turbopack或--turbo标志手动启用。
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
不再需要添加--turbopack标志。
# 解决Webpack配置冲突
如果你的项目有自定义Webpack配置,运行next build(现在默认使用Turbopack)将会失败,以防止配置错误带来的问题。
有以下几种解决方案:
- 继续使用Turbopack:运行
next build --turbopack,忽略你的webpack配置 - 完全迁移到Turbopack:将webpack配置迁移为Turbopack兼容选项
- 继续使用Webpack:使用
--webpack标志来退出Turbopack
{
"scripts": {
"dev": "next dev",
"build": "next build --webpack",
"start": "next start"
}
}
# Turbopack配置位置变化
experimental.turbopack配置已经移出experimental,现在是顶层配置项:
import type { NextConfig } from 'next'
// Next.js 15 - experimental.turbopack
const nextConfig: NextConfig = {
experimental: {
turbopack: {},
},
}
// Next.js 16 - 顶层turbopack
const nextConfig: NextConfig = {
turbopack: {},
}
# Turbopack文件系统缓存(Beta)
Turbopack现在支持开发模式下的文件系统缓存,可以在重启之间存储编译产物,显著加快编译速度:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
experimental: {
turbopackFileSystemCacheForDev: true,
},
}
# Sass导入语法变化
Turbopack完全支持从node_modules导入Sass文件。但需要注意,Webpack允许的波浪号(~)前缀语法不再支持:
// Webpack写法(不再支持)
@import '~bootstrap/dist/css/bootstrap.min.css';
// Turbopack写法
@import 'bootstrap/dist/css/bootstrap.min.css';
# 异步Request APIs:完全异步化
# 重要变化
Next.js 15引入了异步Request APIs作为重大变化,并提供了临时的同步兼容性。从Next.js 16开始,同步访问已完全移除,这些API只能异步访问。
需要异步访问的API包括:
cookiesheadersdraftModelayout.js、page.js、route.js等文件中的paramspage.js中的searchParams
// Next.js 15(过渡期兼容)
const cookieStore = cookies()
// Next.js 16(必须异步)
const cookieStore = await cookies()
建议使用codemod来自动迁移到异步API。
# 类型迁移助手
为了帮助迁移异步params和searchParams,可以运行npx next typegen自动生成全局可用的类型助手:
PageProps:页面组件属性LayoutProps:布局组件属性RouteContext:路由上下文
export default async function Page(props: PageProps<'/blog/[slug]'>) {
const { slug } = await props.params
const query = await props.searchParams
return <h1>Blog Post: {slug}</h1>
}
# icon和opengraph-image的异步参数
传递到opengraph-image、twitter-image、icon和apple-icon中的props现在都是Promise:
export async function generateImageMetadata({ params }) {
const { slug } = params
return [{ id: '1' }, { id: '2' }]
}
// Next.js 16 - 异步params和id访问
export default async function Image({ params, id }) {
const { slug } = await params
const imageId = await id
// ...
}
# sitemap的异步id参数
export async function generateSitemaps() {
return [{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }]
}
// Next.js 16 - 异步id访问
export default async function sitemap({ id }) {
const resolvedId = await id
const start = Number(resolvedId) * 50000
// ...
}
# React 19.2与React Compiler
# React 19.2新特性
Next.js 16使用最新的React Canary版本,包含React 19.2的新特性:
- View Transitions:在Transition或导航中更新元素时添加动画
- useEffectEvent:将非响应式逻辑从Effect提取到可重用的Effect Event函数中
- Activity:通过
display: none隐藏UI同时保持状态和清理Effect来渲染"后台活动"
# React Compiler稳定支持
React Compiler的内置支持在Next.js 16中正式稳定。React Compiler可以自动memoize组件,减少不必要的重渲染,无需手动修改代码。
reactCompiler配置项已从experimental升级为稳定版:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
reactCompiler: true,
}
安装最新版本的React Compiler插件:
npm install -D babel-plugin-react-compiler
注意:启用此选项后,开发和构建时的编译时间可能会更长,因为React Compiler依赖Babel。
# 缓存API更新
# revalidateTag新增签名
revalidateTag有新函数签名,可以传递cacheLife配置文件作为第二个参数:
'use server'
import { revalidateTag } from 'next/cache'
export async function updateArticle(articleId: string) {
// 标记文章数据为过时
revalidateTag(`article-${articleId}`, 'max')
}
# updateTag:立即读取写入
这确保交互功能立即反映更改,非常适合表单、用户设置等场景。