Astro Islands:把 JS 留给真正需要的地方

为什么大多数内容网站不需要把整个页面变成 SPA?聊聊 Astro 的 Islands 架构,以及 client:visible 这类指令背后的取舍。

目录 · 4 节
  1. 什么是 Island
  2. 四种常用的加载指令
  3. 代价是什么
  4. 小结

打开一个博客,浏览器却要下载几百 KB 的 JavaScript,只为了渲染一段本可以是纯 HTML 的文字——这件事本身就很荒谬。Astro 的 Islands 架构正是为了解决这个问题。

什么是 Island

在 Astro 里,页面默认是零 JS 的静态 HTML。只有你明确标记的交互组件,才会被当作一座「岛屿」单独加载和水合(hydrate)。

src/pages/index.astro
---
import Counter from '../components/Counter.tsx';
---
<h1>这段标题是纯 HTML</h1>
<Counter client:visible />

四种常用的加载指令

指令何时加载适合
client:load页面加载后立即首屏必需的交互
client:idle浏览器空闲时优先级较低的组件
client:visible进入视口时页面下方的演示、评论
client:media满足媒体查询时只在手机上出现的菜单

代价是什么

Islands 之间默认是隔离的,共享状态需要借助 nanostores 之类的小工具。对于重交互的应用(比如在线文档编辑器),SPA 依然是更合适的选择。

小结

内容为主的网站,用 Islands 把 JavaScript 预算花在刀刃上;交互为主的应用,再考虑整页水合。