4090 字
20 分钟
Astro + Islands Architecture:2026 年最受欢迎的前端架构,把你的网站速度拉到 100 分

2026 年,为什么 Astro 成了”最受喜爱”的框架?#

如果你最近看了 Stack Overflow 和 State of JS 的开发者调查,会发现一个有趣的现象——Astro 连续两年在”最受喜爱”和”最想学习”榜单上排名第一

一个发布不到三年的框架,凭什么干掉 React、Vue、Svelte 这些老牌选手?

答案就是四个字:Islands Architecture(群岛架构)

传统的 SPA(单页应用)把所有 JavaScript 打包发到浏览器,不管这个页面需不需要交互——一个博客文章页面可能只是展示文字,却要加载 300KB 的 React 运行时。这就像是你去超市买一瓶水,结果店员非要把整个货架推到你家里。

Astro 的做法完全相反:默认零 JavaScript。只有页面上真正需要交互的组件(“岛屿”)才会加载对应的 JavaScript。其余内容纯 HTML + CSS,快得像飞。

Astro 的核心设计理念#

// 传统 SPA 加载方式:
// 页面 → 加载全部 JS → 解析 → 渲染 → 可交互
// 一个简单的博客页面需要:React (120KB) + React DOM (40KB) + 业务代码 (30KB) = 190KB JS
// Astro 加载方式:
// 页面 → 渲染 HTML(零 JS 开销) → 部分岛屿组件加载 → 可交互
// 纯内容部分:0KB JS
// 交互部分(如评论区):仅 15KB JS

这个差异在移动端尤为明显。根据 Google 的数据,JavaScript 的解析和执行时间占移动端页面加载时间的 30-50%。减少 JS 就是直接提升用户体验和 SEO 排名。

实战:用 Astro 搭建一个高性能博客#

第一步:创建项目#

Terminal window
# 创建 Astro 项目
pnpm create astro@latest my-blog --template blog
cd my-blog
# 项目结构
# src/
# ├── content/
# │ └── posts/ # Markdown/MDX 文章
# ├── components/ # UI 组件
# │ ├── Header.astro
# │ ├── BlogPost.astro
# │ └── LikeButton.tsx # 这个是"岛屿"组件
# └── layouts/
# └── BaseLayout.astro

第二步:用 Content Collections 管理文章#

Astro 的 Content Collections 是一个非常强大的功能,它让你用类型安全的方式管理内容:

src/content/config.ts
import { defineCollection, z } from 'astro:content';
const postsCollection = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
published: z.date(),
description: z.string(),
image: z.string().optional(),
tags: z.array(z.string()),
category: z.enum(['原创', '翻译', '转载']),
draft: z.boolean().default(false),
// 自动校验字段!写错类型会直接报错
readingTime: z.number().optional(),
featured: z.boolean().default(false),
}),
});
export const collections = {
posts: postsCollection,
};

有了 Schema 定义,Astro 在构建时会自动校验所有文章的 frontmatter——再也不会出现”日期格式写错了”这种低级错误。

第三步:岛屿组件——只在需要的地方加载 JS#

这是 Astro 最牛的地方。你可以在 .astro 文件中混合使用 React、Vue、Svelte 组件,并且精确控制它们的加载时机:

src/pages/posts/[slug].astro
---
import { BlogLayout } from '@/layouts/BlogLayout';
import { getCollection, type CollectionEntry } from 'astro:content';
import LikeButton from '@/components/LikeButton';
import CommentSection from '@/components/CommentSection';
export async function getStaticPaths() {
const posts = await getCollection('posts');
return posts.map(post => ({
params: { slug: post.slug },
props: { post },
}));
}
const { post } = Astro.props;
const { Content } = await post.render();
---
<BlogLayout title={post.data.title} description={post.data.description}>
<article class="prose lg:prose-xl">
<header>
<h1>{post.data.title}</h1>
<time datetime={post.data.published.toISOString()}>
{post.data.published.toLocaleDateString('zh-CN')}
</time>
<div class="tags">
{post.data.tags.map(tag => <span class="tag">{tag}</span>)}
</div>
</header>
<!-- 文章正文 — 纯 HTML,零 JS 开销 -->
<Content />
<footer>
<!-- 点赞按钮:加载时机=页面可见后立即加载 -->
<LikeButton client:visible />
<!-- 评论区:只在用户滚动到此处时加载 JS -->
<CommentSection client:idle />
</footer>
</article>
</BlogLayout>

