Next.js核心原理深度解析
Next.js 是基于 React 的全栈框架,用文件系统路由、多种渲染模式(SSG、SSR、ISR)与 React Server Components 把繁琐工程全部约定化。 它代表全栈 React 方向,面试常考 App Router 与 Pages Router 区别、ISR 的增量更新机制与 RSC 的服务端渲染心智。
一句话概括
Next.js 是 Vercel 维护的、基于 React 的全栈框架,用三大设计——文件系统路由、多种渲染模式(SSG/SSR/ISR)、React Server Components(App Router)——把路由、渲染策略、构建配置这些繁琐工程全部”约定化”。它代表了”全栈 React”的方向,是当前 React 生态的事实标准。
核心知识点
1. 文件系统路由:文件即路由
不用手动配 router,创建文件就声明了路由,这是 Next.js 最标志性的设计:
1
2
3
4
5
6
7
8
9
10
11
// app/ 目录结构 → 路由映射
// app/page.js → /
// app/about/page.js → /about
// app/blog/[slug]/page.js → /blog/:slug (动态路由)
// app/products/[...all]/page.js → /products/a/b/c (捕获所有)
// app/blog/[slug]/page.js
export default async function Post({ params }) {
const { slug } = await params; // 自动拿到动态参数
return <h1>文章:{slug}</h1>;
}
2. 三种渲染模式:SSG / SSR / ISR
Next.js 的核心能力是”按页面选择渲染策略”,靠导出的特殊函数控制:
1
2
3
4
5
6
7
8
9
10
11
// 1. SSG:构建时生成,适合博客/文档
export async function generateStaticParams() {
return [{ slug: 'a' }, { slug: 'b' }]; // 构建时预生成这些页面
}
// 2. ISR:SSG + 定时更新,适合电商商品页
export const revalidate = 60; // 每 60 秒后台重新生成一次
// 3. SSR:每次请求时渲染,适合个性化内容
export const dynamic = 'force-dynamic'; // 强制动态渲染
// 或直接在组件里用 cookies()/headers() 这类动态 API,自动变成 SSR
3. Server Components:默认在服务端渲染
App Router 的核心是 React Server Components——组件默认在服务端执行,只有需要交互时才标 'use client':
1
2
3
4
5
6
7
8
9
10
11
12
13
// 服务端组件(默认):可以直接查数据库,不打包进客户端 JS
export default async function ProductList() {
const products = await db.query('SELECT * FROM products'); // 直接访问数据库
return products.map(p => <ProductCard key={p.id} {...p} />);
}
// 客户端组件:需要交互(state/事件)时声明
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
4. 数据获取:Server Components 里直接 await
相比 Pages Router 的 getServerSideProps,App Router 让数据获取直接写在组件里:
1
2
3
4
5
6
7
// App Router:组件里直接 async/await 拿数据
export default async function Page() {
const data = await fetch('https://api.example.com/posts', { next: { revalidate: 60 } });
const posts = await data.json();
return <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>;
}
// fetch 的 next.revalidate 就是 ISR 的声明式写法
其实你每天都在用
- 打开 Vercel 部署的网站:很多官网、博客、营销页跑在 Next.js 上,你访问时首屏秒开,是 SSG/ISR 预渲染的功劳。
- 电商商品详情页:同一个页面,商品信息不变时走缓存的静态页,库存变化时后台重新生成——这就是 ISR 的
revalidate在运作。 - 文档站的侧边栏和搜索:Next.js 的文档站(如 Next.js 官方文档本身)用文件路由 + 静态生成,翻页几乎零延迟。
- 登录后看到的个性化首页:同一个 URL,未登录显示通用内容、登录后显示”你的数据”,是 SSR + cookie 动态渲染的典型。
use client和 Server Components 的混用:你用 React 写业务时,页面大部分是服务端组件(不占 JS 体积),只有按钮、表单标了'use client'——这已经是 2025+ React 开发的默认范式。
常见误解(FAQ)
❌ 误区一:Next.js 只能做 SSR。 错误。SSR 只是其中一种模式,Next.js 的强项恰恰是”多渲染模式”——SSG(构建时)、SSR(请求时)、ISR(定时再生)、CSR(客户端)可以按页面粒度混用,App Router 甚至默认就是静态渲染(尽可能静态化)。
❌ 误区二:App Router 里所有组件都是服务端组件。 错误。默认是服务端组件,但加了 'use client' 就是客户端组件。一个页面里通常两者混用:数据获取在服务端组件,交互在客户端组件。理解”哪些组件该在服务端、哪些该在客户端”是 App Router 的核心技能。
❌ 误区三:Server Components 里可以用 useState 和事件处理。 错误。服务端组件不能使用 hooks(useState/useEffect)、不能绑事件(onClick)、不能访问浏览器 API(window/localStorage)。需要交互就声明 'use client',这是 Server/Client Components 的分界。
❌ 误区四:revalidate = 60 意味着页面 60 秒后一定会更新。 错误。ISR 的 revalidate 是”后台重新生成的最小间隔”——请求到来时如果缓存已过期,会先返回旧缓存(stale-while-revalidate),同时在后台触发重新生成,下次请求才拿到新内容。不是到点就强制刷新。
一句话总结
Next.js 用”文件即路由 + 渲染模式可声明 + Server Components”把 React 从”前端库”升级成了”全栈框架”——它最强大的不是某个单一特性,而是让你用几个约定就同时获得路由、SSR、SSG、ISR 和 API 能力。