Skip to content

为什么 2026 年写博客我依然首选 Astro 而不是 Next.js?

毛佳国

很多熟悉前端的朋友,看到我们这个名为 singbox.ygjc.cc 的博客拥有全局光标发光特效、背景极客噪音动画,以及 Cmd+K 唤出的全站秒切搜索框,第一反应都是:“这博客也是用 React 写了个 Next.js SSR 项目吧?”

恰恰相反。本博客的核心骨架完全基于 Astro 构建。在开发个人知识库、文档站或博客领域,Astro 目前展示出的压制力,让 Next.js 这种大而全的全栈元框架都显得极其臃肿。

最大的痛点:为了几段纯文本,我需要给用户发多少 JS 包?

传统的使用 React 体系(比如 Next.js 或者之前的 Gatsby)构建网页时。哪怕你的文章只是几千字的 Markdown,你的网页依然需要把整个 React 框架打包发送给用户。

在用户的浏览器接收到那份庞大的 .js 之后,它还要经过繁重的词法分析、解析、甚至去执行 Hydration(注水,即绑定事件监听器),整个页面的按钮才能变得可以点击。 结果就是:明明是一个纯看文字的博客,首次加载硬是耗费了几兆流量,并让低端手机 CPU 飙升了几秒。

Astro 的魔法:默认发送零 JS

Astro 脱颖而出的核心逻辑极其“守旧但正确”:默认情况下,在最终构建时剔除所有不必要的客户端 JavaScript。

当你在 Astro 文件中写组件(甚至你可以直接在 Astro 项目里写 React / Vue 的组件),它的编译器在本地跑完逻辑后,丢给服务器用户的,是一张只包含纯正 HTML 与 CSS 的“死网页”。

这个“死网页”有着极其恐怖的首屏渲染性能,在 Lighthouse 跑分中几乎都是满分 100/100。

按需注水:群岛架构 (Islands Architecture)

如果是“死网页”,那我们博客顶部的音频播放器特效,以及右上角能交互的 Cmd+K 全局搜索框是怎么做到的呢?难道要退化回去写冗长的原生 Vanilla JS 吗?

不!这就是 Astro 的杀手锏 —— Astro Islands (群岛架构)

页面 95% 是不可交互的静态大海(纯 HTML/CSS,瞬间加载)。 当我们需要那 5% 的高度交互功能(比如一个 React 写的搜索弹窗,带有复杂的动效和状态管理),我们可以用以下语法:

// 只要加上 client:load,这个 React 组件就会从海面浮出变成活的群岛!
<SearchModal client:load /> 

// 或者只有当用户滚动到页面底部,才去加载评论系统的 JS!
<CommentSection client:visible />

Astro 会极其聪明地将这 5% 的孤岛进行精确的打包并发送。其余页面不受任何影响。它把静态站的极速和现代 UI 框架极其丰富的组件生态,毫无缝隙地拼接在了一起。

完美的 Markdown / MDX 体验

开发技术博客,写代码高亮是一个硬需求。

Astro 内置了目前业内最高级的代码高亮工具链集(基于 Shiki 和 remark)。我们在这篇博客中随便插入一段含高亮的终端语法:

pnpm install

我们能够做到代码块差异对比展示(diff),甚至能够直接在 MDX 里面穿插调用我们预先写好的相册 GalleryEmbed 组件,而无需痛苦地单独去引入数据。Astro 的内容集合(Content Collections)配合 Zod 强制类型校验,让我永远不会因为漏写了某篇博文头部的 pubDatetime 而造成整个网站构建时的崩溃报错。

结语

术业有专攻。 如果在开发复杂的后台带登录态的管理面板、交易大盘,Next.js 的 SSR/RSC 依然是王者。但在任何偏重阅读、内容为主的系统展示上。

Astro 无疑是目前 Web 性能工程的极致体现。将复杂度和体积在服务器侧抽干,还给用户最丝滑极致的前端体验。追求这类极简架构的精神,和这博客分享的 Sing-box 的核心设计哲学,如出一辙。

上一篇
HomeLab 折腾日记:Proxmox VE (PVE) 虚拟化底层底层环境从零搭建
下一篇
极客的终端美学:Zsh + Tmux + Zoxide 打造最高效的命令行工作流