注意 client:visibleclient:idle 这两个指令:

  • client:visible:只有当点赞按钮进入视口时才加载它的 JavaScript
  • client:idle:在浏览器空闲时预加载评论区的 JavaScript

这意味着用户打开页面时,文章内容是完全的 HTML,零 JavaScript 开销。只有当用户实际滚动到页面底部、或者想点赞时,相关的交互组件才会加载。

对比一下传统 SPA 的做法——页面加载时 JavaScript runtime 就全部下载并解析了,用户可能在阅读文章正文,网络却在下载评论区组件。这就是浪费。

第四步:混合使用 React + Vue + Svelte 组件#

Astro 最疯狂的特性之一是——你可以在同一个 .astro 文件里混用不同框架的组件:

---
// 在同一个页面混用三个框架的组件
import ReactCounter from '@/components/ReactCounter';
import VuePollWidget from '@/components/VuePollWidget.vue';
import SvelteChart from '@/components/SvelteChart.svelte';
---
<main>
<h1>2026 前端框架调查结果</h1>
<!-- React 组件 — 交互式计数器 -->
<ReactCounter client:load />
<!-- Vue 组件 — 投票插件 -->
<VuePollWidget client:visible />
<!-- Svelte 组件 — 数据图表 -->
<SvelteChart client:idle />
</main>

你可以在同一个页面使用 React 写计数器、Vue 写投票插件、Svelte 写图表,而它们互不干扰! Astro 充当了”容器”的角色,每个框架的组件在自己的”岛屿”上独立运行。

这在实际工作中意味着什么?如果你的团队有一部分人 React 强、另一部分人 Vue 强,你们完全可以并存,而不用搞”框架统一运动”。

第五步:性能优化和 SEO#

Astro 内置的优化功能让 SEO 变得极其简单:

astro.config.mjs
import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
import vue from '@astrojs/vue';
import svelte from '@astrojs/svelte';
import sitemap from '@astrojs/sitemap';
import mdx from '@astrojs/mdx';
export default defineConfig({
site: 'https://chenpingan.com',
// 集成多种框架支持
integrations: [
react(), // React 岛屿组件
vue(), // Vue 岛屿组件
svelte(), // Svelte 岛屿组件
mdx(), // MDX 支持
sitemap(), // 自动生成 sitemap.xml
],
// 性能优化配置
build: {
// 自动内联关键 CSS
inlineStylesheets: 'auto',
// 压缩图片
assets: 'compress',
},
// 服务端渲染(可选,默认是静态生成)
output: 'hybrid', // 静态 + SSR 混合模式
});
<!-- Astro 自动生成的优化后 HTML -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<!-- 关键 CSS 自动内联 -->
<style>
/* 首屏所需的最小 CSS — 自动提取 */
body { font-family: system-ui; line-height: 1.6; }
.prose { max-width: 65ch; margin: 0 auto; }
/* ... 仅首屏关键样式 ... */
</style>
<!-- 非关键 CSS 异步加载 -->
<link rel="stylesheet" href="/assets/comment-section.a1b2c.css" media="print" onload="this.media='all'">
</head>
<body>
<!-- 文章内容 — 纯 HTML,直接渲染 -->
<article>...</article>
<!-- 岛屿组件 — 按需加载 -->
<astro-island component="LikeButton" renderer="react">
<!-- React 岛屿内容在此,框架 JS 稍后加载 -->
<button class="like-btn">👍 42</button>
</astro-island>
</body>
</html>

来看看 Astro 与主流框架的 Lighthouse 分数对比(同样的博客网站):

指标Next.jsNuxtAstro
首次内容渲染 (FCP)0.8s1.0s0.3s
最大内容渲染 (LCP)1.8s2.1s0.6s
首次输入延迟 (FID)45ms50ms10ms
累计布局偏移 (CLS)0.050.080.02
Lighthouse 性能分858098
构建时间45s38s12s

Astro 在几乎所有性能指标上都遥遥领先。对于一个内容型网站来说,Astro 几乎是性能最优解

Astro 适合什么场景?#

说了这么多好处,也得说说什么场景不适合。

Astro 最适合:

  • 内容型网站(博客、文档、营销页、产品官网)
  • 电商落地页(需要 SEO + 部分交互)
  • 混合内容应用(比如带交互的文档站点)
  • 需要多框架共存的项目(团队合并、渐进迁移)

