搭建这个博客之前,我对比了三个方向:VitePress、Vue SPA 和 Astro。最后选了 Astro, 不是因为它的星星最多,而是因为它在一个问题上给出了最诚实的答案 —— 一个内容站点到底需要多少 JavaScript?

默认零 JS 是什么体验

Astro 组件在构建时就把页面渲染成完整 HTML,浏览器拿到的是”熟饭”: 不需要等框架下载、解析、水合,文字和图片直接呈现。

只有真正需要交互的地方,才用”岛屿”按需注水:

---
import Search from "../components/Search.astro";
---

<!-- 只有这个组件会加载自己的 JS页面其余部分仍是纯 HTML -->
<Search client:load />

client:loadclient:idleclient:visible 三种水合时机, 把”什么时候付 JS 成本”变成显式决策而不是默认账单。

内容即数据

Markdown 文章通过内容集合(Content Collections)进入构建管线, frontmatter 由 Zod schema 校验:

  1. 写错字段名,构建当场失败
  2. 日期格式非法,构建当场失败
  3. 类型不对,编辑器里就有红色波浪线

错误在构建期暴露,而不是用户看到一个空白页面之后。

构建期失败的错误是最便宜的错误 —— 它还没见过任何用户。

代价是什么

当然要付出一些东西:交互复杂的组件要自己管理状态, 没有 React 那样现成的生态零件。但对一个以阅读为核心的博客, 这些零件本来就不该进场。


如果你也在选型,我的建议很简单:先问页面需不需要 JS, 再问用哪个框架。顺序反了,就是拿锤子找钉子。