静态站生成器对比:Hugo、Jekyll、Astro、11ty

手写 HTML 太累,上框架又太重。静态站生成器处在中间,但对个人笔记站来说,还有第四个选项:不用生成器。

一、四个主流选项

生成器语言构建速度特点
HugoGo极快(千篇秒级)单二进制,零依赖
JekyllRubyGitHub Pages 原生支持,最老牌
AstroJS/TS岛屿架构,默认零 JS
11tyJS灵活,模板引擎任选

还有 VitePress(文档站首选)、Gatsby(重)、Hexo(Node 老牌,中文生态好)。

二、Hugo:速度的标杆

bash
# 安装(单文件,无依赖)
sudo apt install -y hugo

hugo new site baize
cd baize
hugo new posts/first.md
hugo server -D              # 本地预览
hugo                        # 生成到 public/

优点:

  • 构建极快:一千篇文章也就一两秒;
  • 一个二进制文件,不需要 npm install;
  • 内置分类、标签、RSS、sitemap、多语言;
  • 主题生态丰富。

缺点:

  • Go template 语法比较绕;
  • 主题定制需要理解它的模板覆盖机制。
bash
time hugo    # 100 篇:0.3s 左右

三、Jekyll:GitHub Pages 原生

bash
gem install jekyll bundler
jekyll new baize
cd baize && bundle exec jekyll serve

最大优势:推到 GitHub Pages 什么都不用配,直接就能构建。

缺点明显:

  • Ruby 环境配置麻烦(版本、bundle);
  • 构建慢(几百篇要几十秒到几分钟);
  • 插件在 GitHub Pages 上受限(只能用白名单)。

四、Astro:现代前端体验

bash
npm create astro@latest
cd baize && npm run dev
npm run build

特点:

  • 默认零客户端 JS(这点很棒);
  • 可以用 React/Vue/Svelte 组件;
  • .astro 模板语法接近 HTML + JSX;
  • Content Collections 管理 Markdown,类型安全。

缺点:需要 Node 环境和 node_modules(依赖管理的心智负担)。

五、11ty:灵活简单

bash
npm install -g @11ty/eleventy
eleventy --serve
  • 配置极简,甚至可以零配置;
  • 模板引擎任选(Liquid、Nunjucks、Markdown);
  • 输出的就是纯粹 HTML;
  • 构建快。

适合从 Jekyll 迁移,或者想要「简单但比手写强」的场景。

六、对比表

维度HugoJekyllAstro11ty
安装难度中(Ruby)中(Node)中(Node)
构建速度极快
学习成本
主题生态丰富丰富增长中一般
GitHub Pages需 Actions原生需 Actions需 Actions
适合内容多、追求快想在 GH Pages 躺平要组件化想简单灵活

七、怎么选

你的情况建议
文章会几百篇以上Hugo
就想推到 GitHub Pages 不折腾Jekyll 或 Hugo + Actions
想用 React/Vue 组件Astro
看重简单可控11ty
写文档而不是博客VitePress
文章很少、想要完全可控不用生成器

八、不用生成器也是一种选择

本站就是手写 HTML + CSS + JS,文章数据放在 JS 数组里:

bash
baize-network/
├── index.html          3.7KB
├── assets/
│   ├── css/style.css   27KB
│   └── js/
│       ├── markdown.js 12KB   # 自写解析 + 高亮
│       ├── posts.js    500KB  # 100 篇文章数据
│       └── app.js      27KB   # 路由 + 渲染
├── feed.xml
├── sitemap.xml
└── robots.txt

这么做的前提和代价:

说明
✅ 零构建改完刷新就能看,不需要 build
✅ 可离线双击 index.html 就能读
✅ 完全可控想改哪改哪,不用跟框架搏斗
❌ SEO 弱内容由 JS 渲染,爬虫抓取差
❌ 首屏依赖 JS禁用了 JS 就白屏
❌ 体积集中文章多时 posts.js 会很大(本站 500KB)
❌ 没有生态搜索、分页、i18n 都要自己写

适用判断:

  • 个人笔记、不追求搜索流量 → 可以不用生成器;
  • 希望被搜索引擎收录 → 必须用生成器(预渲染 HTML);
  • 或者折中:写完用脚本生成一份静态 HTML 副本给爬虫(预渲染)。

九、如果要迁移到生成器

本站的数据结构迁移到 Hugo 很容易,因为每篇已经是独立字段:

bash
# 用脚本把 posts.js 转成 Hugo 的 Markdown + front matter
node -e "
global.window = {};
require('./assets/js/posts.js');
const fs = require('fs');
window.POSTS.forEach(p => {
  const fm = `---
title: "${p.title}"
date: ${p.date}
categories: ["${p.category}"]
tags: [${p.tags.map(t=>`"${t}"`).join(',')}]
summary: "${p.summary}"
---

`;
  fs.writeFileSync(`content/posts/${p.id}.md`, fm + p.content);
});
"

这也是「数据格式保持简单」的好处:将来换方案不困难。

十、我的建议

第一次建站,别纠结太久。我的推荐顺序:

bash
1. 内容少、想最快上线 → 直接手写(像本站这样)
2. 想认真写下去、要 SEO → Hugo(构建快,一劳永逸)
3. 想躺平在 GitHub Pages → Jekyll
4. 想用现代前端 → Astro

工具不重要,写下去才重要。 任何一个都能做出好站点。


生成器的本质是「把 Markdown 变成 HTML」。理解这一点,手写和用工具只是同一件事的两种实现方式。