Next.js 教程:从零开始构建你的 Web 应用
1. 简介:什么是 Next.js?
Next.js 是一个基于 React 的开源 Web 开发框架,它提供了许多开箱即用的特性,简化了 React 应用的构建过程。 主要优势包括:
- 服务器端渲染 (SSR) 和静态生成 (SSG): 提升 SEO 和首屏加载速度。
 - 自动路由: 基于文件系统的路由,易于理解和管理。
 - 代码分割 (Code Splitting): 只加载用户需要的代码,优化性能。
 - 内置 CSS 和 Sass 支持: 方便样式管理。
 - API 路由: 快速创建 API 接口。
 - 图像优化: 自动优化图像大小和格式。
 - 快速刷新 (Fast Refresh): 实时预览代码更改。
 - 易于部署: 支持多种部署平台。
 
2. 准备工作:安装 Node.js 和 VS Code
- 
Node.js: Next.js 基于 Node.js 运行,因此你需要安装 Node.js。访问 nodejs.org/ 下载最新稳定版本。安装完成后,打开终端或命令提示符,运行
node -v和npm -v检查是否安装成功。 - 
VS Code (Visual Studio Code): 一个流行的代码编辑器,具有丰富的扩展和调试功能。访问 code.visualstudio.com/ 下载并安装。建议安装以下 VS Code 扩展:
- ESLint: 用于代码检查。
 - Prettier: 用于代码格式化。
 - JavaScript (ES6) code snippets: 提供 JavaScript 代码片段。
 - Next.js snippets: 提供 Next.js 代码片段。
 
 
3. 创建第一个 Next.js 应用
使用 create-next-app 脚手架工具可以快速创建一个新的 Next.js 项目。
- 
打开终端或命令提示符,运行以下命令:
bash
代码解读
复制代码
npx create-next-app my-next-app # 或者使用 yarn # yarn create next-app my-next-app将
my-next-app替换为你想要的应用程序名称。在创建过程中,它会询问你是否使用 TypeScript、ESLint、Tailwind CSS 等。你可以根据需要选择。
 - 
进入项目目录:
bash
代码解读
复制代码
cd my-next-app - 
启动开发服务器:
bash
代码解读
复制代码
npm run dev # 或者使用 yarn # yarn dev这将启动 Next.js 开发服务器,通常在
http://localhost:3000运行。打开浏览器访问该地址,你将看到 Next.js 的欢迎页面。 
4. 理解 Next.js 的核心概念
- 
页面 (Pages):
- 
pages目录是 Next.js 应用的核心。 任何放在pages目录下的.js,.jsx,.ts, 或.tsx文件都会自动成为一个路由。 - 
例如,
pages/index.js对应于网站的根路径/,pages/about.js对应于/about路径。 - 
Next.js 使用文件系统路由,无需手动配置路由规则。
 - 
示例 (pages/index.js):
javascript
代码解读
复制代码
function HomePage() { return (欢迎来到我的 Next.js 应用!
这是一个首页。
); } export default HomePage;
 
 - 
 - 
组件 (Components):
- 
React 组件是构建用户界面的基本 building block。 Next.js 应用也是由组件构成的。
 - 
你可以将组件放置在任何目录中,通常放在
components目录中,以便更好地组织代码。 - 
示例 (components/MyComponent.js):
javascript
代码解读
复制代码
function MyComponent({ name }) { return你好, {name}!
; } export default MyComponent;
 
 - 
 - 
路由 (Routing):
- 
Next.js 使用基于文件系统的路由。
pages目录中的每个文件都定义了一个路由。 - 
动态路由: 你可以使用
[param]语法创建动态路由。 例如,pages/posts/[id].js可以匹配/posts/1,/posts/2, 等等。 - 
使用
useRouter钩子来访问路由信息 (例如,URL 参数)。 - 
示例 (pages/posts/[id].js):
javascript
代码解读
复制代码
import { useRouter } from \'next/router\'; function Post() { const router = useRouter(); const { id } = router.query; returnPost ID: {id}
; } export default Post;
 
 - 
 - 
静态资源 (Static Assets):
- 
public目录用于存放静态资源,例如图片、字体、robots.txt 等。 - 
你可以直接在代码中使用
/引用public目录下的文件。 - 
示例 (public/images/logo.png):
jsx
代码解读
复制代码
  
 - 
 - 
