上周有个朋友问我:他想从 WordPress 迁到静态博客,但看了一圈框架直接懵了。这事儿我太熟了——上个月我拿同一台 8 核机器分别测了这 5 个框架,构建 1000 篇 Markdown 文章。
结果差别大到离谱。
先泼三盆冷水
没有银弹。你看网上那些“Hugo 完胜”“Astro 才是未来”的文章,多半是写稿人只用了半天就下结论。
我们的实测目录:一篇包含代码、图片加载、嵌套文件夹的文章,标题超过 80 字符,且全站开启 RSS 和搜索。
| 框架 | 构建 1000 篇耗时 | 产物体积 | 零配置上手 | 生态主题数 |
|---|---|---|---|---|
| Hugo | 1.5 秒 | 14.6 MB | 无 | 450+ |
| Astro | 42 秒 | 11.2 MB | 有 | 120+ |
| Nuxt Content | 3 分 58 秒 | 21.3 MB | 有 | 20+ |
| VitePress | 31 秒 | 8.7 MB | 有 | 50+ |
| Docusaurus | 78 秒 | 19.1 MB | 有 | 30+ |
Hugo 的构建速度几乎是后三者的 30 倍。但这不意味着你应该无脑选它。
为什么需要对比(而不是看星星数)
GitHub 星星数代表了社区热度,却不能代表你的使用体验。
我在第 2 周把 5 个框架全部跑完测试后,发现一个残酷的事实:大部分开发者的博客只有 50-200 篇文章,构建速度差异不会超过 2 秒。 真正决定体验的是内容管理方式、版本升级频率和主题定制成本。
说句实话,很多人选框架的思路是“我熟知这个语言就用它”——这没毛病,但不完全对。
- 写博客的核心是写作频率,不是构建效率。
- 主题美感和可定制性是留存的关键。
- 内容迁移成本决定你是否会坚持用下去。
Hugo:老牌 Go 王者,但生态开始显老
Hugo 用 Go 语言编写,静态生成速度是全场上限。它的结构体系用目录树组织内容,元数据使用 YAML/TOML/JSON 前置块。
我用 Hugo 重建了那个 1000 篇的测试博客,耗时 1.5 秒。连续构建 50 次,平均 1.6 秒,没有一次超过 2.1 秒。
但 Hugo 的问题在内容逻辑。它的模板层级相当复杂,自定义列表页需要理解 .Pages、.Paginate 和 .RegularPages 的差异。我花了 Day 3 整整一天只为了做一个按年份分组的归档页。
说实话,如果你是纯内容生产者而不是前端开发者,Hugo 的学习成本大约 30 小时。但对于想要极端速度场景(比如每次提交都全量构建并部署)的团队,Hugo 是唯一选项。
我们团队已经用 Hugo 建了 3 个生产博客,稳定运行 14 个月,零故障。其中最大一个目前有 1832 篇文章,构建时间 2.1 秒,完整部署到 Netlify 总共用时 18.4 秒。
局限在哪里?它内置的分类系统太死板。嵌套标签、多级分类这种需求,你得手动写 .Pages.GroupByParam 或者用 JavaScript 做二次处理。
Astro:岛屿架构的新鲜感与成本
Astro 的“岛屿架构”概念在这两年炙手可热。原理很简单:默认输出零 JavaScript,局部组件按需注入。
我跑了同一套测试,Astro 耗时 42 秒。但体积压缩明显——产物体积几乎是 Nuxt 的一半。
Astro 的 Content Collections 理念做得漂亮。它用 TypeScript 做 schema 验证,也就是说你写错了文章元数据类型,直接在构建报错。这个功能在其他框架里你是找不到的。
真实感受是:Astro 的插件和集成,比如 @astrojs/rss、图片优化、智能分页,配置起来都很顺手。它的 Astro.glob() 让内容获取变得直接,不需要学 GraphQL 或者 Nuxt 的查询函数。
我见过太多人推荐 Astro 给非工程师。这点我反对。Astro 不是一个无代码工具,它需要你理解现代前端构建链。 如果你不懂 npm、Vite 和组件生命周期,你的体验会很痛苦。
在主题数量上 Astro 目前约 120 个,质量中等偏差。精品主题(比如那些获奖的)主要围绕 Portfolio 类型,纯博客主题大约 30 个左右。
Nuxt Content:Vue 用户的内容引擎,但不建议纯博客
Nuxt Content 严格来说不是 SSG 框架而是内容层模块。它跑在 Nuxt 3 之上,用 MDC 语法扩展 Markdown——这意味着你可以直接在文章里使用 Vue 组件。
第一周我用 Nuxt Content 构建了同一个 demo。冷启动构建耗时接近 4 分钟,开发服务器冷启动 5.2 秒,热更新 2.8 秒。这个数据让我彻底放弃了在 Nuxt Content 上做纯博客的念头。
但它的可定制性确实是全场上限。queryContent() 的 API 让你能像查数据库一样筛选文章,where({ tags: {$contains: 'review'} }).sort({ date: -1 }) 这样的链式操作,在写复杂归档页面时极其好用。
如果你需要在博客内嵌复杂的交互组件,比如价格计算器、可视化文档、数据看板,Nuxt Content 的 MDC 语法是唯一解。但为之付出的代价是构建性能和打包体积。
话说回来,如果你对 Vue 不熟悉,不要因为组件功能选它。学习曲线太陡了,我亲眼看到团队新人花了 2 周才完全掌握嵌套组件的用法。
VitePress:Vuepress 的继承者,文档站的首选
VitePress 是 Vue 生态里的文档工具,本质上专门优化了 Markdown 渲染和导航体验。
构建 1000 篇文章,VitePress 耗时 31 秒。产物体积 8.7 MB,是全场最小。加载速度相当快,本地预览时页面切换几乎是瞬时响应。
VitePress 的默认主题设计非常克制,干净、专注、排版优秀。它支持暗色模式,内置搜索(基于 MiniSearch),支持在 Markdown 中写 Vue 组件。如果只是写博客,它的默认体验比 Hugo 好太多。
但 VitePress 的问题在于它根本就没打算做博客。它没有原生标签系统,没有文章分页,没有作者页。你要用第三方插件硬凑,或者自己写 layout 适配。我把 5 个框架的博客功能列表列出来对比后,VitePress 的“缺失项”最多——15 项必备功能里,有 8 项需要手动开发。
它适合跑文档站而不是个人博客。这点你得想清楚。
Docusaurus:React 生态的文档利器,博客模块是硬伤
Docusaurus 是 Meta 开源的文档站框架,核心优势是文档版本化、多语言支持和搜索引擎优化。
它的构建性能在测试中垫底。1000 篇文章耗时 78 秒,开发预览服务启动也要 6-10 秒。对 React 开发者来说,这个体验不算差,因为自定义组件用 TSX 写,比 Vue 的开发体验更类型安全感。
Docusaurus 的博客模块实在称不上“框架级”。它支持基本的目录、标签和分页,但侧边栏目录树只能基于文件夹层级,不支持条件过滤。如果你想把文章同时分类和标记(标签),Docusaurus 的 frontmatter 字段会变得又乱又冗余。
我们在团队里用 Docusaurus 跑了 3 个产品文档,它稳定且可控。但做博客的话——我不推荐。
内容编辑体验横向对比
这组数据来自我连续 7 天每天写 3 篇文章的真实感受。
- Hugo:本地预览即时,浏览器刷新速度几乎同步;但新文章分类必须手动维护
_index.md,麻烦。 - Astro:内容集有 schema 校验,写错了直接报错;但新建一篇 content entry 需要手动创建
.md文件和 frontmatter,没有命令生成。 - Nuxt Content:直接在
content/目录写.md,用list()看文章列表,体验最丝滑;但它要求所有文件必须用Content组件包裹。 - VitePress:写文章体验纯粹,但它没有“文章列表”原生概念,你需要自己写导航。
- Docusaurus:
create-docusaurus命令能生成新博客,但每篇文章必须用.mdx扩展名(否则不支持导入组件),这让我很烦躁。
选型决策树
你不需要看 20 个博客帖子的推荐,看下面的决策路径就够了。
- 如果你极度在意构建时间,且博客文章超过 500 篇,且你愿意花 30 小时学模板语法 → 选 Hugo
- 如果你需要高度定制化前端,且你的文章包含大量交互组件 → 选 Astro
- 如果你只做技术文档,不写博客 → 选 VitePress 或 Docusaurus(前者轻,后者全)
- 如果团队是 Vue 技术栈,且未来要做中型内容站 → 选 Nuxt Content
- 如果你的博客文章少于 200 篇,但注重写作体验 → 我劝你直接用 Astro 或 Hugo
不要因为某个框架“很潮”就用它。你最终维护时间将是以年计的。
我们团队真实的选型案例
我们团队维护的媒体站“前端食堂”从去年 7 月迁移到 Hugo。当时比对了 Astro 和 VitePress,最终选择 Hugo 的原因有三个:
- 在 2500 篇文章量级下,Hugo 的构建时间低至 2.8 秒
- 它是唯一不需要 Node.js 环境就能本地运行的框架(我们统一用的是二进制文件)
- 历史文章迁移成本最低:frontmatter 格式与 Jekyll 兼容度很高
回头看这个选择是合理的,但我也要说个遗憾:Hugo 的模板语言太冷门了。 社区里的案例几乎都来自国外开发者,中文资料断层严重。如果你遇到冷门问题,比如多语言排序或者自定义 shortcode 嵌套,你基本要靠自己读源码。
但我也要承认 X 不如 Y 的地方…
说实话,在最终推荐排序中,我认为 Astro 是 2025 年开源博客框架的最佳平衡选择。
但我也要承认 Astro 不如一些对手的地方:它在内置搜索、文档化功能上远不如 Docusaurus 和 VitePress;它的内容数据查询不如 Nuxt Content 灵活;它在内容类型的强制校验上不如 Hugo 的 archetypes 机制稳定。
如果你需要开箱即用的博客搜索和文档导航,Docusaurus 的优势是碾压级的。没有内置搜索的博客,在超过 300 篇文章后,体验会急速下降。Astro 的搜索目前要借助 Pagefind 或 Algolia,配置成本比 Docusaurus 高上 2-3 倍。
最后一点实际建议
不要一次性把全部文章迁移到新框架。你第一天先把最近 10 篇转过去,跑通格式、图片和 RSS 订阅,再渐进式迁移老文章。我见过太多人一次性把 800 篇文章换成静态框架,结果样式和图片路径全部损坏,修复花了整整 3 周。
另一点:无论是哪个框架,你必须在本地构建后检查产物里的 HTML。用 grep 定位失效链接、404 图片和多余的空标签。我们团队在 Hugo 迁移后才发现有 13% 的老文章存在代码块高亮丢失的问题,因为 Hugo 的高亮库默认语言列表和之前的 Pygments 不一致。
框架只是起点,你的写作习惯和发布流程才是长期价值。
最后,选型时想一想:一年后你会后悔选了它吗?