Vercel 宣称 Turbopack 带来了 2-5 倍的构建速度提升和高达 10 倍的 Fast Refresh 加速。听起来很美好,但问题是:
--webpack 才能继续使用。# 现在想用回 Webpack?每次都得这样
next dev --webpack
next build --webpack
这个改动可能会让你重构半个项目:
// ❌ Next.js 15 及之前:直接访问
exportdefaultfunction Page({ params, searchParams }) {
const id = params.id;
}
// ✅ Next.js 16:必须 await
export default async function Page({ params, searchParams }) {
const { id } = await params;
const query = await searchParams;
}
// API 调用也一样
const cookieStore = await cookies();
const headersList = await headers();
争议点:这个改动的官方理由是"为了未来的流式渲染优化",但实际上给现有项目带来了巨大的迁移成本。很多开发者认为这应该通过更渐进的方式引入,而不是一刀切。
最低版本要求直接跳到 Node.js 20.9.0。如果你的生产环境还在用 Node 18(LTS 到 2025 年 4 月),现在得紧急升级了。
问题:企业环境升级 Node 版本往往需要走复杂的审批流程,这个强制要求可能会让很多团队无法及时升级 Next.js。
如果你之前尝鲜了 experimental.ppr = true,抱歉,这个配置被直接删除了。Vercel 的建议是:
"如果你严重依赖旧的 PPR 配置,建议留在当前的 Canary 版本,直到 Cache Components 迁移指南发布。"
翻译一下:我们还没准备好迁移方案,但已经把旧功能删了。自求多福吧。
revalidateTag() 现在需要第二个参数// ❌ 旧写法(已废弃)
revalidateTag('products');
// ✅ 新写法(必须指定缓存策略)
revalidateTag('products', 'max'); // SWR 长期缓存
revalidateTag('products', 'hours'); // 小时级别
revalidateTag('products', { revalidate: 3600 }); // 自定义秒数
updateTag() — 但有限制这个新 API 听起来很强大:在 Server Action 中立即过期并刷新缓存,实现"读写一致性"。
但关键限制:只能在 Server Actions 中使用。
'use server';
import { updateTag } from 'next/cache';
export async function updateProduct(id: string) {
// 更新逻辑...
updateTag(`product-${id}`); // 立即生效
}
争议点:为什么不能在 Route Handler 或其他地方使用?这个限制让很多使用场景变得尴尬。
Next.js 16 对 <Image> 组件做了多项"安全加固",但有些改动引起了不少反弹:
配置项 | 旧默认值 | 新默认值 | 影响 |
|---|---|---|---|
minimumCacheTTL | 60 秒 | 4 小时 | 大幅减少重验证,但可能导致图片更新延迟 |
maximumRedirects | 无限制 | 3 次 | 安全性提升,但可能中断某些 CDN 链路 |
qualities | [1-100] | [75] | 统一质量,但失去灵活性 |
本地 IP | 允许 | 禁止 | 开发环境可能需要手动开启 dangerouslyAllowLocalIP |
最大争议:本地 IP 默认禁用。如果你在内网环境或使用容器开发,现在需要显式配置:
// next.config.ts
images: {
dangerouslyAllowLocalIP: true, // 明显的"危险"警告
}
React Compiler 现在稳定了,能自动实现组件 memoization,理论上可以减少不必要的重渲染。
但实际情况:
✅ 好处:
useMemo 和 useCallback❌ 代价:
babel-plugin-react-compiler// next.config.ts
const nextConfig = {
reactCompiler: true, // 自己决定要不要牺牲编译速度
};
争议焦点:Vercel 说它"稳定"了,但为什么不默认启用?是因为性能影响,还是功能还不够成熟?
Next.js 16 彻底删除了一些"历史遗留"功能:
next lint 命令:直接用 ESLint CLI 或 Biomescroll-behavior: smooth 默认行为:需要手动加 data-scroll-behavior="smooth"unstable_rootParams()这个 API 直接被删了,官方说"未来的 minor 版本会提供替代方案"。
问题:先删了再说,让依赖这个 API 的开发者陷入困境。
在开发模式下缓存编译结果,加速重启。需要手动启用:
// next.config.ts
experimental: {
turbopackFileSystemCacheForDev: true,
}
疑问:既然这么好用,为什么还是实验性的?
允许部署平台和自定义构建工具修改构建过程。
// next.config.js
experimental: {
adapterPath: require.resolve('./my-adapter.js'),
}
现实:Alpha 阶段,文档不全,大部分开发者用不上。
坦白讲:这些是 React 的功能,不是 Next.js 的,只是顺带集成了。
experimental.ppr(等迁移指南)Next.js 16 无疑是一次大胆的技术赌注。Vercel 押注 Turbopack、React Compiler 和新的缓存架构,试图在性能和开发体验上实现飞跃。
但问题在于:这些改动是否过于激进?
你怎么看? 这是 Next.js 历史上最具争议的版本升级之一,你会选择立即拥抱变化,还是等待社区验证后再跟进?欢迎在评论区分享你的看法。
提示:如果决定升级,强烈建议先在开发分支测试,准备好至少 1-2 天的迁移时间处理 breaking changes。