API 路由 (API Routes):
- 
pages/api目录用于创建 API 接口。 放在该目录下的文件会变成 API 端点。 - 
API 路由函数接收
req(请求对象) 和res(响应对象) 作为参数。 - 
示例 (pages/api/hello.js):
javascript
代码解读
复制代码
export default function handler(req, res) { res.status(200).json({ name: \'John Doe\' }); }访问
/api/hello将返回 JSON 数据{ \"name\": \"John Doe\" }。 
 - 
 - 
内置 CSS 支持 (Built-in CSS Support):
- Next.js 内置了对 CSS 和 Sass 的支持。
 - 你可以直接导入 CSS 文件,或者使用 CSS Modules。
 - 全局 CSS: 导入 
pages/_app.js文件中的 CSS 文件。 - CSS Modules: 使用 
.module.css文件,Next.js 会自动生成唯一的 class 名称,防止样式冲突。 
 - 
图像优化 (Image Optimization):
- 使用 
next/image组件来优化图像加载和显示。 next/image会自动调整图像大小,转换为最佳格式,并实现懒加载 (lazy loading)。
 - 使用 
 - 
字体优化 (Font Optimization):
- Next.js 可以自动优化字体加载,减少 Cumulative Layout Shift (CLS),提升用户体验。
 
 
5. 数据获取 (Data Fetching)
Next.js 提供了多种数据获取方式,适用于不同的场景。
- 
客户端数据获取 (Client-side Data Fetching):
- 
在客户端使用
useEffect钩子和fetchAPI 或axios等库来获取数据。 - 
适用于需要用户交互后才能获取的数据,或者数据更新频率较高的场景。
 - 
示例:
javascript
代码解读
复制代码
import { useState, useEffect } from \'react\'; function MyComponent() { const [data, setData] = useState(null); useEffect(() => { fetch(\'/api/data\') .then(res => res.json()) .then(data => setData(data)); }, []); if (!data) { returnLoading...
; } return
Data: {data.message}
; } export default MyComponent;
 
 - 
 - 
服务器端渲染 (Server-side Rendering - SSR):
- 
使用
getServerSideProps函数在每次请求时获取数据。 - 
数据在服务器端获取,然后将 HTML 渲染到客户端。
 - 
适用于需要 SEO 优化,或者数据经常更新的场景。
 - 
示例 (pages/index.js):
javascript
代码解读
复制代码
function HomePage({ data }) { returnData: {data.message}
; } export async function getServerSideProps(context) { const res = await fetch(\'http://localhost:3000/api/data\'); // 替换为你的 API 端点 const data = await res.json(); return { props: { data }, // 将数据传递给组件 }; } export default HomePage;
 
 - 
 - 
静态生成 (Static Site Generation - SSG):
- 
使用
getStaticProps函数在构建时获取数据。 - 
数据在构建时获取,然后生成静态 HTML 文件。
 - 
适用于数据不经常更新的场景,例如博客文章、产品目录等。
 - 
可以显著提升网站性能和安全性。
 - 
示例 (pages/about.js):
javascript
代码解读
复制代码
function AboutPage({ data }) { returnData: {data.message}
; } export async function getStaticProps() { const res = await fetch(\'http://localhost:3000/api/data\'); // 替换为你的 API 端点 const data = await res.json(); return { props: { data }, // 将数据传递给组件 }; } export default AboutPage;
 
 - 
 - 
增量静态再生 (Incremental Static Regeneration - ISR):
- 
结合了 SSG 和 SSR 的优点。
 - 
使用
getStaticProps函数生成静态页面,并设置revalidate属性来指定页面重新生成的时间间隔。 - 
在指定的时间间隔内,用户访问的仍然是缓存的静态页面。 当页面重新生成时,下次请求将会获取新的页面。
 - 
适用于数据更新频率不高,但又需要保持一定时效性的场景。
 - 
示例 (pages/blog/[id].js):
javascript
代码解读
复制代码
function BlogPost({ post }) { return ({post.title}
{post.content}
); } export async function getStaticPaths() { // 获取所有文章的 ID const res = await fetch(\'http://localhost:3000/api/posts\'); // 替换为你的 API 端点 const posts = await res.json(); const paths = posts.map(post => ({ params: { id: post.id.toString() }, })); return { paths, fallback: false, // 如果请求的 ID 不存在,则显示 404 页面 }; } export async function getStaticProps({ params }) { const { id } = params; const res = await fetch(`http://localhost:3000/api/posts/${id}`); // 替换为你的 API 端点 const post = await res.json(); return { props: { post }, revalidate: 10, // 每 10 秒重新生成一次页面 }; } export default BlogPost;
 
 - 
 
6. 使用样式 (Styling)
Next.js 支持多种 CSS 方案。
- 
全局 CSS (Global CSS):
- 
在
pages/_app.js文件中导入 CSS 文件。 - 
适用于定义全局样式,例如重置样式、通用样式等。
 - 
示例 (pages/_app.js):
javascript
代码解读
复制代码
import \'../styles/global.css\'; function MyApp({ Component, pageProps }) { return ; } export default MyApp; 
 - 
 - 
模块化 CSS (CSS Modules):
- 
使用
.module.css文件。 - 
Next.js 会自动生成唯一的 class 名称,防止样式冲突。
 - 
示例 (components/MyComponent.module.css):
css
代码解读
复制代码
.container { background-color: #f0f0f0; padding: 20px; border: 1px solid #ccc; } .title { font-size: 20px; color: blue; }示例 (components/MyComponent.js):
javascript
代码解读
复制代码
import styles from \'./MyComponent.module.css\'; function MyComponent() { return (我的组件
这是一个使用了 CSS Modules 的组件。
); } export default MyComponent;
 
 - 
 - 
Styled JSX:
- 
Next.js 内置的 CSS-in-JS 方案。
 - 
在 JSX 中编写 CSS 代码。
 - 
示例:
javascript
代码解读
复制代码
function MyComponent() { return (这是一个使用了 Styled JSX 的组件。
{` p { color: red; } `}
); } export default MyComponent;
 
 - 
 - 
Tailwind CSS:
- 
一个流行的 utility-first CSS 框架。
 - 
提供了一组预定义的 CSS 类,可以快速构建用户界面。
 - 
安装: 按照 Tailwind CSS 官方文档进行安装和配置。
 - 
示例:
jsx
代码解读
复制代码
function MyComponent() { return (我的组件
这是一个使用了 Tailwind CSS 的组件。
); } export default MyComponent;
 
 - 
 - 
Styled Components:
- 
另一个流行的 CSS-in-JS 库。
 - 
允许你使用 JavaScript 编写 CSS 代码,并将其与 React 组件关联。
 - 
安装:
npm install styled-components或yarn add styled-components - 
示例:
javascript
代码解读
复制代码
import styled from \'styled-components\'; const Container = styled.div` background-color: #f0f0f0; padding: 20px; border: 1px solid #ccc; `; const Title = styled.h1` font-size: 20px; color: blue; `; function MyComponent() { return (我的组件 这是一个使用了 Styled Components 的组件。
); } export default MyComponent;
 
 - 
 
7. 部署 (Deployment)
Next.js 应用可以部署到多种平台。
- 
Vercel:
- Vercel 是 Next.js 的官方部署平台,提供了最佳的 Next.js 支持。
 - 将你的代码推送到 GitHub、GitLab 或 Bitbucket 仓库,然后使用 Vercel 导入项目即可。
 - Vercel 会自动构建和部署你的应用,并提供免费的 SSL 证书和 CDN 加速。
 
 - 
Netlify:
- Netlify 是另一个流行的部署平台,也提供了良好的 Next.js 支持。
 - 与 Vercel 类似,你可以将代码推送到 GitHub、GitLab 或 Bitbucket 仓库,然后使用 Netlify 导入项目。
 
 - 
Docker:
- 你可以使用 Docker 将 Next.js 应用容器化,然后部署到任何支持 Docker 的平台,例如 AWS、Google Cloud、Azure 等。
 - 需要编写 Dockerfile 来定义容器的构建过程。
 
 
8. 高级主题
- 
中间件 (Middleware):
- 
中间件允许你在请求到达路由之前运行代码。
 - 
可以用于身份验证、重定向、功能标记、A/B 测试等。
 - 
示例 (middleware.js):
javascript
代码解读
复制代码
import { NextResponse } from \'next/server\'; export function middleware(req) { if (req.nextUrl.pathname.startsWith(\'/admin\')) { // 检查用户是否已登录 const isLoggedIn = false; // 替换为你的身份验证逻辑 if (!isLoggedIn) { return NextResponse.redirect(new URL(\'/login\', req.url)); } } return NextResponse.next(); } // 匹配需要执行中间件的路由 export const config = { matcher: [\'/admin/:path*\'], }; 
 - 
 - 
国际化 (Internationalization - i18n):
- Next.js 提供了内置的 i18n 支持,可以轻松创建多语言网站。
 - 使用 
next.config.js配置 i18n,并使用next/router钩子来切换语言。 
 - 
身份验证 (Authentication):
- 可以使用 NextAuth.js 等库来实现身份验证。
 - NextAuth.js 支持多种身份验证提供程序,例如 Google、GitHub、Twitter 等。
 
 - 
状态管理 (State Management):
- 可以使用 React Context API、Redux、Zustand、Recoil 等库来管理应用状态。
 - 选择合适的状态管理方案取决于应用的复杂程度。
 
 
9. 最佳实践
- 代码组织: 保持代码结构的清晰和一致,使用合理的目录结构和命名规范。
 - 组件化: 将 UI 拆分为小的、可重用的组件。
 - 性能优化: 使用 Next.js 的内置性能优化特性,例如代码分割、图像优化、字体优化等。
 - 错误处理: 妥善处理错误,提供友好的错误提示。
 - 测试: 编写单元测试和集成测试,确保代码质量。
 - 文档: 编写清晰的文档,方便团队协作和维护。
 
原文:https://juejin.cn/post/7481971120472801330


