大家好。
前面的文章介绍了 Next.js 16 的强大功能,现在该把它应用到实际项目中了。
接下来将分步骤介绍如何安全地把项目升级到 Next.js 16。
这不只是提升依赖版本,还有不少需要修改代码的
破坏性变更(Breaking Changes)
,请仔细跟随操作。
Next.js 团队提供了强大的自动化工具,帮助完成升级。
相比手动修改版本,强烈建议使用这个工具。
打开终端,在项目文件夹中运行以下命令。
Terminal npx @next/codemod@canary upgrade latest
这个命令会执行以下操作。
将 package.json 中的 Next.js、React、React DOM 更新到最新版本。
更新 next.config.js 配置文件,例如删除已移除的选项。
自动修改部分 API 变更。
但这个命令无法完整理解并修改业务逻辑。
接下来是需要开发者亲自处理的
必需修改事项
。
最先、也是最常遇到的错误,与同步访问 API 有关。
如第 2 篇所述,服务器组件中访问运行时数据,现在必须采用
异步
方式。
修改 params 与 searchParams 🔗
需要修改页面组件的 props 类型及用法。
app/blog/[slug]/page.tsx // [변경 전]
// export default function Page({ params }: { params: { slug: string } }) { ... }
// [변경 후]
// 1. Props 타입: params를 Promise로 감싸줍니다.
export default async function Page ({ params } : { params : Promise<{ slug : string }> }) {
// 2. 데이터 접근: 반드시 await를 사용하여 값을 추출해야 합니다.
// await 없이 params.slug에 접근하면 런타임 에러가 발생합니다.
const { slug } = await params;
return < div >Blog Post: { slug } </ div >;
}
从 next/headers 导入的函数,也都需要使用 await。
app/layout.tsx import { cookies } from 'next/headers' ;
export default async function RootLayout ({ children } : { children : React.ReactNode }) {
// [변경] cookies() 호출 앞에 await를 붙여야 합니다.
// 이전 버전(v15)에서는 경고만 떴지만, v16에서는 에러가 발생합니다.
const cookieStore = await cookies ();
const theme = cookieStore. get ( 'theme' );
return (
< html lang = "en" className ={ theme?.value } >
< body > { children } </ body >
</ html >
);
}
图片优化组件的默认配置发生了变化。
可以理解为,为了安全与性能,规则变得更加严格。
如果本地图片路径中使用了
?v=1 之类的查询参数,现在必须在
next.config.js 中显式添加允许配置。
这是为了防止无节制地生成图片。
如果不是开发环境(localhost),而是需要在私有网络等环境中通过本地 IP 加载图片,就要启用 dangerouslyAllowLocalIP 选项。
next.config.js module . exports = {
images: {
// 1. 로컬 이미지에 쿼리 스트링 사용 시 패턴 명시 필요
localPatterns: [
{
pathname: '/assets/**' ,
search: '?v=1' ,
},
],
// 2. 사설망 등에서 로컬 IP로 이미지 로드 시 필요 (보안 주의)
// 기본값은 false로 변경되었습니다.
dangerouslyAllowLocalIP: true ,
},
};
4. Parallel Routes:强制要求 default.js 🔗
如果使用
并行路由(Parallel Routes)
,即
@folder 形式,请留意。
现在,如果缺少各个插槽对应的
default.js 文件,
构建本身就会失败
。
以前 Next.js 会自行返回 404 或忽略,现在则要求开发者显式声明“没有内容可显示”。
app/@analytics/default.tsx // 해당 슬롯에 보여줄 기본 컨텐츠가 없더라도 파일은 생성해야 합니다.
export default function Default () {
// 아무것도 렌더링하지 않으려면 null을 반환합니다.
return null ;
}
请把项目根目录中的
middleware.ts(或 .js)重命名为
proxy.ts
。
同时,导出的函数名也需要从
middleware 改为
proxy。
Terminal # 파일명 변경
mv middleware.ts proxy.ts
proxy.ts import { NextResponse } from 'next/server' ;
import type { NextRequest } from 'next/server' ;
// [변경] 함수 이름을 proxy로 수정
export function proxy ( request : NextRequest ) {
return NextResponse. next ();
}
最后,需要从代码中删除不再支持的功能。
删除 AMP 配置
如果正在使用 config.amp 或 useAmp Hook,需要移除。
移除 next lint 命令
现在 next build 过程中不会自动运行 Lint。
请在 CI/CD 流水线中单独添加 eslint 命令。
替换 Legacy Image
next/legacy/image 组件已被删除。
需要替换为标准的 next/image。
迁移到 Next.js 16,不只是提升版本号。
它也是通过
异步 API
和
显式缓存
改进应用基础,确保长期可维护性的过程。
除了本文,也请逐步参考下面的链接,相信可以顺利完成迁移。
谢谢阅读。