如果你正在学习 React,或者想从零开始构建一个真正可以上线的网站,那么 Next.js 很可能会成为你遇到的第一个全栈 React 框架。
很多初学者会把 Next.js 理解成“React 的升级版”,但这个说法并不准确。React 主要负责构建用户界面,而 Next.js 在 React 之上提供了路由、服务端渲染、静态生成、数据请求、构建部署等一整套应用开发能力。
本文会从初学者的角度,介绍 Next.js 是什么、可以用来做什么、需要配合哪些技术,以及执行 next build --turbopack 后到底发生了什么。
Next.js 是一个基于 React 的 Web 应用框架,由 Vercel 团队维护。
React 解决的核心问题是:
如何使用组件声明式地描述页面界面?
而一个完整的网站还需要解决很多其他问题:
这些能力并不是 React 核心库的职责。Next.js 正是用来补足这些工程能力的。
可以简单地理解为:
React 是 UI 库,Next.js 是用于构建完整 Web 应用的 React 框架。
如果你熟悉Vue,那么 Next.js 之于 React 就类似 Nuxt 之于 Vue。
Next.js 的适用范围很广,从简单的个人网站到复杂的企业应用都可以使用。
例如:
这类网站通常比较重视搜索引擎优化、首屏加载速度和内容分享效果。Next.js 的服务端渲染和静态生成能力非常适合这些场景。
Next.js 可以用于构建:
商品详情等内容可以使用静态生成或服务端渲染,购物车和支付等交互则可以使用客户端组件。
例如:
这类应用通常交互丰富,但也同样需要路由、登录鉴权、接口调用、权限控制和部署能力。Next.js 可以同时承担前端页面和部分后端接口的工作。
Next.js 不仅能写页面,也可以编写:
不过,Next.js 并不意味着所有后端需求都应该写在 Next.js 中。复杂业务仍然可以使用独立的 .NET、Java、Node.js 或 Go 后端,Next.js 只负责前端和 BFF(Backend for Frontend)层。
Next.js 本身已经包含了很多基础能力,但在真实项目中,通常还会搭配其他工具。
React 是 Next.js 的基础。你需要掌握:
Next.js 不是绕过 React,而是把 React 放到了更完整的应用框架中。
Next.js 可以使用 JavaScript,但实际项目通常推荐 TypeScript。
TypeScript 可以帮助你:
新项目可以直接使用 TypeScript 创建:
npx create-next-app@latest my-app
创建过程中选择 TypeScript 即可。
Next.js 不强制要求某一种 CSS 方案。常见选择包括:
初学者可以先使用普通 CSS 或 CSS Modules,理解样式作用域后,再根据项目需要选择 Tailwind CSS 等方案。
如果不想从零开始编写按钮、弹窗、表格等组件,可以使用:
组件库不是 Next.js 的必需品。学习阶段建议先理解组件和布局原理,再引入组件库。
Next.js 支持原生的服务端数据请求,也可以搭配:
需要注意:数据请求和全局状态是两个不同的问题。
服务器返回的商品列表适合使用数据请求工具;登录用户、购物车或界面主题等跨组件状态,才可能需要状态管理工具。不要一开始就给所有数据都加进全局 Store。
Next.js 可以配合:
也可以通过 REST API 或 GraphQL 调用独立后端。
Next.js 可以做全栈应用,但它不是数据库,也不是 ORM。数据库、业务服务和页面框架仍然是不同的层次。
目前新项目通常使用 App Router。它使用 app 目录组织页面:
app/
├── layout.tsx
├── page.tsx
├── about/
│ └── page.tsx
└── posts/
└── [slug]/
└── page.tsx
文件和 URL 的关系大致如下:
| 文件 | URL |
|---|---|
app/page.tsx | / |
app/about/page.tsx | /about |
app/posts/page.tsx | /posts |
app/posts/[slug]/page.tsx | /posts/:slug |
layout.tsx 用于定义共享布局,例如导航栏、页脚和全局上下文。
App Router 默认使用 Server Components。
服务器组件的代码运行在服务器上,适合:
如果组件需要使用浏览器 API、点击事件或 React 状态,就需要在文件顶部添加:
"use client";
例如:
"use client";
import { useState } from "react";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
点击次数:{count}
</button>
);
}
初学者最容易犯的错误是:看到任何组件都加上 "use client"。这样虽然可能暂时解决问题,但会让更多代码发送到浏览器,失去服务器组件的一些优势。
更好的原则是:
默认使用服务器组件,只有在确实需要交互、状态或浏览器 API 时才使用客户端组件。
服务器组件的意思是在服务器把数据、计算结果等都组装到你需要的那个页面上,然后你在浏览器拿到的是一个静态的页面。
与之相对的,客户端组件,就是浏览器先从服务器上下载下来网页框架和脚本,然后那些脚本在你的浏览器上执行运算,最后组装完整的交互页面。
Next.js 支持多种渲染方式。
页面在构建时生成 HTML,适合:
优点是速度快、缓存简单、服务器压力小。
每次请求到达服务器时生成页面,适合:
浏览器加载 JavaScript 后再请求数据并更新页面,适合:
实际项目通常会混合使用这几种方式,而不是全站只选择一种。
next build --turbopack 后发生了什么?在开发环境中,你通常运行:
npm run dev
在生产环境中,则通常先构建:
next build --turbopack
这个命令的作用不是启动网站,而是把项目编译、分析并优化成可以部署的生产版本。
Next.js 会读取:
package.jsonnext.config.js 或 next.config.mjs它需要先知道项目使用了哪些功能,以及应该如何处理这些文件。
Next.js 会扫描 app 目录,识别:
例如 app/posts/[slug]/page.tsx 会被识别为动态路由。
Next.js 会把浏览器或服务器不能直接理解的代码转换成可运行代码:
如果项目存在类型错误或编译错误,构建通常会失败。
Turbopack 是 Next.js 使用的高性能构建工具,使用 Rust 编写,目标是提升开发和构建过程中的速度。
传统构建工具通常会对大量文件进行整体处理。Turbopack 更强调:
需要注意,--turbopack 只是选择构建工具,不会改变你的 React 组件写法,也不会自动把服务器组件变成客户端组件。
Next.js 会根据页面代码和数据请求方式判断页面的渲染策略。
如果页面不依赖每次请求都变化的数据,它可能在构建阶段生成静态内容。如果页面依赖请求 Cookie、用户身份或动态数据,它可能需要在请求时执行。
使用动态路由时,还可以通过 generateStaticParams 提前生成部分页面:
export async function generateStaticParams() {
const posts = await getPosts();
return posts.map((post) => ({
slug: post.slug,
}));
}
构建过程中还会处理:
代码分包意味着用户访问某个页面时,通常不需要下载整个网站的全部 JavaScript。
构建结果通常会写入:
.next/
其中包含:
一般不应该手动修改 .next 目录。部署时,应该通过 Next.js 的启动命令或平台提供的运行方式使用这些构建产物:
npm run start
初学者经常混淆下面三个命令:
npm run dev
npm run build
npm run start
next dev开发模式:
next build生产构建:
next start启动生产服务器:
next build;典型流程是:
npm run build
npm run start
客户端组件并不是“更正常”的组件,而是有明确运行边界的组件。将整个页面标记为客户端组件,可能导致:
只有以 NEXT_PUBLIC_ 开头的环境变量才适合暴露给客户端。数据库密码、API 密钥和签名密钥不能放进客户端代码。
例如:
DATABASE_URL=private-value
NEXT_PUBLIC_API_BASE_URL=https://api.example.com
前者只能在服务端使用,后者可以被浏览器看到。
Next.js 的服务端数据请求可能涉及缓存、重新验证和动态渲染。初学者看到“页面没有立即显示最新数据”时,通常需要检查:
不要只依赖“刷新浏览器”来判断数据是否更新。
在较新的 Next.js 版本中,动态路由参数的处理方式可能发生变化。编写页面时应该以当前版本的官方文档和类型提示为准,不要完全照搬几年前的教程。
next/imagenext/image 可以帮助处理:
但使用远程图片时,需要在 Next.js 配置中声明允许的图片域名。
Next.js 不会自动让页面变得无障碍。仍然需要注意:
alt;button 元素;label;本地开发环境和生产环境可能不同。上线前至少检查:
如果你是 React 初学者,可以按下面的顺序学习:
不要一开始就同时学习所有技术。先做一个包含首页、列表页、详情页和表单的小项目,通常比只看概念更容易建立整体理解。
Next.js 的价值不只是让 React 页面能够运行,而是提供了一套从路由、渲染、数据请求到生产构建的完整应用开发方案。
对于初学者来说,最重要的不是记住所有 API,而是理解几个基本边界:
next build 负责生成生产构建产物;next start 负责运行这些产物;掌握这些基础概念后,再学习鉴权、数据库、缓存、部署和性能优化,就会容易很多。
暂无评论,快来抢沙发吧!