你以为你在选框架,其实你在选“默认哲学”
Nuxt、Next.js、Astro 这三个名字,最近几年几乎就是前端“框架选型”绕不开的三座大山。
它们都能做 SSR,也都能做 SSG;都能做内容站,也都能做应用;甚至都开始往“全栈 + 边缘”靠。
但如果你真的在项目里用过,会发现它们的差异不在“能不能做”,而在:
- 它们默认鼓励你怎么做
- 它们最舒服的那条路径是什么
- 你偏离那条路径时,成本会怎样上涨
本文我会用一套统一维度(渲染模型 / DX / 性能默认值 / 全栈能力 / 内容能力 / 部署与成本),把三者的优缺点拆开讲,并提供一个“拿来就能用”的选型流程。
一句话定位(先把结论钉在墙上)
- Next.js:React 世界的“全能型应用框架”,擅长把应用做大、做复杂,代价是范式多、心智负担也大。
- Nuxt:Vue 世界的“约定优于配置”全栈框架,SSR 默认打开、自动导入、Nitro API 层一条龙,团队协作很省心。
- Astro:内容优先、性能优先的框架,默认把页面渲染成静态 HTML,只在需要交互的地方用 Islands(部分水合)。
其中 Astro 的 Islands Architecture 与 selective hydration(只让需要交互的组件加载/水合)是它的核心卖点:默认把大部分页面变成静态 HTML,只在特定组件上用 client:* 指令启用交互 [6]。
1. 核心差异:渲染模型与“默认路径”
同样叫 SSR/SSG,这三者的“默认路径”完全不同。
Next.js:以 React Server Components 为中心的混合渲染
Next.js App Router 默认使用 Server Components:页面/布局在服务端执行,只有需要交互的部分才 "use client" [12]。
这意味着:
- 你可以把数据获取、拼装、鉴权放在 server side,尽量少发 JS
- 但你也要理解 Server/Client Component 的边界,以及数据/缓存策略
Next.js 还在推 Partial Prerendering (PPR):同一路由里组合静态 shell + 动态洞(Suspense streaming),加速首屏同时支持个性化动态数据 [14]。
Nuxt:SSR 默认开启 + Nitro 统一服务端输出
Nuxt 3 的特点是“开箱即用 SSR”,并且用 Nitro 作为 server engine:
server/api/* 目录即 API routes
- 产物打包进
.output,可部署到 Node/Serverless/Edge
- 支持 hybrid rendering:通过 route rules 为不同路由配置 prerender / isr / ssr:false 等策略 [16,18,19]
一句话:Nuxt 倾向把“网站 + API + 渲染策略”揉成一个统一系统。
Astro:默认静态 HTML + Islands(按需水合)
Astro 默认把组件渲染成 HTML,不会自动把 JS 发到客户端。如果某组件需要交互,你必须显式标注:
---
import Counter from '../components/Counter.jsx'
---
<Counter client:load />
这套 Islands Architecture 的核心目的,是避免整站 SPA 那种“把页面整体水合”的重 JS 负担 [6]。
2. 优缺点拆解(同一套对比维度)
2.1 性能(默认值)
Astro
- 优点:默认 zero-JS(除非你标注 islands),对内容站非常友好;可把交互推迟到
client:visible / client:idle。
- 缺点:一旦你要做“大量交互 + 全局状态 + 类 SPA 体验”,你会发现自己其实在 Astro 里“嵌了一个 SPA”,这时优势会被削弱。
Next.js
- 优点:Server Components 默认减少客户端 JS;Streaming/Suspense、PPR 等能力让你可以更精细地混合静态与动态 [12,14]。
- 缺点:想把性能做好需要理解 caching、RSC 边界、以及哪些组件会触发动态渲染(cookies/headers 等)。
Nuxt
- 优点:SSR 默认开启,且有 route rules 做 hybrid rendering,可以把营销页 prerender、后台区 ssr:false 等 [19]。
- 缺点:Vue SSR 的一些典型坑(仅浏览器 API、hydration mismatch)依旧存在,需要团队有 SSR 经验。
2.2 开发体验(DX)与心智负担
Next.js
- 优点:生态最大,React 社区资源丰富;全栈能力完整。
- 缺点:范式切换多(Server/Client Components、Route Handlers、Server Actions、cache 规则),对团队统一规范提出更高要求。
Nuxt
- 优点:约定非常强:文件路由、auto-import、内置数据获取 composables、SSR 默认开启 [16]。
- 缺点:强约定也意味着“按 Nuxt 的方式写”最舒服;如果团队习惯完全自定义的架构,会觉得它“管太多”。
Astro
- 优点:对“内容 + 少量交互”的网站,开发链路非常短;写起来像模板 + 组件。
- 缺点:当你做应用功能时,会遇到“你到底要不要把这块做成 React/Vue island?”的架构决策,这类决策会随着交互复杂度迅速增多。
2.3 全栈能力(API / 中间层 / 鉴权)
- Next.js:Route Handlers + Server Actions + 中间件等,适合做完整应用。
- Nuxt:Nitro 把 API routes、middleware、server utils 做得很统一,且
$fetch 在服务端可直接调用对应 handler,避免多一次 HTTP 往返(在同构场景很好用)[18]。
- Astro:也有 endpoints/SSR/middleware,近年增强明显,但它的 DNA 仍更偏内容站(你当然能做全栈,只是“默认路径”不在这里)[8]。
2.4 内容能力(Markdown/MDX、内容集合、博客/文档)
- Astro:内容体系非常强,Islands 模式天然适配博客/文档/营销站;官方对内容驱动站点定位明确 [8]。
- Next.js:可以用 MDX/Contentlayer/自建内容管线,灵活但需要更多工程投入。
- Nuxt:也能用 content module(生态方案多),但通常需要你在 Nuxt 的 SSR 与内容模块之间做好配合。
3. 用“同一个需求”做例子:三套实现方式对比
假设我们要做一个典型内容站:
- 文章详情页(静态,SEO)
- 评论组件(交互)
- 顶部用户头像(登录后个性化)
3.1 Astro:默认静态,只给评论做 island
---
import Comments from '../components/Comments.jsx'
---
<article>
<h1>Post title</h1>
<p>...content...</p>
<Comments client:visible />
</article>
关键点:只有 Comments 会发 JS,其余是静态 HTML(这是 Astro Islands 的核心思路)[6]。
3.2 Next.js:Server Component 渲染内容 + Client Component 处理交互
// app/posts/[slug]/page.tsx
import { Suspense } from 'react'
import Comments from './Comments'
export default async function Page({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.html }} />
<Suspense fallback={<p>Loading comments...</p>}>
<Comments />
</Suspense>
</article>
)
}
// app/posts/[slug]/Comments.tsx
'use client'
export default function Comments() {
// useEffect, events...
return <div>...</div>
}
Next 的逻辑是:默认 Server Components;需要交互时再用 "use client" [12]。
3.3 Nuxt:route rules 静态化文章、评论懒水合
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
'/posts/**': { isr: true },
'/admin/**': { ssr: false },
},
})
Nuxt 的 route rules 可以按路由定义 prerender/ISR/纯 CSR 等策略,属于它的强项之一 [19]。
4. 选型流程:用 6 个问题做决策
Nuxt / Next / Astro 选型 6 问
1
Q1 交互占比?
大量交互(像应用)还是少量交互(像内容站)
2
Q2 生态与招聘?
团队是 React 为主还是 Vue 为主?是否需要最大生态兜底?
3
Q3 默认性能目标?
是否把 Core Web Vitals 当硬指标?
4
Q4 全栈需求?
是否需要框架内建的 API / 鉴权 / 中间层能力?
5
Q5 内容管线?
内容来源是 MD/MDX 还是 CMS?是否需要类型安全内容层?
6
Q6 部署与成本?
目标平台(Vercel / Node / Edge / 静态 CDN)与预算
5. 什么时候选谁(给出可执行的结论)
优先选 Astro 的场景
- 博客/文档/营销站/作品集:内容为主,交互为辅
- 目标是“默认快”,尽量少发 JS
- 你希望按组件精确控制交互加载时机(
client:visible 等)[6]
优先选 Next.js 的场景
- 你在做一个“应用”:登录、权限、复杂数据流、长生命周期迭代
- 团队以 React 为主,希望享受最大生态
- 你需要混合静态与动态,并且愿意为 RSC/缓存策略付出学习成本 [12,14]
优先选 Nuxt 的场景
- 团队以 Vue 为主,希望 SSR/路由/数据获取/工程结构开箱即用 [16]
- 你希望通过 route rules 做“同一项目多渲染策略”(内容区静态化,后台区 CSR)[19]
- 你想要一个统一的 server engine(Nitro)把 API 与部署打包成一致的输出 [18]
结语:别问“谁更强”,问“你要把项目长成什么样”
如果你把项目看成一棵树:
- Next.js 更像一片热带雨林:物种最多,生长空间最大,但你得学会管理生态。
- Nuxt 更像一座现代化温室:管道铺好,水电齐全,按规范种,产量稳定。
- Astro 更像一片修剪得很漂亮的草坪:默认轻、默认快,但你要盖摩天楼就得额外加钢筋。
框架不是用来争高低的,是用来降低你未来一年维护成本的。
References