Next.js 16 Beta 发布:重大变化与升级建议

摘要:Next.js 16 Beta 版本已经发布,这次更新带来了很多重要变化。对于正在使用 Next.js 的开发者来说,了解这些变化非常重要,因为它们可能会影响现有项目。

Next.js 16 Beta 版本已经发布,这次更新带来了很多重要变化。对于正在使用 Next.js 的开发者来说,了解这些变化非常重要,因为它们可能会影响现有项目。


最大的变化:Turbopack 成为默认选项

Vercel 公司宣布,Turbopack 现在成为 Next.js 的默认构建工具。他们表示 Turbopack 能提供更快的构建速度,开发时的热更新也比之前快很多。

但这个变化也带来一些问题:

如果你在项目中使用了自定义的 Webpack 配置,这些配置可能无法直接使用。现在如果你想继续使用 Webpack,需要在命令中特别指定:

next dev --webpack
next build --webpack

另外,一些第三方插件可能还不支持 Turbopack,这可能导致兼容性问题。


需要特别注意的破坏性变化

1. 更多的异步操作

现在很多 API 都需要使用 async/await:

// 之前的写法
export default function Page({ params, searchParams }) {
  const id = params.id;
}

// 现在的写法
export default async function Page({ params, searchParams }) {
  const { id } = await params;
  const query = await searchParams;
}

// 其他 API 调用也一样
const cookieStore = await cookies();
const headersList = await headers();

这个变化影响比较大,现有项目可能需要大量修改代码。

2. Node.js 版本要求提高

Next.js 16 要求最低 Node.js 版本是 20.9.0。如果你的生产环境还在使用 Node.js 18,就需要先升级 Node.js 版本。

对于企业项目来说,升级 Node.js 版本可能需要较长的审批流程,这会延迟 Next.js 的升级。

3. 实验性功能被移除

之前的一些实验性功能被移除了,比如 PPR(Partial Prerendering)。如果你在项目中使用了这些功能,升级后可能会遇到问题。


缓存 API 的变化

缓存相关的 API 也有调整:

// 之前的写法
revalidateTag('products');

// 现在的写法
revalidateTag('products', 'max');          // 长期缓存
revalidateTag('products', 'hours');        // 小时级别缓存
revalidateTag('products', { revalidate: 3600 }); // 自定义时间

新增了 updateTag() 函数,但只能在 Server Actions 中使用:

'use server';
import { updateTag } from 'next/cache';

export async function updateProduct(id: string) {
  // 更新产品的逻辑
  updateTag(`product-${id}`); // 立即更新缓存
}


Image 组件的安全改进

Image 组件有一些默认值的变化:

  • 图片缓存时间从 60 秒变为 4 小时

  • 最大重定向次数现在限制为 3 次

  • 图片质量默认统一为 75

  • 默认禁止使用本地 IP 地址

如果需要在开发环境使用本地 IP,必须明确配置:

// next.config.ts
images: {
  dangerouslyAllowLocalIP: true,
}


React Compiler 稳定版

React Compiler 现在成为稳定功能,可以自动优化组件性能,减少不必要的重新渲染。

使用它需要安装额外的 Babel 插件:

// next.config.ts
const nextConfig = {
  reactCompiler: true,
};

这个功能不是默认开启的,需要手动配置。


被移除的功能

Next.js 16 移除了几个旧功能:

  • AMP 支持完全移除

  • next lint 命令被移除,建议直接使用 ESLint

  • Runtime Configs 被移除,改用环境变量

  • 页面滚动行为不再默认添加平滑效果


新功能

1. Turbopack 文件系统缓存(测试版)

开发模式下可以缓存编译结果,加快重启速度:

// next.config.ts
experimental: {
  turbopackFileSystemCacheForDev: true,
}

2. Build Adapters API(早期版本)

允许自定义构建过程:

// next.config.js
experimental: {
  adapterPath: require.resolve('./my-adapter.js'),
}

3. React 19.2 新特性

集成了 React 19.2 的新功能,包括页面切换动画和改进的 Hook。


升级建议

适合升级的情况:

  • 新开始的项目

  • 项目配置比较简单

  • 团队愿意接受较大的变化

  • 对性能要求很高的项目

建议暂缓升级的情况:

  • 项目中有复杂的 Webpack 自定义配置

  • 使用了被移除的实验性功能

  • 生产环境还在使用 Node.js 18

  • 没有足够时间处理代码改动

  • 依赖的第三方工具可能不兼容 Turbopack


实际升级步骤

如果你决定升级,建议按以下步骤进行:

  1. 备份项目:升级前确保代码已经备份

  2. 检查依赖:确认所有依赖包都支持 Next.js 16

  3. 逐步测试:先在测试环境验证,不要直接更新生产环境

  4. 处理异步改动:根据错误信息逐个修复异步相关的问题

  5. 更新配置:调整 next.config.js 中的相关配置


常见问题处理

问题1:构建失败
如果构建失败,可以先尝试使用 --webpack 参数:

next build --webpack

问题2:图片不显示

检查 Image 组件的配置,特别是本地 IP 相关的设置。

问题3:API 调用错误
确认所有需要异步调用的地方都加了 await。


总结

Next.js 16 是一个重要的版本更新,带来了性能改进和新功能,但也包含很多破坏性变化。在决定是否升级时,需要权衡新功能带来的好处和升级所需的工作量。

对于新项目,建议直接使用 Next.js 16。对于现有项目,建议先充分测试,确保所有功能都能正常工作后再升级。

无论是否立即升级,都建议了解这些变化,为将来的升级做好准备。技术的发展总是向前推进的,适应变化是开发者必备的能力。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_13009