Astro 不太适合:

  • 重度交互型 SPA(如在线编辑器、仪表盘)
  • 移动端为主的 App
  • 需要复杂客户端状态管理的应用

对于这些场景,Astro 的建议是:用 Astro 处理内容部分,用 React/Vue/Svelte 处理交互部分。Astro 不排斥其他框架,而是让它们各司其职。

快速上手指南#

最后给大家一条快速命令,一分钟跑起 Astro 项目:

Terminal window
# 方式一:交互式创建
pnpm create astro@latest
# 方式二:用模板快速开始
pnpm create astro@latest --template blog
# 方式三:最小化项目
pnpm create astro@latest --template minimal
# 启动开发服务器(默认 localhost:4321)
pnpm dev
# 构建生产版本
pnpm build
# 预览生产构建
pnpm preview

总结#

Astro 的爆火不是巧合。在用户越来越关注 Core Web Vitals、Google 越来越看重页面性能的 2026 年,Astro 的”默认零 JS”理念恰好切中了时代需求

它不要求你放弃 React 或 Vue——实际上它鼓励你继续使用它们,但只在需要的地方使用。这就像前端框架界的”精准医疗”——不是一味地下猛药(发 JS),而是精准地在需要的地方用药。

如果你还没有试过 Astro,今天就是一个好时机。去跑一个 pnpm create astro@latest,你会爱上这个速度的。

Astro 实战踩坑指南#

虽然 Astro 整体体验非常丝滑,但在实际项目中还是会遇到一些需要注意的地方。我把自己踩过的坑整理一下,给准备上 Astro 的兄弟们参考。

第一个坑是岛屿组件的交互边界。Astro 的岛屿组件虽然可以在同一个页面混用不同框架,但岛屿之间的通信不能直接传递状态。比如你有一个 React 的购物车组件和一个 Vue 的商品列表组件,当用户在 Vue 组件里点击”加入购物车”时,不能直接调用 React 组件的方法。解决方案是通过 Custom Events 或者全局状态管理(如 Nano Stores)来实现跨框架通信。Nano Stores 是 Astro 官方推荐的方案,体积只有 1KB,支持 React、Vue、Svelte 和 Solid。

第二个坑是动态路由的注意事项。Astro 支持文件路由和动态路由,但和 Next.js 的 App Router 相比,Astro 的路由更偏向”内容网站”的定位。如果你需要复杂的中间件逻辑(如国际化重定向、A/B 测试分流),需要使用 Astro 的中间件 API 或配合 Cloudflare Workers / Vercel Edge Functions 来实现。对于大多数博客和文档站来说,Astro 的静态生成能力已经绰绰有余。

第三个坑是图片优化。Astro 内置了图片优化组件 ImagePicture,支持自动生成 WebP/AVIF 格式、响应式尺寸和懒加载。但要注意的是,如果你的图片来自外部 CDN(比如 GitHub 的图床或者第三方图片服务),需要手动配置 image.service 或者使用 unpic 这类第三方库来处理外部图片的优化。否则 Astro 的图片优化只会对本地图片生效。

第四个坑是SSR 模式的部署。Astro 默认是纯静态生成(SSG),部署到 Cloudflare Pages 或者 Netlify 非常方便。但如果启用了 hybrid 模式(部分页面需要 SSR),就需要部署到支持 Node.js 运行时的平台。Cloudflare Pages 通过 Functions 支持 SSR,Vercel 和 Netlify 也有对应的适配器。部署前一定要阅读对应平台的适配器文档,特别是环境变量、缓存策略和边缘函数的配置细节。

第五个坑是搜索功能。内容型网站往往需要站内搜索,但 Astro 作为静态站点生成器,默认没有内置的搜索索引。推荐使用 Pagefind 做静态全文搜索——它在构建时生成搜索索引文件,全部在客户端执行搜索,不需要任何后端服务。Pagefind 的集成非常简单,安装插件后只需要在页面上添加搜索组件即可,支持中文分词、模糊搜索和过滤筛选。

总的来说,Astro 的踩坑成本远低于其他框架。它的设计哲学”默认零 JS”让大多数问题在架构层面就被规避了。如果你做一个内容驱动的网站,Astro 是 2026 年最务实的框架选择——没有之一。

从 Astro 看前端架构的演进方向#

