← [ BACK_TO_NOTES ]

Islands Architecture

Islands Architecture 以静态 HTML 为海洋,只对需要交互或个性化的局部区域加载和水合 JavaScript;Astro 是其代表实现。

#concept #growing #frontend #astro

[!info] related notes

Islands Architecture

一句话定义

Islands Architecture 是一种前端架构模式:页面大部分内容先成为静态或服务端生成的 HTML,只有少量真正需要交互或个性化的区域被当作“岛屿”,单独加载 JavaScript 并 hydration。

可以把它想成:

静态 HTML 海洋
├── 文章正文
├── 标题
├── 图片
│
├── [Search Island]      → 有 JS
└── [Carousel Island]    → 有 JS

它解决的核心问题是:不要因为页面上只有少数区域需要交互,就把整个页面都变成一个巨大的客户端 JavaScript 应用。

Astro 中的实现

Astro 是 Islands Architecture 的代表实现之一。默认情况下,UI Framework Component 可以只输出 HTML/CSS,不自动把组件 JavaScript 发送给浏览器。

需要交互时,再显式声明客户端指令:

<MyReactComponent client:load />
<SearchBox client:visible />

不同指令还能表达“什么时候值得加载”:

  • client:load:页面加载时立即加载和 hydration。
  • client:idle:浏览器空闲时再加载。
  • client:visible:进入视口时才加载。
  • client:only:跳过服务端 HTML 渲染,纯客户端执行。

因此 Island 不只是在问“客户端还是服务端”,还可以进一步控制客户端 JavaScript 的加载时机。

为什么这种模式有效

传统单体 SPA 容易形成:

整个页面
  ↓
一个大 JavaScript App
  ↓
下载 + parse + execute + hydrate

Islands Architecture 则试图变成:

HTML-first page
├── 大量无需 JS 的内容
└── 少量独立 interactive islands

典型收益:

  • 客户端 JavaScript 更少
  • hydration 范围更小
  • 不同岛屿可以独立、并行激活
  • 低优先级交互可以延迟加载
  • 内容型页面更容易保持快速首屏

与 React Server Components / Next.js 的关系

它和 React Server Components、Next.js 有相似目标:

把不需要浏览器执行的代码留在服务器或构建阶段,只给真正需要交互的区域发送客户端 JavaScript。

但不能把二者视为同一种机制。

维度Astro IslandsNext.js App Router / RSC
出发点HTML-firstReact tree first
默认客户端 JSAstro/框架组件默认可不发 JSServer Components 不进 client bundle;Client Components 需要 client runtime
交互边界client:* island"use client" module boundary
hydration每个 client island 独立 hydrationClient Component 子树 hydration
服务端模型Astro component / server islandReact Server Components
主要优势场景内容型网站、博客、文档、营销站复杂 React Web App、Dashboard、SaaS、全栈应用

所以:

Astro:
HTML + interactive islands

Next.js:
React Server Component tree + Client Component boundaries

“Client Component 像一个交互岛”是很好的学习类比,但并不是严格的实现等价。

Client Island 与 Server Island

现代 Astro 还区分:

  • Client Island:浏览器中的独立交互组件。
  • Server Island:页面其余部分可以静态缓存,但某个个性化/动态区域单独延迟到服务器生成。

这说明 Islands Architecture 的核心并不是简单的“静态站点”,而是:

把页面按独立执行与更新边界拆开,让昂贵的动态能力只发生在真正需要的位置。

边界与常见误解

Island 不等于任意组件

只有存在独立交互、个性化或延迟执行价值的区域,才有必要成为 island。机械地把每个按钮都拆成岛,并不会自动得到更好的架构。

少 JS 不等于零 JS

有搜索、编辑器、弹窗、播放器等交互时仍然需要 JavaScript;优化目标是“按需加载”,不是强行消灭 JavaScript。

Islands 与 SSR 不是同一个维度

SSR 描述请求时如何生成 HTML;Islands 描述页面如何划分客户端激活边界。一个 SSR 页面也完全可以采用 Islands Architecture。

历史背景

“Component Island”这一术语在 2019 年由 Etsy 前端架构师 Katie Sylor-Miller 提出,随后 Preact 作者 Jason Miller 在 2020 年进一步系统化讨论。Astro 后来帮助推广了这种架构,并把它变成框架的核心默认模型。

最短记忆方式

页面是 HTML 的海洋,只有需要交互的地方才浮出 JavaScript 岛屿。

学习 Next.js 时可以借这个模型理解“尽量缩小 Client Boundary”,但要继续记住:Astro Islands 与 React Server Components 是相似目标下的不同实现。

创建于 2026/9/15 更新于 2026/9/15
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本