Astro 是一个以内容为中心的现代 Web 框架,由 Fred K. Schott 于 2021 年创建,目前由 Astro 团队 维护,已发布到 v7.x 版本(截至 2026 年中)。它最核心的设计理念是:默认零 JavaScript,只在必要时加载交互代码。
---
// 服务器端渲染,零 JS 输出
const items = await fetchPosts();
---
<ul>
{items.map(item => (
<li>{item.title}</li>
))}
</ul>岛屿架构(Islands Architecture)
Astro 最具革命性的概念是 岛屿架构(Islands Architecture),由 Jason Miller(Preact 作者)提出。它将页面拆分为:
- 静态大陆 — 纯 HTML,零 JavaScript
- 交互岛屿 — 独立的交互组件,按需加载
每个“岛屿”都是一个独立的交互组件,使用 client:* 指令控制何时 hydrate:
<!-- 页面加载后立即 hydration -->
<InteractiveChart client:load />
<!-- 适用:首屏可见的交互元素 -->
<!-- 如:导航栏、搜索框 -->这种架构的直接收益是 页面体积大幅缩减。根据 Astro 官方基准测试,同页面 Astro 输出的 JavaScript 量平均减少 80-95%。
- 构建阶段:Astro 编译所有
.astro文件为纯 HTML。React/Vue/Svelte 组件在服务端渲染为 HTML 字符串。 - 提取岛屿:带有
client:*指令的组件被标记为“岛屿”,其 JS 依赖被提取为独立的 chunk。 - 按需加载:浏览器解析 HTML 时,根据指令类型(idle/visible/media)异步加载岛屿的 JS chunk 并 hydrate。
- 共享运行时:多个同框架岛屿共享同一个运行时实例(例如所有 React 岛屿共用 React 运行时,不会重复加载)。
内容集合(Content Collections)
Content Collections 是 Astro 内置的内容管理方案,通过文件系统路由 + Zod 模式验证,让 Markdown/MDX 内容变得类型安全。
本项目的博客就使用了 Content Collections,定义于 src/content.config.ts:
import { defineCollection, z } from "astro:content";
const blog = defineCollection({
loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/blog" }),
schema: z.object({
title: z.string(),
description: z.string(),
date: z.coerce.date(),
tags: z.array(z.string()).default([]),
draft: z.boolean().default(false),
})
});
- Zod 模式验证:在构建时自动校验每篇文章的 frontmatter,防止字段缺失或类型错误。
- TypeScript 类型推导:
CollectionEntry<“blog”>自动推导出完整的数据类型。 - 按需加载:
render()函数仅在需要时编译 MDX,列表页不会触发全部编译。 - 增量构建:配合
–incremental标志,只重新处理变更的文件。
配合 Astro 的 RSS 集成 和 Sitemap 集成,内容管线的完整度非常高。
视图过渡(View Transitions)
View Transitions API 是 Astro 实现多页面应用(MPA)无刷新导航的方案。与 Next.js 等 SPA 框架不同,Astro 保持 MPA 架构,但通过浏览器原生 View Transitions API 实现类 SPA 的流畅导航体验。
---
import { ViewTransitions } from "astro:transitions";
---
<!doctype html>
<html>
<head>
<ViewTransitions />
</head>
<body>
<slot />
</body>
</html>- 默认更快的首屏加载:MPA 每个页面独立输出 HTML,无需等待 JS 运行时下载。Astro 的页面即使在弱网环境下也能快速呈现内容。
- 渐进增强:即使 View Transitions 失败或 JS 被禁用,页面仍然通过传统导航正常工作。
- 更小的 JavaScript 体积:不需要 SPA 路由库(如 react-router),View Transitions 利用浏览器原生 API。
- 更好的 SEO:每个页面都是独立 URL 和独立 HTML,搜索引擎无需处理客户端渲染。
Server Islands — 静态中的动态
Server Islands 是 Astro v5+ 引入的突破性功能。它允许静态页面中包含按需服务端渲染的区域:
---
// 静态部分在构建时生成
---
<h1>静态标题</h1>
<!-- 此区域在每次请求时动态渲染 -->
<UserAvatar client:server />
适合场景:
- 用户个性化内容(头像、购物车徽标)
- 实时数据(股票价格、天气信息)
- 基于地理位置的内容
- A/B 测试组件
不适合场景:
- 完全静态的内容(不需要 SSR 开销)
- 需要认证的敏感页面(应在边缘层处理)
- 高并发下的密集计算(考虑缓存策略)
Server Islands 需要在适配器(如 @astrojs/vercel、@astrojs/cloudflare)上启用,并且需要 SSR 或 Hybrid 模式。
框架对比
| 功能 / 特性 | Astro | Next.js | Gatsby | Hugo |
|---|---|---|---|---|
| 默认零 JS | ||||
| 岛屿架构 | ||||
| 多框架支持 | ||||
| 内容集合 (CMS) | 手动 | GraphQL | ||
| Server Islands | ||||
| 流式 SSR | ||||
| Edge 运行时 | ||||
| 构建速度 | 快 | 中等 | 慢 | 极快 |
| 插件生态 | 快速成长 | 成熟 | 成熟 | 丰富 |
生态系统与核心集成
Astro 拥有一个不断增长的集成生态系统,覆盖了几乎所有常见需求:
部署适配器
Astro 支持部署到几乎所有现代平台:
| 平台 | 适配器 | 模式 |
|---|---|---|
| Cloudflare Pages | @astrojs/cloudflare |
SSR / Static |
| Vercel | @astrojs/vercel |
SSR / Static |
| Netlify | @astrojs/netlify |
SSR / Static |
| Deno | @astrojs/deno |
SSR |
| Node 原生 | @astrojs/node |
SSR |
性能基准
Astro 的性能优势在真实项目中非常显著。根据 Web Almanac 2025 和 Astro 官方基准:
- LCP(最大内容绘制):Astro 页面中位数 LCP 为 1.2s,远优于同类框架均值(2.4s)。
- JavaScript 体积:典型内容页面 JS 体积 < 10 KB(gzip),而 Next.js 同类页面通常为 80-150 KB。
- Total Blocking Time:中位数 50ms,接近零阻塞时间。
- Lighthouse 得分:默认配置即可达到 98-100,几乎不需要优化。
总结
Astro 是一种全新的 Web 开发范式。它不追求“一次学习到处运行”的宏大叙事,而是聚焦在内容型网站的核心诉求上:速度快、体积小、开发体验好。
选择 Astro 的理由:
- 如果你的项目以内容驱动(博客、文档、营销站、电商目录)
- 如果你希望减少 JavaScript 体积,提升 Core Web Vitals
- 如果你想在一个项目中混用多个 UI 框架
- 如果你需要从静态逐步演进到动态,而无需重写架构
推荐阅读
- Astro 官方文档 — 完整的指南和 API 参考
- Astro 岛屿架构详解 — 深入理解设计哲学
- Astro GitHub 仓库 — 源码和路线图
- Astro 游乐场 — 在线体验
- Astro 官方博客 — 最新特性和案例
- Astro Discord 社区 — 获得帮助和贡献
- Awesome Astro — 社区资源和模板集合
本站在 V7 上运行,并已实践岛屿架构(详见前端工具的边界设计)。