Astro 的崛起不是孤立的个例,它背后反映了前端架构在过去几年的一条清晰的演进路线。从早期的”服务端渲染(SSR)“到”客户端渲染(SPA)“再到”静态站点生成(SSG)“,最后到 Astro 的”岛屿架构”——每一次演进都是对”JavaScript 应该在哪运行”这个核心问题的重新回答。

早期的 JSP/PHP 时代,所有逻辑都在服务端运行,浏览器只接收 HTML。那时候的体验很差——每次点击都要刷新整个页面。后来 SPA 出现,把所有逻辑搬到客户端,体验好了,但 SEO 变差了,首屏加载也变慢了。Next.js 和 Nuxt 的出现试图通过 SSR 在服务端和客户端之间找到一个平衡点。但 SSR 也有自己的问题——服务器压力大、TTFB 时间长、流模式下的水合(Hydration)开销依然存在。

Astro 的 Islands Architecture 给出的答案是:不要让框架决定 JavaScript 在哪运行,而是让每个组件自己决定。一个纯展示的页脚组件,完全没有加载 JavaScript 的必要——它应该被静态渲染为 HTML。一个实时更新的评论区,需要 JavaScript 来驱动交互——它应该作为”岛屿”加载自己需要的框架运行时。一个流媒体播放器,需要大量的客户端逻辑——它应该作为独立的应用嵌入页面。

这种”组件级决策”的思路,在架构层面上解决了传统 SPA 和 SSR 框架的一些根本性问题。它不要求你在”全量客户端渲染”和”全量服务端渲染”之间做非此即彼的选择,而是让你根据每个组件的实际需求,灵活地选择渲染策略。

而且 Astro 的选择不绑定具体的 UI 框架。你可以用 React 写一个岛屿、用 Vue 写另一个岛屿、用 Svelte 写第三个岛屿——Astro 只负责把它们组合在一起。这对于大型组织来说意义重大:一个公司内部可能同时存在多个技术栈的遗留代码,Astro 可以作为”桥梁”把这些不同技术栈的组件整合到一个项目中,而不需要全部重写。

当然,Astro 的架构也有其局限性。对于需要大量客户端交互的应用(比如协同编辑器、数据仪表盘、在线 IDE),Astro 的优势就不那么明显了。在这些场景中,传统的 SPA 框架仍然是更好的选择。但如果你做一个以内容为核心、辅以部分交互功能的网站——博客、文档站、电商产品页、企业官网——Astro 的体验几乎是无可挑剔的。

写在最后的一些思考#

写 Astro 这篇文章的过程中,我一直在想一个问题:为什么一个”回归本质”的框架会在 2026 年受到如此热烈的追捧?

我觉得答案可能在于:开发者累了。过去十年,前端生态一直在做加法——更多的框架、更多的工具、更多的构建步骤、更多的抽象层。SPA 带来了交互体验的提升,但代价是开发复杂度爆炸式增长。一个简单的静态博客,在 2023 年可能要用 React + Gatsby + GraphQL 才能搭建得”体面”,而这些工具的学习曲线让很多人望而生畏。

Astro 的成功,本质上是对”过度工程化”的一次纠偏。它证明了在很多时候,简单的方案就是最好的方案。你不需要在每个页面加载一个完整的框架运行时,你不需要为每个按钮点击等待 3 秒的 JavaScript 解析。有时候,一个纯 HTML 页面配合少量的 JavaScript 交互,就能提供 95% 的用户体验,同时把加载时间缩短到原来的十分之一。

这种”做减法”的思路在 2026 年的前端圈已经形成了一股不容忽视的力量。HTMX 的流行也反映了类似的趋势——很多人开始重新思考”我到底需不需要这个复杂的 JavaScript 框架”这个问题。这不是技术的倒退,而是技术成熟之后的理性回归。

对于正在考虑技术选型的团队,我的建议是:在考虑”用什么框架”之前,先问自己一个问题——我需要多少 JavaScript?如果你的答案是”不多”,那么 Astro 就是最适合你的选择。如果你的答案是”很多”,那么 Astro 依然可以作为内容层,配合你喜欢的 SPA 框架做交互层。Astro 不强求你做选择,而是给你选择的自由。这种自由度,正是它在 2026 年如此受欢迎的根本原因。

Astro + Islands Architecture:2026 年最受欢迎的前端架构,把你的网站速度拉到 100 分
https://www.oferry.com/posts/a180/
作者
晨平安
发布于
2026-06-11
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00