Skip to content

前置概念

CSR & SSR & SSG & ISR

CSR

CSR 即 Client Side Rendering,客户端渲染。

优点:

  1. 页面切换快。
  2. 减轻服务器压力,降低带宽消耗。
  3. 前后端分离,开发效率高。

缺点:

  1. 首屏加载慢。
  2. SEO 差。
  3. 对低端设备支持差。

常见技术方案:

  1. React + React Router
  2. Vue + Vue Router
  3. ……

SSR

SSR 即 Server Side Rendering,服务端渲染。

优点:

  1. 首屏加载快。
  2. SEO 好。
  3. 对低端设备支持好。

缺点:

  1. 页面切换慢。
  2. 服务器压力大,带宽消耗高。
  3. 前后端耦合,开发效率低。

常见技术方案:

  1. Next.js(React)
  2. Nuxt.js(Vue)
  3. ……

SSG

SSG 即 Static Site Generation,静态站点生成。

优点:

  1. 首屏加载快。
  2. SEO 好。
  3. 服务器压力小,带宽消耗低。

缺点:

  1. 生成静态页面比较耗时。
  2. 无法实时更新,不适合动态内容。

常见技术方案:

  1. VitePress
  2. ……

ISR

ISR 即 Incremental Static Regeneration,增量静态再生。

可以简单理解为:SSR + SSG

  • 基于静态生成(SSG)的策略,允许服务器在运行时按规则(间隔或按需)重新生成静态页面,从而在保留静态性能的同时支持内容及时更新。
  • 再生过程发生在服务器端;
  • 客户端只负责常规的水合,不承担 ISR 的再生工作。

常见实现包括设置 getStaticProps 的 revalidate、动态路由的 fallback,以及按需 revalidate 的 API。

详细说明
  1. 在 Server Component 中用 fetch 的 revalidate(按秒缓存 + 后台再生)

    js
    // app/posts/[id]/page.js (或 .tsx)
    export default async function PostPage({ params }) {
      const res = await fetch(`https://api.example.com/posts/${params.id}`, {
        next: { revalidate: 60 }, // 缓存 60s,过期后首次请求触发后台重建
      })
    
      if (!res.ok) throw new Error('fetch failed')
      const post = await res.json()
    
      return (
        <article>
          <h1>{post.title}</h1>
          <div dangerouslySetInnerHTML={{ __html: post.content }} />
        </article>
      )
    }
  2. 文件级别的 revalidate(同样适用于整个页面)

    js
    // app/posts/page.js
    export const revalidate = 60 // 整个页面每 60 秒可重新生成一次
    
    export default async function PostsPage() {
      const res = await fetch('https://api.example.com/posts')
      const posts = await res.json()
      return (
        <ul>
          {posts.map((p) => (
            <li key={p.id}>{p.title}</li>
          ))}
        </ul>
      )
    }
  3. 按需立即使某路径/标签再生(Webhooks / CMS 集成)

    js
    // app/api/revalidate/route.js
    import { NextResponse } from 'next/server'
    import { revalidatePath, revalidateTag } from 'next/cache'
    
    export async function POST(req) {
      const body = await req.json()
      // 验证 secret,避免被滥用
      if (body.secret !== process.env.MY_REVALIDATE_SECRET) {
        return NextResponse.json({ message: 'Invalid token' }, { status: 401 })
      }
    
      try {
        if (body.path) {
          revalidatePath(body.path) // 立即重新生成指定路径(例如 '/posts/123')
        }
        if (body.tag) {
          revalidateTag(body.tag) // 重新生成与该 tag 相关的缓存
        }
        return NextResponse.json({ revalidated: true })
      } catch (err) {
        return NextResponse.json({ error: err.message }, { status: 500 })
      }
    }

RCC & RSC

React 组件分为两种类型:

  • RSC:React Server Component,即 “服务端组件”
    • 所有组件默认均为 RSC。
  • RCC:React Client Component:即 “客户端组件”
    • RCC 用于处理交互性的场景,需手动声明,在文件顶部添加 'use client' 即可。
  1. RCC 下只能嵌套使用 RCC,但是可以通过 client 组件来引入 RSC。
  2. RSC 下可以嵌套使用 RSC 和 RCC。

基于 MIT 许可发布