Next.js 是一个强大的 React 框架,支持多种渲染方式:客户端渲染(CSR/BSR)、静态站点生成(SSG)、服务端渲染(SSR)、增量静态再生(ISR)。本文将通过示例、代码、Mermaid图表以及优化策略,帮助你深入理解这些渲染方式,并掌握如何针对 SEO 进行优化。
一、渲染方式概述
1. 客户端渲染 (CSR / BSR)
定义: 在浏览器端通过 JavaScript 动态生成页面内容。React、Vue 的 SPA 项目默认采用 CSR。
特点:
- 优点:交互性强,用户体验流畅。
- 缺点:初始 HTML 几乎为空,需等待 JS 执行完成,导致首屏白屏和 SEO 不佳。
Next.js 示例:
jsx
"use client";
import { useEffect, useState } from "react";
import axios from "axios";
export default function Posts() {
const [posts, setPosts] = useState([]);
useEffect(() => {
axios.get('/api/posts').then(res => setPosts(res.data));
}, []);
return posts.length ? posts.map(p => <div key={p.id}>{p.title}</div>) : <p>加载中...</p>;
}
Mermaid 图:
flowchart LR
A[请求页面] --> B[服务器返回空HTML + JS]
B --> C[浏览器执行JS]
C --> D[AJAX拉取数据]
D --> E[填充DOM并渲染页面]
2. 静态站点生成 (SSG)
定义: 构建时将页面预先生成静态 HTML 文件,每个用户访问时直接返回该文件。
特点:
- 优点:首屏极快、SEO 优秀。
- 缺点:需要重新构建才能更新数据。
Next.js 示例:
jsx
export async function getStaticProps() {
const posts = await getAllPosts();
return { props: { posts } };
}
export default function PostsPage({ posts }) {
return <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>;
}
Mermaid 图:
flowchart TD
A[构建阶段] -->|生成静态HTML| B[部署CDN/服务器]
B -->|用户访问| C[直接返回HTML]
3. 服务端渲染 (SSR)
定义: 每次请求时由服务器动态生成 HTML,并返回给浏览器。
特点:
- 优点:动态数据实时更新,SEO 友好。
- 缺点:每个请求都需要服务器计算,性能略逊于 SSG。
Next.js 示例:
jsx
export async function getServerSideProps() {
const data = await fetchData();
return { props: { data } };
}
Mermaid 图:
flowchart TD
A[用户请求] --> B[服务器获取数据并渲染HTML]
B --> C[返回完整HTML给浏览器]
4. 增量静态再生 (ISR)
定义: 基于 SSG 的优化机制,可定期重新生成页面,无需每次重新构建整个站点。
特点:
- 优点:兼顾性能与内容实时性。
- 缺点:内容更新存在短暂延迟。
Next.js 示例:
javascript
export async function getStaticProps() {
const posts = await getAllPosts();
return { props: { posts }, revalidate: 60 };
}
Mermaid 图:
flowchart TD
A[首次构建生成静态HTML] --> B[缓存到CDN]
B --> C[用户访问]
C -->|超过60秒触发再生| D[后台再生成HTML]
二、"use client" 与渲染模式
在 Next.js 13+ 的 App Router 中:
- 未加 "use client" 的组件 → Server Components,可参与 SSG/SSR/ISR。
- 页面级 "use client" → 整个页面以 CSR(BSR)模式运行。
优化策略: 将 "use client"
仅应用于需要交互的子组件,让页面主体继续享受服务端预渲染的优势。
示例结构:
graph TD
A[Server Component] --> B[SEO内容]
A --> C[Client Component - WeatherBanner]
A --> D[Client Component - Carousel]
三、Next.js 框架渲染方式对比
渲染方式 | 首屏速度 | SEO | 动态性 | 适用场景 |
---|---|---|---|---|
CSR/BSR | 中等 | 差 | 高 | 富交互SPA |
SSG | 极快 | 优 | 低 | 文档/博客 |
SSR | 快 | 优 | 高 | 电商、动态数据 |
ISR | 快 | 优 | 中 | 新闻、电商 |
四、如何提升 SEO
- 核心内容服务端渲染:拆分组件,确保主要文本通过 SSG/SSR 输出。
- 合理使用 ```:添加 ``、` 和 Open Graph 标签。
- 语义化 HTML :使用
<header>
、<main>
、<article>
、<footer>
。 - 图片优化 :使用
next/image
并加上alt
描述。 - 内容预取和缓存:使用 ISR 或服务端缓存策略提高内容更新与抓取效果。
这里只是简单列出几个点,专门的SEO优化还有很多方法
五、页面改造案例
假设一个首页,当前使用:
javascript
"use client";
import WeatherBanner from "@/components/WeatherBanner";
import Carousel from "@/components/Carousel";
优化策略: 移除页面级 "use client"
,仅在交互组件中声明。并配合 getStaticProps
或 getServerSideProps
预渲染关键内容:
javascript
// app/page.tsx
import WeatherBanner from "@/components/WeatherBanner"; // 客户端组件
import Carousel from "@/components/Carousel";
import { fetchQuotes } from "@/lib/api";
export default async function HomePage() {
const quotes = await fetchQuotes();
return (
<>
<Head>
<title>我的主页 - SEO优化</title>
<meta name="description" content="这是一个SEO优化后的Next.js主页" />
</Head>
<main>
<h1>欢迎来到我的主页</h1>
<article>{quotes.map(q => <p key={q.id}>{q.content}</p>)}</article>
<WeatherBanner />
<Carousel />
</main>
</>
);
}
六、总结
- 正确理解 BSR/CSR 与 SSG/SSR/ISR 的差别,选择合适的渲染模式。
- 合理使用 "use client" ,尽量保持核心内容在服务端渲染。
- SEO 优化要点:元数据、语义化结构、资源优化和性能提升。
通过上述策略,你可以在 Next.js 中同时兼顾 SEO 效果 和 优秀的用户交互体验。