Astro
The web framework for content-driven websites. Zero JS by default, islands architecture, UI-agnostic.
🎯 为什么需要它
你想建一个内容驱动的网站(博客、文档站、营销页、作品集),但面对 Next.js 的复杂度和 React 生态的 JS 膨胀感到疲惫。你需要的是:写出的页面默认零 JS、性能开箱即用、同时还能在需要交互的地方用你熟悉的框架。
Astro 就是为此而生的。它是一个专注于内容驱动网站的 Web 框架,通过 Islands Architecture(岛屿架构)实现"默认零 JS,按需水合"的极致性能策略。
一句话定位
内容优先、零 JS 默认、按需交互的现代 Web 框架。
它解决的核心痛点
- JS 膨胀 — 传统 SPA 框架(React/Vue)整页水合,首屏加载大量无用 JS
- 框架锁定 — 一旦选定 React/Vue,整个项目都被绑定,无法混合使用
- 内容网站不需要 SPA — 博客、文档、营销页不需要客户端路由和状态管理
- SEO 和性能要求 — Core Web Vitals 直接影响搜索排名,静态 HTML 是最优解
✅ 核心优势
| 优势 | 说明 |
|---|---|
| Zero JS by Default | Astro 组件默认编译为纯 HTML+CSS,不发送任何 JS 到客户端。只有你显式标记的交互组件才会加载 JS |
| Islands Architecture | 页面中每个交互组件是一个独立"岛屿",可以按需、并行、独立水合,互不阻塞 |
| UI 框架无关 | 同一页面可以混用 React、Vue、Svelte、Solid、Preact、HTMX、Web Components,甚至不使用任何框架 |
| Content Collections | 内置内容集合系统,对 Markdown/MDX 进行类型安全的组织、校验和查询 |
| Server-first | 默认服务端渲染,将计算从用户设备转移到构建时或服务端 |
| 混合渲染 | 支持 SSG(静态生成)、SSR(服务端渲染)、Server Islands(动态岛屿),同一项目可混合使用 |
| Vite 驱动 | 开发体验极快,HMR 毫秒级响应 |
| 渐进式复杂度 | 从纯 HTML 开始,需要时再添加框架、SSR、动态功能,不被迫学习不需要的东西 |
Client Directives(水合指令)
Astro 的核心机制是通过指令控制组件何时、如何加载 JS:
<!-- 默认:纯 HTML,无 JS -->
<MyComponent />
<!-- 页面加载时立即水合 -->
<ReactCounter client:load />
<!-- 组件进入视口时才水合 -->
<ImageCarousel client:visible />
<!-- 浏览器空闲时水合 -->
<ChatWidget client:idle />
<!-- 仅在客户端渲染(跳过 SSR) -->
<MapComponent client:only="react" />
⚡ 性能表现
构建性能
- 构建工具:Vite(开发)+ esbuild/rollup(生产)
- 开发 HMR:毫秒级热更新,Vite 的核心优势
- 构建速度:中大型站点(数百页)通常 5-15 秒完成构建
运行时性能
- 默认零 JS:纯内容页面(如博客文章)输出为纯 HTML+CSS,JS 体积为 0
- 按需加载:只有标记了
client:*指令的组件才会发送 JS - 并行水合:各岛屿独立加载,互不阻塞
- Core Web Vitals:Lighthouse 评分普遍 95+,在所有主流 SSG 中排名顶级
Astro 官方对比测试显示:相同功能的页面,Astro 的 JS 传输量比 Next.js 少 90% 以上。一个典型的博客首页,Next.js 需要 ~200KB JS,Astro 只需 ~0KB(纯静态)或按需加载极小量 JS。
🚀 快速上手
Step 1:创建项目
npm create astro@latest my-site
cd my-site
交互式向导会引导你选择模板(空白 / 博客 / 文档等)和是否使用 TypeScript。
Step 2:项目结构
my-site/
├── src/
│ ├── pages/ # 文件路由:每个 .astro/.md 文件是一个页面
│ │ ├── index.astro
│ │ └── about.md
│ ├── components/ # 可复用组件(.astro / .tsx / .vue / .svelte)
│ ├── layouts/ # 页面布局模板
│ └── content/ # 内容集合(Markdown/MDX)
│ └── blog/
│ ├── post-1.md
│ └── post-2.md
├── public/ # 静态资源(图片、字体等)
├── astro.config.mjs # Astro 配置
└── package.json
Step 3:编写 Astro 组件
---
// 组件脚本(服务端执行,不会发送到客户端)
const title = "Hello Astro"
const items = ["Fast", "Flexible", "Fun"]
---
<h1>{title}</h1>
<ul>
{items.map(item => <li>{item}</li>)}
</ul>
<style>
h1 { color: #ff5d01; }
</style>
Step 4:使用内容集合
// src/content.config.ts
import { defineCollection, z } from "astro:content"
const blog = defineCollection({
type: "content",
schema: z.object({
title: z.string(),
pubDate: z.date(),
description: z.string(),
}),
})
export const collections = { blog }
---
// src/pages/blog/[...slug].astro
import { getCollection } from "astro:content"
export async function getStaticPaths() {
const posts = await getCollection("blog")
return posts.map(post => ({
params: { slug: post.slug },
props: { post },
}))
}
const { Content } = await render(Astro.props.post)
---
<article>
<h1>{post.data.title}</h1>
<Content />
</article>
Step 5:添加框架集成
# 添加 React 支持
npx astro add react
# 添加 Vue 支持
npx astro add vue
# 添加 Tailwind CSS
npx astro add tailwind
Step 6:开发与构建
# 开发模式(带 HMR)
npm run dev
# 构建静态站点
npm run build
# 预览构建结果
npm run preview
Step 7:部署
# 静态部署(默认 SSG)
# 直接将 dist/ 目录部署到任意静态托管
# SSR 部署(需要适配器)
npx astro add vercel # Vercel
npx astro add netlify # Netlify
npx astro add node # Node.js 服务器
📦 适用场景
✅ 最佳使用场景
| 场景 | 为什么适合 |
|---|---|
| 博客 / 技术文档 | Astro 的核心设计目标,Content Collections + Markdown/MDX 原生支持 |
| 营销落地页 | 零 JS 输出,Core Web Vitals 满分,SEO 最优 |
| 企业官网 / 作品集 | 内容为主,少量交互(表单、轮播),Islands 按需加载 |
| 文档站 | 官方有 Starlight 文档主题,开箱即用 |
| 从多框架迁移 | 已有 React/Vue/Svelte 组件可以渐进式迁入,无需重写 |
| 电商产品页 | 大量静态内容 + 少量交互(购物车、筛选),Server Islands 支持动态内容 |
⚠️ 不太适合的场景
| 场景 | 原因 |
|---|---|
| 复杂 Web 应用 | SPA 路由、全局状态管理、实时协作 — 这是 Next.js/Remix 的主场 |
| 后台管理系统 | 大量表单、表格、实时数据 — 客户端交互密集,Astro 的优势无法发挥 |
| 实时应用 | WebSocket、实时更新 — 需要持续客户端运行时 |
⚠️ 已知坑
Astro 组件语法是 HTML 超集 + 类 JSX 表达式 + frontmatter 脚本。虽然比 React 简单,但与传统 HTML 开发仍有差异,需要适应"服务端脚本在 --- 之间"的模式。
虽然支持同时使用 React + Vue + Svelte,但实际项目中混用多个框架会增加依赖管理、类型系统、团队协作的复杂度。建议项目统一使用 1-2 个框架。
默认模式是纯静态 SSG。如果需要 SSR 或 Server Islands,必须安装平台适配器(Vercel/Netlify/Node),配置和部署流程会更复杂。
Astro v5 对内容集合 API 进行了重大重构(Content Layer API),从旧版本升级需要手动迁移 content/config.ts 的 schema 定义。
Astro 默认是 MPA(多页应用),页面切换是整页刷新。虽然有 View Transitions API 支持,但如果你的场景需要 SPA 级别的页面切换体验,需要额外配置。
🆚 竞品对比
| 维度 | Astro | Next.js | Hugo | Gatsby |
|---|---|---|---|---|
| 定位 | 内容驱动网站 | 全栈 Web 应用 | 极速 SSG | React SSG |
| 语言 | TypeScript | TypeScript | Go | TypeScript |
| 默认 JS | 零 JS | 大量 JS | 零 JS | 大量 JS |
| 框架支持 | React/Vue/Svelte/Solid/HTMX | React only | Go 模板 | React only |
| 渲染模式 | SSG + SSR + Islands | SSG + SSR + RSC + ISR | SSG only | SSG + DSG |
| 构建速度 | 快(Vite) | 中等 | 极快(Go) | 慢 |
| 学习曲线 | 低 | 中高 | 中等 | 中高 |
| 社区规模 | 59.5k stars | 130k+ stars | 78k+ stars | 55k+ stars |
| 适合场景 | 内容站、博客、文档 | SaaS、电商、复杂应用 | 大型文档、博客 | React 数据密集站 |
选型建议
- 选 Astro:内容驱动网站,追求极致性能,团队有多框架背景,不想被 React 锁定
- 选 Next.js:需要复杂交互、认证、API 路由、全栈能力的 Web 应用
- 选 Hugo:超大规模内容站(万级页面),追求极致构建速度,不介意 Go 模板
- 选 Gatsby:已有 React 生态深度绑定,需要 GraphQL 数据层(但 2026 年新项目不推荐)
🌍 生态社区
项目数据
| 指标 | 数据 |
|---|---|
| GitHub Stars | 59,500+ |
| 主语言 | TypeScript 94.1% |
| 最新版本 | v6(2026 年初发布) |
| License | MIT |
| 维护团队 | Astro Technology Company(有商业支持) |
| npm 周下载 | 百万级 |
官方集成
| 类别 | 集成 |
|---|---|
| UI 框架 | @astrojs/react, @astrojs/vue, @astrojs/svelte, @astrojs/solid, @astrojs/preact, @astrojs/lit |
| SSR 适配器 | @astrojs/vercel, @astrojs/netlify, @astrojs/node, @astrojs/cloudflare |
| 内容 | @astrojs/mdx, @astrojs/markdoc |
| 样式 | @astrojs/tailwind |
| 性能 | @astrojs/partytown(第三方脚本隔离) |
| 文档 | Starlight(官方文档主题框架) |
社区资源
- 官方文档:docs.astro.build — 质量极高,有交互式示例
- Astro.new:浏览器内直接打开模板项目,零配置体验
- Discord 社区:活跃度极高,官方团队成员直接答疑
- Astro Jobs:astro.jobs — 专门的 Astro 职位平台
💡 引入评估
值不值得引入?
如果你在做内容驱动的网站(博客、文档、营销页、作品集),Astro 是 2026 年的最佳选择。零 JS 默认 + Islands 按需水合的策略在性能和开发体验之间找到了极佳的平衡点。59.5k stars 和活跃的商业团队保证了项目的长期可持续性。
引入决策树
- 你的网站是内容驱动的吗(博客/文档/营销/作品集)?→ 是 → 选 Astro
- 你需要复杂客户端交互(实时协作/复杂表单/仪表盘)?→ 是 → 考虑 Next.js
- 你需要极致构建速度 + 超大规模内容(万级页面)?→ 是 → 考虑 Hugo
- 你想在需要交互的地方用 React/Vue/Svelte?→ 是 → Astro 依然支持(Islands)
🔗 相关链接
| 资源 | 链接 |
|---|---|
| GitHub 仓库 | withastro/astro |
| 官方文档 | docs.astro.build |
| 官方博客 | astro.build/blog |
| 模板市场 | astro.build/themes |
| 集成目录 | astro.build/integrations |
| 在线体验 | astro.new |
| Starlight 文档框架 | starlight.astro.build |