现代 Web 渲染模式深度解析

现代 Web 渲染模式深度解析

在不断发展的 Web 开发领域,选择正确的渲染策略对于性能和用户体验至关重要。今天,我们将探讨 静态站点生成 (SSG)服务端渲染 (SSR) 以及由 Astro 和 Next.js 等框架普及的混合方法。

1. 静态站点生成 (SSG)

SSG 是在构建时生成 HTML 的过程。这是 Astro 的默认行为。

优点

  • 性能: HTML 是预渲染的,并从 CDN 提供服务。
  • 安全性: 运行时没有服务端处理,意味着攻击面更少。
  • 成本: 托管静态文件非常便宜。

配置示例 (Astro)

// astro.config.mjs
import { defineConfig } from 'astro/config';

export default defineConfig({
  output: 'static', // 默认值
});

2. 服务端渲染 (SSR)

SSR 在每次请求时生成 HTML。这对于高度动态的内容非常有用,例如用户仪表板或实时数据流。

注意: SSR 需要服务器环境(Node.js, Deno, Bun)来运行。

何时使用 SSR?

  1. 个性化内容(例如,“欢迎,Nova”)。
  2. 构建时未知的动态路由。
  3. 需要身份验证的受保护路由。

3. 增量静态再生 (ISR)

ISR 允许你在构建网站_之后_更新静态内容。你可以使用它来按特定间隔重新生成静态页面。

特性SSGSSRISR
构建时间
请求响应时间
数据新鲜度

代码对比

以下是不同模式下的数据获取方式。

客户端获取 (React)

import { useState, useEffect } from 'react';

export function UserProfile() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    fetch('/api/user').then(r => r.json()).then(setUser);
  }, []);

  if (!user) return <div>加载中...</div>;
  return <h1>{user.name}</h1>;
}

Astro 组件 (服务器优先)

---
// 这在服务器端(或构建时)运行
const response = await fetch('https://api.example.com/user');
const user = await response.json();
---

<h1>{user.name}</h1>

结论

没有“一刀切”的方案。

  • 对博客、文档和营销网站使用 SSG
  • 对动态应用使用 SSR
  • 使用 Astro 来混合搭配!

Rendering Architecture 图 1:复杂的系统需要深思熟虑的架构。