前端框架不只是"写页面的工具"。它决定了:
理解渲染模式是选框架的前提。2026 年的主流框架都支持多种模式,但默认策略不同:
| 模式 | 何时渲染 | 适合场景 | SEO | 首屏速度 | 服务器成本 |
|---|---|---|---|---|---|
CSR |
浏览器端 | 登录后的仪表盘、工具 | ❌ 差 | ❌ 慢 | ✅ 低 |
SSR |
每次请求时 | 动态内容、个性化页面 | ✅ 好 | 🟡 中 | 🔴 高 |
SSG |
构建时 | 博客、文档、营销页 | ✅ 好 | ✅ 快 | ✅ 低 |
ISR |
构建时 + 按需重新验证 | 电商、内容站 | ✅ 好 | ✅ 快 | 🟡 中 |
Streaming SSR |
请求时流式 | 复杂页面局部加载 | ✅ 好 | ✅ 快 | 🟡 中 |
大多数 SaaS 产品采用混合渲染:
Next.js App Router、Nuxt 3、SvelteKit 都原生支持这种混合。Astro 更进一步——默认 SSG,按需"岛屿"式水合。
React 生态的元框架,Vercel 官方维护。App Router (2023+) 引入了 React Server Components,将服务端和客户端渲染深度整合。2026 年 React 19 稳定后,Next.js 是 React 全栈开发的事实标准。
app/ 目录下的文件即路由,layout.tsx 嵌套布局,loading.tsx 自动 SuspenserevalidatePath() / revalidateTag() 精准更新缓存// app/dashboard/layout.tsx — 嵌套布局
import { Sidebar } from '@/components/sidebar'
import { auth } from '@/lib/auth' // 认证检查
export default async function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
const session = await auth()
if (!session) redirect('/login')
return (
<div className="flex h-screen">
<Sidebar user={session.user} />
<main className="flex-1 overflow-auto">{children}</main>
</div>
)
}
// app/dashboard/page.tsx — 服务端组件,直接查数据库
import { db } from '@/lib/db'
export default async function DashboardPage() {
const stats = await db.query('SELECT * FROM user_stats WHERE uid = $1', [userId])
const recentOrders = await db.query('SELECT * FROM orders ORDER BY created_at DESC LIMIT 10')
return (
<div>
<h1>仪表盘</h1>
<StatsGrid data={stats} />
{/* 客户端组件:交互、动画、实时更新 */}
<LiveOrders initialData={recentOrders} />
</div>
)
}
// app/dashboard/actions.ts — Server Actions
'use server'
import { revalidateTag } from 'next/cache'
export async function updateProfile(formData: FormData) {
const name = formData.get('name') as string
await db.execute('UPDATE users SET name = $1 WHERE id = $2', [name, userId])
revalidateTag('user-profile') // 精准刷新
}
// middleware.ts — Edge Runtime,零冷启动延迟
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export function middleware(request: NextRequest) {
const token = request.cookies.get('session-token')?.value
// 受保护路由
if (request.nextUrl.pathname.startsWith('/dashboard')) {
if (!token) {
return NextResponse.redirect(new URL('/login', request.url))
}
// 可在此验证 token 有效性(Edge 限制:不能用 Node.js API)
}
// 已登录用户访问登录页 → 重定向到仪表盘
if (request.nextUrl.pathname === '/login' && token) {
return NextResponse.redirect(new URL('/dashboard', request.url))
}
return NextResponse.next()
}
export const config = {
matcher: ['/dashboard/:path*', '/login'],
}
• React 生态最大 — 组件库、教程、招人全占优
• RSC 是 React 官方方向,Vercel 和 React 团队紧密合作
• Vercel 部署体验极致 — 零配置、Preview Deploy、Edge Function
• App Router + Server Actions 大幅减少样板代码
• ISR 是内容型 SaaS 的杀手级特性
• TypeScript 支持一流
• RSC 心智模型复杂 — 服务端/客户端组件边界需明确
• App Router 仍有些坑(缓存策略、导航行为)
• Vercel 绑定风险 — 自部署比 Vercel 托管麻烦很多
• Bundle 体积偏大 — React runtime 本身就重
• 编译慢 — 大项目 next dev 启动和热更新越来越慢
• Breaking changes 频繁 — 13→14→15 变动不小
如果不需要 SSR:纯 Vite + React (SPA) 更简单。如果嫌 Next.js 太重:Remix 更轻量但生态小。如果要极致性能:看 SvelteKit。
Vue 生态的元框架,由 Vue 核心团队成员 Sébastien Chopin 主导。Nuxt 3 (2022+) 基于 Vue 3 + Vite,引入了 Nitro 服务器引擎,支持多种部署目标。Vue 在中国和欧洲市场尤其流行。
server/api/ 目录即 API 路由,内置 h3 框架// pages/dashboard.vue
<script setup lang="ts">
// Auto-imported — 不需要 import
const { data: stats, pending } = await useFetch('/api/user/stats', {
// key 用于 SSR 数据去重和客户端缓存
key: 'dashboard-stats',
// 默认值防止模板 undefined 报错
default: () => ({ revenue: 0, users: 0, orders: 0 }),
})
// 实时数据轮询
const { data: liveOrders } = await useFetch('/api/orders/live', {
poll: 5000, // 每 5 秒轮询
})
// 认证中间件
definePageMeta({
middleware: 'auth', // 会找 middleware/auth.ts
})
</script>
<template>
<div>
<h1>仪表盘</h1>
<div v-if="pending">加载中...</div>
<StatsGrid v-else :data="stats" />
<LiveOrders :orders="liveOrders" />
</div>
</template>
// server/api/user/stats.get.ts — API Route
export default defineEventHandler(async (event) => {
const session = await getUserSession(event)
if (!session) throw createError({ statusCode: 401 })
const stats = await db.query(`
SELECT revenue, user_count, order_count
FROM dashboard_stats WHERE tenant_id = $1
`, [session.tenantId])
return stats
})
// nuxt.config.ts — 继承 SaaS 基础 Layer
export default defineNuxtConfig({
extends: [
'@my-saas/base-layer', // 共享布局、认证、样式
],
// 只覆盖本项目特有配置
})
// layers/base/nuxt.config.ts — 基础 Layer
export default defineNuxtConfig({
app: {
head: { titleTemplate: '%s — MySaaS' },
},
modules: ['@nuxtjs/tailwindcss', '@nuxtjs/color-mode'],
// 基础 Layout、中间件、composables 都在此定义
// 子项目自动继承
})
• Vue 模板语法更直观 — 单文件组件 SFC 体验优秀
• Auto-imports 减少样板代码到极致
• Nitro 部署目标最多 — 不绑定任何平台
• 开发体验丝滑 — Vite HMR 极快
• Nuxt Modules 生态丰富 — 200+ 官方/社区模块
• 中文社区强 — 中国市场 Vue 占绝对主导
• Vue 生态总体小于 React — 组件库选择少
• 没有 RSC 等价物 — 服务端逻辑靠 API Route
• TypeScript 支持改善中,但不如 React 生态成熟
• Vue 3 的 Composition API 学习曲线不低
• 大规模 SPA 性能不如 Svelte/Solid
• 海外招 Vue 开发者比 React 难
如果不需要 SSR:Vite + Vue (SPA) 就够了。如果想用 Vue 但要更轻:Vinxi 是新选择。如果团队可切换技术栈:Next.js 生态更大。
Svelte 的官方应用框架,由 Svelte 创建者 Rich Harris 主导。Svelte 的核心哲学是编译时框架——没有虚拟 DOM,组件编译成原生 DOM 操作,运行时极小。SvelteKit 在此基础上提供 SSR/SSG/CSR 全支持。
$state()、$derived()、$effect(),比 Svelte 4 的编译器魔法更明确+page.server.ts 导出 actions<!-- src/routes/dashboard/+page.svelte -->
<script lang="ts">
// Svelte 5 Runes 语法
let searchQuery = $state('')
// Page data 由 +page.ts 的 load 函数提供
let { data } = $props()
// 派生状态:自动响应 searchQuery 变化
let filteredOrders = $derived(
data.orders.filter(o =>
o.customer.includes(searchQuery)
)
)
</script>
<div>
<h1>仪表盘</h1>
<StatsGrid stats={data.stats} />
<input bind:value={searchQuery} placeholder="搜索订单..." />
<ul>
{#each filteredOrders as order (order.id)}
<li>{order.customer} — {order.amount}</li>
{/each}
</ul>
</div>
// src/routes/dashboard/+page.ts — Load 函数
import type { PageLoad } from './$types'
export const load: PageLoad = async ({ fetch, parent }) => {
const { user } = await parent() // 从 layout 继承认证信息
const [statsRes, ordersRes] = await Promise.all([
fetch('/api/user/stats'),
fetch('/api/orders/recent'),
])
return {
stats: await statsRes.json(),
orders: await ordersRes.json(),
}
}
// src/routes/dashboard/+page.server.ts — Form Actions
export const actions = {
default: async ({ request, locals }) => {
const formData = await request.formData()
const name = formData.get('name') as string
await db.updateUserProfile(locals.user.id, { name })
return { success: true }
},
}
// src/routes/api/orders/+server.ts — API Route
import { json } from '@sveltejs/kit'
import type { RequestHandler } from './$types'
export const GET: RequestHandler = async ({ url, locals }) => {
const page = Number(url.searchParams.get('page') ?? '1')
const orders = await db.getOrders(locals.user.tenantId, { page })
return json(orders) // 类型自动推断到前端
}
// 类型在整个 app 中共享——前端 load 函数、API Route、
// 组件都能获得完整的 TypeScript 类型推导
// 这是 SvelteKit 的隐藏杀手级特性
• 运行性能最佳 — 无虚拟 DOM,编译时优化
• Bundle 体积最小 — 适合移动端和弱网环境
• 语法最简洁 — 写的代码量比 React/Vue 少 30-50%
• 类型安全端到端 — API Route → Load → Component 类型共享
• 开发体验极好 — HMR 快,心智模型简单
• Rich Harris(Svelte 作者)在 Vercel,有公司支持
• 生态最小 — 组件库、教程、招人都远少于 React/Vue
• Svelte 5 Runes 刚稳定,社区还在迁移中
• 大规模应用案例少 — 不如 Next.js 被验证过
• 第三方库需适配 Svelte — 不能直接用 React/Vue 库
• 企业支持不如 React (Meta) / Vue (社区)
如果喜欢编译时理念但想要更大生态:等 SolidStart 成熟。如果需要 React 兼容:Next.js 是唯一选择。如果追求极致简洁但不用 Svelte:Astro + 岛屿架构。
内容优先的 Web 框架,核心创新是岛屿架构 (Islands Architecture)——默认零 JS 输出,只在需要交互的"岛屿"才水合。更独特的是:Astro 可以在同一个项目里混用 React / Vue / Svelte / Solid 组件。2026 年 Astro 5 引入了 Content Layer API 和 Server Islands。
<ReactComponent client:load /> 只水合这个组件,其余保持纯 HTML---
// src/pages/index.astro — 营销首页,零 JS
import Hero from '../components/Hero.astro'
import Pricing from '../components/Pricing.astro'
import Newsletter from '../components/Newsletter.astro'
// 导入 React 交互组件 — 只这个组件会水合
import LiveDemo from '../components/LiveDemo.tsx'
---
<html>
<body>
<!-- 纯 HTML,零 JS -->
<Hero />
<Pricing />
<!-- 这个组件会水合,其余不会 -->
<LiveDemo client:visible />
<!-- 表单提交也不需要 JS -->
<Newsletter />
</body>
</html>
---
// src/components/Newsletter.astro — 表单不需要 JS
---
<form action="/api/subscribe" method="POST">
<input type="email" name="email" placeholder="your@email.com" required />
<button type="submit">订阅</button>
</form>
---
// src/components/LiveDemo.tsx — React 交互组件
---
import { useState } from 'react'
export default function LiveDemo() {
const [input, setInput] = useState('')
const [result, setResult] = useState('')
const handleSubmit = async () => {
const res = await fetch('/api/demo', {
method: 'POST',
body: JSON.stringify({ input })
})
setResult(await res.text())
}
return (
<div>
<input value={input} onChange={e => setInput(e.target.value)} />
<button onClick={handleSubmit}>试一试</button>
{result && <p>{result}</p>}
</div>
)
}
• 首屏性能碾压一切 — 默认零 JS
• 多框架共存 — 渐进迁移,不锁定
• 内容管理一流 — Content Collections + DB
• SEO 天然友好 — 纯 HTML 输出
• 学习成本低 — 会 HTML 就能写 Astro
• 不适合复杂 SPA — 岛屿间状态共享困难
• 交互多的 App 还是需要 Next.js/Nuxt
• 多框架混用增加维护成本
• 社区规模中等 — 不如 Next.js/Nuxt
• SSR 模式不如 Next.js 灵活
如果同时需要内容站 + 复杂 App:Next.js (App Router) 一个搞定。如果纯文档站:Docusaurus / VitePress 更专精。如果想要零 JS 但不需要多框架:SvelteKit SSG 模式。
Solid.js 的官方元框架。Solid.js 借鉴了 React 的 JSX 语法和 Hooks 概念,但用编译时响应式替代了虚拟 DOM——结合了 React 的熟悉感和 Svelte 的性能优势。SolidStart 提供了完整的 SSR/SSG/CSR 解决方案。
createSignal() 是核心原语,类似 React useState 但更精确// src/routes/dashboard.tsx
import { createSignal, createResource } from 'solid-js'
import { Title } from '@solidjs/meta'
export default function Dashboard() {
const [search, setSearch] = createSignal('')
// 资源:自动追踪依赖,search 变化时重新获取
const [orders] = createResource(search, async (q) => {
const res = await fetch(`/api/orders?q=${q}`)
return res.json()
})
return (
<div>
<Title>仪表盘 — MySaaS</Title>
<h1>仪表盘</h1>
<input
value={search()}
onInput={(e) => setSearch(e.currentTarget.value)}
/>
<Suspense fallback={<p>加载中...</p>}>
<For each={orders()}>
{(order) => <OrderCard order={order} />}
</For>
</Suspense>
</div>
)
}
// 服务端函数 — 类似 RPC
// src/routes/dashboard.ts (server function)
import { server$ } from 'solid-start/server'
export const getStats = server$(async () => {
return await db.getDashboardStats()
})
• 性能接近 Svelte — 无虚拟 DOM,细粒度更新
• JSX 语法 React 开发者零门槛
• 响应式模型比 React Hooks 更直观
• Bundle 小,运行时极轻
• 没有闭包陷阱(不像 React Hooks)
• 生态最小 — 组件库极少,社区规模有限
• SolidStart 还在 1.0 前期,API 可能变动
• 招人几乎不可能 — 需要内部培养
• 企业级案例几乎没有
• 第三方库兼容性差 — 不是 React 也不是 Svelte
如果想要 React 语法 + 性能但更稳定:Next.js + React Compiler。如果想要性能 + 编译时:SvelteKit 更成熟。如果想要 React 生态:Next.js 无可替代。
| 维度 | Next.js | Nuxt | SvelteKit | Astro | SolidStart |
|---|---|---|---|---|---|
| 底层框架 | React | Vue 3 | Svelte 5 | 多框架 | Solid.js |
| 渲染模式 | CSR/SSR/SSG/ISR/Streaming | CSR/SSR/SSG/ISR/Hybrid | CSR/SSR/SSG | SSG (主) / SSR | CSR/SSR/SSG |
| Bundle 体积 (Hello World) | ~85KB | ~50KB | ~10KB | ~0KB (默认) | ~15KB |
| 运行时性能 | 🟡 中 | 🟡 中 | ✅ 快 | ✅ 最快 | ✅ 快 |
| 开发体验 | 🟡 有坑 | ✅ 好 | ✅ 最好 | ✅ 好 | 🟡 良好 |
| 生态规模 | 🔴 最大 | 🟡 大 | 🟡 中 | 🟡 中 | 🟡 小 |
| 招人难度 | ✅ 容易 | 🟡 中(中国易) | 🔴 难 | 🔴 难 | 🔴 极难 |
| 部署灵活度 | 🟡 偏 Vercel | ✅ 多平台 | ✅ 多平台 | ✅ 多平台 | 🟡 中 |
| 成熟度 | ✅ 生产级 | ✅ 生产级 | ✅ 生产级 | ✅ 生产级 | 🟡 前期 |
| GitHub Stars | ~130K | ~55K | ~20K | ~50K | ~5K |
| 适合 SaaS 类型 | 全类型 | 全类型 | 性能敏感型 | 内容/营销型 | 工具型 |
Q1: 你的团队最擅长什么?
Q2: 产品形态是什么?
Q3: 性能是核心竞争力吗?
Q4: 需要快速招人吗?
不管选哪个框架,SaaS 前端都有一些通用的架构模式:
// 通用 SaaS 认证流程(以 Next.js 为例,其他框架同理)
// 1. Middleware 守卫:Edge 层拦截未认证请求
// 2. Layout 层获取 session:避免子页面重复获取
// 3. 客户端 token 刷新:access token 过期自动刷新
// lib/auth.ts — 统一认证工具
export async function getSession(): Promise<Session | null> {
// 服务端:从 cookie 验证 JWT
// 客户端:从内存/sessionStorage 读取
// 两者逻辑统一,框架无关
}
// 中间件模式(所有框架都有):
// Next.js: middleware.ts
// Nuxt: middleware/auth.ts
// SvelteKit: hooks.server.ts
// Astro: middleware.ts
// SolidStart: server functions + entry-server
// 多租户 SaaS 的前端策略
// 1. 子域名路由:{tenant}.mysaas.com
// 2. URL 路径:/t/{tenant}/dashboard
// 3. 运行时切换:登录后选择租户
// Next.js — 子域名路由
// middleware.ts
export function middleware(req: NextRequest) {
const hostname = req.headers.get('host')
const subdomain = hostname?.split('.')[0]
if (subdomain && subdomain !== 'www' && subdomain !== 'app') {
// tenant.mysaas.com → 重写为 /t/[tenant]/...
return NextResponse.rewrite(
new URL(`/t/${subdomain}${req.nextUrl.pathname}`, req.url)
)
}
}
// 所有框架的通用模式:
// - Layout 层获取 tenant 信息
// - CSS 变量实现品牌定制(主色、Logo)
// - Feature flag 按租户控制功能
// SaaS 仪表盘实时更新模式
// 1. WebSocket:双向实时(协作编辑、聊天)
// 2. SSE:单向推送(通知、状态更新)
// 3. Polling:简单但效率低(兼容性最好)
// 通用实时 Hook (框架无关)
function useRealtime<T>(url: string, initialValue: T) {
const [data, setData] = useState(initialValue)
useEffect(() => {
// 优先 SSE
const source = new EventSource(url)
source.onmessage = (e) => setData(JSON.parse(e.data))
// 降级 Polling
source.onerror = () => {
source.close()
const interval = setInterval(async () => {
const res = await fetch(url)
setData(await res.json())
}, 5000)
return () => clearInterval(interval)
}
return () => source.close()
}, [url])
return data
}
// Svelte 版本更简洁:
// const data = createRealtimeResource('/api/live')
// 自动追踪依赖,无需手动管理
如果你在构建 AI/Agent SaaS,前端框架选择有额外考量:
| AI SaaS 需求 | 最佳框架 | 原因 |
|---|---|---|
| AI Chat 界面 | Next.js / SvelteKit | 流式渲染 + 丰富组件库 |
| AI 代码编辑器 | Next.js | Monaco + react-dnd 生态 |
| AI Agent 可视化 | Next.js / SvelteKit | Canvas/WebGL 库 + 响应式状态 |
| AI 文档/知识库 | Astro | Content Collections + 零 JS |
| AI Dashboard | Next.js / Nuxt | Chart 库 + ISR + 认证生态 |
已经有项目在跑了,想换框架怎么办?
// 方案一:Module Federation(Webpack 5+ / Rspack)
// 新功能用新框架写,旧功能不变
// 适合大型遗留系统
// webpack.config.js (旧 React 应用)
new ModuleFederationPlugin({
name: 'legacy_app',
exposes: { './UserWidget': './src/widgets/UserWidget' },
})
// 新 Next.js 应用消费
const UserWidget = lazy(() => import('legacy_app/UserWidget'))
// 方案二:Astro 作为胶水层
// 新页面用 Astro 写,嵌入旧 React 组件
// <LegacyDashboard client:load /> — 旧 React 组件原封不动
// 逐步替换,不用 Big Bang 重写
// 推荐结构:Turborepo / Nx
// apps/
// marketing/ → Astro (营销站)
// dashboard/ → Next.js (仪表盘)
// docs/ → Astro/VitePress (文档)
// packages/
// ui/ → 共享组件 (React)
// shared/ → 工具函数、类型
// database/ → Prisma/Drizzle schema
// turbo.json
{
"pipeline": {
"build": { "dependsOn": ["^build"], "outputs": [".next/**"] },
"dev": { "cache": false }
}
}
不管选哪个框架,这些优化对所有 SaaS 前端都适用:
next/font / @fontsource,避免 CLS<link rel="preload"> 首屏 CSS/JS@next/bundle-analyzer / rollup-plugin-visualizerRSC 正在改变 React 开发范式。Next.js 是主要推动者,但 Remix/RedwoodJS 也在跟进。趋势:服务端优先,客户端按需。
Svelte 5 Runes、Solid.js、Qwik 都在走编译时路线。趋势:运行时越少越好。React Compiler 也在追赶这个方向。
Cloudflare Workers / Vercel Edge / Deno Deploy 让应用逻辑跑在边缘。趋势:框架要支持 Edge Runtime。Next.js/Nuxt/SvelteKit 都已支持。
Astro 开创的岛屿架构正在影响其他框架。Next.js 的 Partial Prerendering 就是受此启发。趋势:默认静态,交互按需。
| 资源 | 链接 |
|---|---|
| Next.js 文档 | nextjs.org/docs |
| Nuxt 文档 | nuxt.com/docs |
| SvelteKit 文档 | kit.svelte.dev/docs |
| Astro 文档 | docs.astro.build |
| SolidStart 文档 | start.solidjs.com |
| 框架对比 (2026) | framework-benchmarks |
| Agent 构建指南 | → Agent 构建方法论 |
| Agent 工具系统 | → 工具系统设计 |
| Agent 提示词工程 | → Cache Boundary / 注入防护 |