最近在出一个前端的体系课程,里面的内容非常详细,如果你感兴趣,可以加我 v 进行联系 yunmz777:

浪费你几秒钟时间,内容正式开始
Next.js 在 React 全栈开发生态中扮演核心角色,早在 2024 年发布的 Next.js 15 中,就引入了 Rust 驱动的 Turbopack 打包器(Turbopack)作为 Webpack 的现代替代方案,同时支持 React 19、异步 Request APIs 等核心特性。
后续的 15.4 版本进一步推进了 Turbopack 的稳定性,已通过全部 8,298 个集成测试并被用于 vercel.com 等高流量站点。
而 15.5 则继续推进这一方向,整体朝着 Turbopack 成为默认构建工具的目标迈进。
如果你想升级,你可以执行如下命令来进行升级:
bash
# Use the automated upgrade CLI
npx @next/codemod@canary upgrade latest
# ...or upgrade manually
npm install next@latest react@latest react-dom@latest
# ...or start a new project
npx create-next-app@latest
Turbopack 构建(Beta):更快、更稳定、更广泛
next build --turbopack 已正式进入 Beta 阶段,现已应用于多个 Vercel 官网站点(包括 vercel.com、v0.app、nextjs.org 等),在预览与生产构建中显著提高了迭代效率。这些站点自上线以来,已累计处理了超过 12 亿次请求,展现出 Turbopack 的生产能力。
性能与生产表现
Turbopack 的设计宗旨之一,就是即使面对日益增长的项目规模,也能保持极致的构建性能。因此,它自底层架构起就全面支持多核 CPU 并行执行各阶段任务。
真实环境测试数据显示,使用 Turbopack 构建时对比 Webpack 构建时间有显著提升:
- 客户站点:4 核机器提升约 2 倍
- 客户站点:14 核机器提升约 2.2 倍
- 小型站点(1 万模块):30 核机器提升约 4 倍
- 中型站点(4 万模块):30 核机器提升约 2.5 倍
- 大型站点(7 万模块):30 核机器提升约 5 倍
更重要的是,在生产环境中对比 Webpack 构建,Turbopack 构建的站点 JavaScript 和 CSS 资源体积不增反减、请求次数减少,同时 FCP、LCP、TTFB 等核心性能指标表现更优或相当。
目前,开发者团队强烈建议已在开发流程中引入 Turbopack 的项目,也将其用于构建流程以享受性能提升。
已知差异与注意事项
尽管优势明显,但 Turbopack 在与 Webpack 的对比中,也展现出一些差异与局限:
-
小型项目:在硬件资源有限或项目规模较小时,构建时间提升可能不明显,甚至差异不大。这主要是因为 Webpack 的磁盘持久缓存机制发挥了优势。目前,官方正在为 Turbopack 推出持久缓存方案,以实现真正的增量与快速构建。
-
打包优化:在某些极端边缘场景下,Webpack 打包出的 bundle 体积可能更小、更优化。官方团队正在追踪这些情况,并力图在稳定版中缩小差距。相关细节可参考官方 "包大小优化" 文档。
-
CSS 顺序差异:Turbopack 与 Webpack 对 CSS 副作用的处理策略不同,可能导致 CSS 文件的拼接顺序出现差异,从而带来视觉上的细微不同。针对这一问题,官方文档提供了解释与推荐的解决方案。
总结建议
| 项目类型 | 建议 |
|---|---|
| 大中型项目 | 强烈推荐使用 Turbopack 构建,可显著提升性能与迭代效率。 |
| 小型项目 | 若提升有限,可继续使用 Webpack;建议关注 Turbopack 持久缓存功能的发展。 |
| 视觉兼容 | 若发现样式差异,请参考文档提供的解决方案调整 CSS 拼接顺序。 |
| 打包体积 | 如 bundle 体积偏大或优化不理想,可结合 bundle 分析工具对比后选择最佳方案。 |
Node.js 中间件进入稳定版
在 15.2 版本中,Next.js 首次引入了 Node.js 运行时中间件的实验性支持,并在生产环境中进行了大量测试。如今,这一特性已升级为 稳定支持,开发者可以放心在项目中使用。
在此之前,Next.js 中间件仅支持 Edge Runtime。虽然 Edge Runtime 在性能和隔离性方面表现更优,但在集成某些 Node.js 专属库与 API 时存在限制。
如下代码所示:
ts
import { NextRequest, NextResponse } from "next/server";
export const config = {
runtime: "nodejs", // Now stable!
};
export function middleware(request: NextRequest) {
// Access to full Node.js APIs and npm packages
const fs = require("fs");
const crypto = require("crypto");
// Complex authentication logic
const token = request.headers.get("authorization");
if (!isValidToken(token)) {
return NextResponse.redirect(new URL("/login", request.url));
}
return NextResponse.next();
}
function isValidToken(token: string | null): boolean {
// Use Node.js crypto for validation
// Access file system, databases, etc.
return true;
}
这一变化使中间件能够应对更加复杂的使用场景,同时依然保持了原有的开发体验。
需要注意的是,Next.js 16 中 Node.js 运行时并不会作为默认选项。不过,团队正在根据社区反馈与实际使用情况,评估在 Next.js 17 中将其设为默认运行时的可能性。
TypeScript 改进
Next.js 15.5 在 App Router 上带来了重要的 TypeScript 增强:全面支持 Turbopack,并为路由提供了更强的类型安全保障。
1. Typed Routes(稳定版)
Typed Routes 为应用路由提供 编译期的类型安全,能够在构建阶段捕获无效的链接,避免错误代码进入生产环境。 它会基于文件目录自动生成类型,确保所有 <Link> 组件都指向有效路由。
此前需要通过实验性 typedRoutes 标志启用,而在 15.5 中已成为稳定特性,并且在 Webpack 与 Turbopack 下均可使用。
ts
// next.config.ts
const nextConfig = {
typedRoutes: true, // 已稳定
};
export default nextConfig;
import Link from 'next/link'
// 完整类型安全
<Link href="/blog/example-slug?ui=dark">Read Post</Link>
// 错误路径会在编译时报错
<Link href="/invalid-route">Broken Link</Link> // ← 类型错误
2. Route Export Validation(Turbopack)
在 Turbopack 中,Next.js 通过生成 类型守卫文件 来校验页面、布局和路由处理器的导出是否符合规范。 它利用 TypeScript 的 satisfies 操作符,在运行 next build 时捕获错误导出(例如动态参数配置错误),替代了旧的 Webpack 插件,并且性能更高。
3. Route Props Helpers
Next.js 会自动生成全局可用的 PageProps、LayoutProps、RouteContext 类型,无需手动导入,也能获得完整的参数推导:
以前:需要手写类型和导入
ts
import { Metadata } from "next";
interface Props {
params: Promise<{ slug: string }>;
children: React.ReactNode;
analytics: React.ReactNode; // 并行路由需要手动写类型
team: React.ReactNode; // 并行路由需要手动写类型
}
export default function DashboardLayout(props: Props) {
return (
<div>
{props.children}
{props.analytics} {/* 没有类型安全 */}
{props.team} {/* 没有类型安全 */}
</div>
);
}
现在:自动生成类型 + 支持并行路由
ts
// 不再需要手动导入 LayoutProps
export default function DashboardLayout(props: LayoutProps<"/dashboard">) {
return (
<div>
{props.children}
{props.analytics} {/* 已有完整类型 */}
{props.team} {/* 已有完整类型 */}
</div>
);
}
该系统会自动发现文件目录中的路由,支持 动态路由、并行路由、自定义路由(来自 next.config.js)。 在开发和构建阶段都会生成类型,并能在开发时实时更新。相比旧实现,它只生成少量优化文件,而不是为每个路由生成单独的文件,更加高效,尤其适合大型项目。
next typegen 命令
新增了 next typegen 命令,用于 手动生成路由类型,无需运行 next dev 或 next build。 在需要单独做类型验证(如 CI 流程)时非常有用:
bash
# 生成类型后再进行 TypeScript 校验
next typegen && tsc --noEmit
# 在 CI 中执行类型检查而不必完整构建
next typegen && npm run type-check
过去,路由类型只有在运行 next dev 或 next build 时才会生成,导致 tsc --noEmit 无法校验路由。现在可以独立生成类型并在外部校验。
next lint 弃用
从 Next.js 15.5 开始,next lint 命令会显示弃用警告,并将在 Next.js 16 被移除。 这次变更旨在让开发者直接使用 显式 ESLint 配置,并提供 Biome 作为更快的替代选项,从而实现更现代化的 lint 流程。
新项目创建时的选择
- ESLint:规则全面,适合复杂项目。
- Biome:速度快,但规则较少,自带格式化功能。
- 无 Linter:开发者自行选择工具链。
生成的脚手架将包含显式配置文件:
- ESLint 项目生成
eslint.config.mjs; - Biome 项目包含 Next.js 与 React 的优化规则。
并且 package.json 的脚本会直接调用 ESLint 或 Biome:
json
{
"scripts": {
// ESLint 项目
"lint": "eslint", // 不再是 "next lint"
"lint:fix": "eslint --fix",
// Biome 项目
"lint": "biome check",
"format": "biome format --write"
}
}
迁移现有项目
为方便迁移,官方提供了 codemod 工具:
bash
npx @next/codemod@latest next-lint-to-eslint-cli .
它会自动将 package.json 中的脚本从 next lint 转换为 ESLint CLI,并保留原有功能:
-
--strict→--max-warnings 0 -
自动安装依赖
这样,开发者能够直接掌控 lint 配置,同时与更广泛的生态保持兼容。
值得注意的是,如果项目中存在 ESLint 配置,
next build仍会运行一次 lint 校验。但这一自动 lint 步骤也会在 Next.js 16 移除,届时开发者可以完全自主决定 何时、如何运行 lint。
Next.js 16 弃用警告
Next.js 15.5 引入了弃用警告,帮助开发者提前为即将到来的 Next.js 16 做好迁移准备。 这些警告会出现在开发与构建日志中,留给你充足的时间在功能被移除前完成调整。
1. legacyBehavior(next/link)
next/link 的 legacyBehavior 属性将在 Next.js 16 中被移除。 该属性最初是在 Next.js 12 → 13 过渡期间,用于兼容旧版 <a> 包裹写法的临时方案。
tsx
// 将在 Next.js 16 移除
<Link href="/about" legacyBehavior>
<a>About</a>
</Link>
// 推荐写法(现代方式,无需 <a>)
<Link href="/about">About</Link>
迁移方式:删除 legacyBehavior 属性以及子 <a> 元素。
现在 Link 组件已默认处理可访问性和样式,无需额外标签。
2. AMP 支持
Next.js 16 将彻底移除 AMP 支持。 由于 AMP 的行业采用率显著下降,继续维护该功能只会增加框架复杂度,因此 AMP 相关的 API 与配置将被删除。
tsx
// 将在 Next.js 16 移除
import { useAmp } from "next/amp";
export const config = { amp: true };
export default function AmpPage() {
const isAmp = useAmp();
return <div>AMP Page: {isAmp ? "AMP" : "HTML"}</div>;
}
ts
// next.config.ts 中的配置也将被移除
const nextConfig = {
amp: {
canonicalBase: "https://example.com",
},
};
export default nextConfig;
迁移方式:移除所有与 AMP 相关的代码,包括:
- 页面中的
export const config = { amp: true } next.config.ts中的 AMP 配置useAmp以及其他 AMP 专属 API
建议:如果之前依赖 AMP 提升性能,可以转向 Next.js 内置优化能力 和现代 Web 标准(如
Image优化、RSC、Edge 渲染),几乎可以实现同等甚至更好的性能收益。
3. next/image 的 quality 配置
从 Next.js 16 开始,<Image> 的 quality 属性默认只能使用 75。 在 Next.js 15 中仍可设置 1--100 的任意整数,但若想在 16 中使用其他值,需要在配置文件里显式声明允许范围。
tsx
// Next.js 15.5 会警告:quality ≠ 75 且未配置 qualities
<Image src="/photo.jpg" quality={100} alt="Photo" />;
// Next.js 16 推荐配置
// next.config.ts
const nextConfig = {
images: {
qualities: [75, 100], // 明确允许 100
},
};
export default nextConfig;
迁移方式: 如果项目中使用了 quality ≠ 75 的值,请在 next.config.ts 的 images.qualities 中显式声明需要的质量参数。
4. next/image 本地图片 + 查询参数
从 Next.js 16 开始,本地图片路径若带有查询参数(例如 ?v=1 用于版本控制或 cache-busting),必须在 images.localPatterns 中显式允许。
tsx
// Next.js 15.5 会警告:未配置 localPatterns
<Image src="/photo.jpg?v=1" alt="Test" />
ts
// Next.js 16 推荐配置
// next.config.ts
const nextConfig = {
images: {
localPatterns: [
{
pathname: "/photo.jpg", // 允许该路径
// 不写 search → 允许任意查询参数
},
{
pathname: "/photo.jpg",
search: "?v=1", // 仅允许指定查询参数
},
{
pathname: "/assets/", // 支持通配符
search: "", // 空字符串 = 禁止所有查询参数
},
],
},
};
export default nextConfig;
迁移方式:在 next.config.ts 的 images.localPatterns 中,显式声明允许哪些路径和查询参数。这不仅提升了安全性,也有助于框架在构建时更好地进行性能优化。
额外补充
在 Reddit 社区上,有用户分享升级经验:
"对于一个小型博客模板,使用 codemod 升级用了不到 5 分钟,而且 Turbopack 提升立竿见影------原本加载 5 秒的页面现在不到 1 秒。" "但在大项目里,codemod 更新了 30--40 个文件,却遇到了与 React 19 的兼容问题。"
这说明 Turbopack 与 React 19 的性能提升确实明显,但升级过程中可能面临依赖兼容问题,建议在迁移前进行依赖审查与分步测试。
总结
Next.js 15.5 在 App Router 上强化了 TypeScript 支持,对 Turbopack 实现了完整兼容,同时通过 Typed Routes 和 Route Props Helpers 提供了更全面的类型安全。与此同时,next lint 命令遭弃用,项目迁移至显式 ESLint 或更轻量的 Biome 工具成为新趋势。官方也在开发环境和构建日志中引入了多个针对 Next.js 16 的弃用警告,帮助开发者提前适应即将移除的功能。