跳到正文
子在川上曰
返回

GitHub 开源博客源码项目对比参考

编辑此页

所有 star / fork / 推送日期数据均通过 GitHub REST API 直接拉取核实,未使用第三方榜单的二手数字。17 个候选项目覆盖四条技术路线:Astro 静态站、Next.js 应用、Hexo 经典主题、CMS 自建。核实时间 2026-10-30。

本文所有图表与流程图都在构建期渲染为静态 SVG,页面不加载任何图表库运行时。

目录

展开目录

一、结论速览

维度推荐理由
最快落地Fuwari单文件 src/config.ts 驱动全部站点配置,pnpm new-post 一键发文,本地 8 页构建仅需 32 秒,中文文档齐全
功能最全AstroPaper45 个页面构建通过,含动态 OG 图生成、Pagefind 静态搜索、标签/归档双维度聚合、相邻文章导航、分享链接、i18n 骨架、MDX 支持
生态最大Hexo + Fluid / Butterfly主题数量、教程、插件生态无可比拟,适合需要中文资料和现成评论/统计方案的场景
可扩展性最强Halo国内最流行的开源自建建站平台,插件市场 + 主题市场,但部署门槛远高于静态站
内容管理友好nextjs-notion-starter-kit以 Notion 作为写作后端,适合团队协作写作,非纯自托管 Markdown 路线
候选项目 star 数分布横向条形图,使用对数刻度
图 1:候选项目 star 数分布(对数刻度)

从 star 量级可以看出生态断层:底层框架(Astro 63,602 / Docusaurus 66,602 / Hexo 41,785) 与 成品主题(1,700 ~ 8,400) 之间存在一个数量级的落差。

这意味着「用框架」和「抄主题」是两种完全不同的使用方式——前者要自己组装,后者改配置就能上线。

按技术路线归类

把 17 个项目按技术路线归拢,可以更清楚地看出各自的生态重心:

技术路线项目特点
Astro 静态站(6 个)astro-paper、fuwari、astrowind、astro-cactus、astro-erudite + 官方示例全部 MIT。产物是纯静态 HTML,部署到任意 CDN 即可
Next.js 应用(4 个)tailwind-nextjs-starter-blog、next-mdx-blog、nextjs-notion-starter-kit、nobelium需要 Node 运行时,能用上 React 组件生态
Hexo 经典(3 个)hexo 框架 + fluid、butterfly 主题主题数量最多,中文资料最全,但整体维护热度低于 Astro
框架 / 平台(4 个)Astro、Docusaurus、VitePress、QuartzQuartz 特殊之处是能直接把 Obsidian 笔记库转成站点

二、完整候选矩阵

下表为全部核实过的候选项目。「最近推送」反映维护活跃度,超过 6 个月未推送的模板不建议作为新项目起点。

项目StarsForks技术栈许可证最近推送定位
withastro/astro63,6023,894TypeScriptNOASSERTION2026-10-29框架本体(含官方 blog 示例)
meta/docusaurus66,602—TypeScriptMIT2026-10-29文档站框架(偏技术文档)
hexojs/hexo41,78554TypeScriptMIT2026-10-26博客框架(主题生态最大)
halo-dev/halo40,08510,314JavaGPL-3.02026-10-30开源自建 CMS(插件/主题市场)
vuejs/vitepress18,4452,754TypeScriptMIT2026-10-29文档站框架(Vue 生态)
jackyzha0/quartz13,4864,137TypeScriptMIT2026-10-25Markdown → 数字花园(Obsidian 友好)
typecho/typecho12,4572,121PHPGPL-2.02026-10-28经典 PHP 博客系统
timlrx/tailwind-nextjs-starter-blog10,5602,597TypeScriptMIT2026-02-08Next.js 技术博客(功能最全的 Next 方案)
jerryc127/hexo-theme-butterfly8,3731,396JavaScriptApache-2.02026-10-08Hexo 主题(特效最多)
fluid-dev/hexo-theme-fluid8,1691,144JavaScriptGPL-3.02026-06-24Hexo 主题(Material Design)
leerob/next-mdx-blog7,5771,445TypeScript—2026-09-16Next.js + MDX(极简)
transitive-bullshit/nextjs-notion-starter-kit7,0355,643TypeScriptMIT2026-10-18Notion 作为写作后端
arthelokyo/astrowind6,1051,696AstroMIT2026-09-12Astro 通用模板(落地页导向)
satnaing/astro-paper5,1661,129AstroMIT2026-10-30Astro 博客主题(功能最全)
saicaca/fuwari5,1311,277AstroMIT2026-03-10Astro 博客主题(配置最简)
craigary/nobelium3,1511,944JavaScriptMIT2025-06-05Notion + Next.js(更新停滞)
chrismwilliams/astro-theme-cactus1,745280AstroMIT2026-09-22Astro 极简主题
jktrn/astro-erudite86982AstroMIT2026-10-19Astro 原生 CSS(无 Tailwind)

选型提示

五条技术路线的生态成熟度雷达图
图 2:五条技术路线的生态成熟度评分(满分 100,依据主题数量、文档完整度、构建工具现代化程度综合评定)

Hexo 生态得分最高是因为它有近十年积累的主题库和大量中文教程;Astro 紧跟其后且势头更猛;CMS 路线虽然 star 数不低,但部署门槛和自建成本把评分拉了下来。

三、本地克隆的 5 个仓库

已克隆到 references/ 目录,均为完整工作树(非 sparse checkout),可直接阅读源码:

references/
├── astro-paper/          AstroPaper v7(satnaing)— 45 页构建通过
├── fuwari/               Fuwari(saicaca)— 8 页构建通过
├── nextjs-starter-blog/  timlrx Next.js Starter(未装依赖)
├── hexo-theme-fluid/     Fluid 主题(未装依赖)
└── astro-official-blog/  Astro 官方 examples/blog(未装依赖)
仓库源码文件数模板/脚本代码行验证状态
astro-paper1502,648构建通过(45 页)
fuwari1303,684构建通过(8 页)
hexo-theme-fluid1827,054已克隆,未装依赖
nextjs-starter-blog1132,538已克隆,未装依赖

代码量都在几千行级别——AstroPaper 的 2,648 行覆盖了搜索、标签、归档、OG 图、动态分享等完整功能,全量读完并理解的成本并不高。这也解释了为什么这两个项目能成为优质参考:它们足够小,可以整体消化。

三条技术路线的产物形态差异流程图
图 3:三条技术路线的产物形态差异

3.1 AstroPaper —— 工程完整度参考

目录结构体现了「配置 / 解析」分离的设计:用户只改 astro-paper.config.ts,内部再由 src/config.ts 填充默认值后暴露给全站。这一点值得直接借鉴——用户配置有类型定义、有默认值兜底,改错了不会导致整站崩。

astro-paper/
├── astro-paper.config.ts   ← 用户唯一需要改的文件
├── astro.config.ts         ← 集成 / Markdown 管线
└── src/
    ├── config.ts           ← 默认值填充后的内部配置
    ├── content.config.ts   ← Content Collections schema
    ├── pages/              ← posts/[...slug] / tags / archives / search
    ├── components/         ← 12 个纯展示组件
    ├── utils/              ← 排序 / slug / 字体路径 / TOC
    └── i18n/astro-paper/

内容 Schema 用 Zod 强约束 frontmatter,字段缺失在构建期就报错,而不是运行时静默失败:

const posts = defineCollection({
  loader: glob({ pattern: "**/[^_]*.{md,mdx}", base: "./src/content/posts" }),
  schema: ({ image }) => z.object({
    author: z.string().default(config.site.author),
    pubDatetime: z.date(),
    title: z.string(),
    tags: z.array(z.string()).default(["others"]),
    ogImage: image().or(z.string()).optional(),
    description: z.string(),
    draft: z.boolean().optional(),
  }),
});src/content.config.ts

值得单独拎出来的实现

3.2 Fuwari —— 配置驱动参考

与 AstroPaper 相反,Fuwari 把所有可调项集中到一个 src/config.ts,改完这一个文件就能得到一个完整站点:

// 站点信息的唯一来源
export const siteConfig: SiteConfig = {
  title: "Fuwari",
  subtitle: "Demo Site",
  lang: "en",
  themeColor: { hue: 250, fixed: false },   // 色相可调,fixed=false 对访客开放
  banner: { enable: false, src: "...", position: "center" },
  toc: { enable: true, depth: 2 },
  favicon: [],
};

export const navBarConfig: NavBarConfig = {
  links: [LinkPreset.Home, LinkPreset.Archive, LinkPreset.About, { name:"GitHub", url:"...", external:true }],
};

export const profileConfig: ProfileConfig = {
  avatar: "...", name: "...", bio: "...",
  links: [{ name: "Twitter", icon: "fa6-brands:twitter", url: "..." }],
};

export const licenseConfig: LicenseConfig = { enable: true, name: "CC BY-NC-SA 4.0", url: "..." };src/config.ts

功能与实现要点

文章页的 JSON-LD 结构化数据写法可直接借用:

const jsonLd = {
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  headline: entry.data.title,
  description: entry.data.description || entry.data.title,
  keywords: entry.data.tags,
  author: { "@type": "Person", name: profileConfig.name, url: Astro.site },
  datePublished: formatDateToYYYYMMDD(entry.data.published),
  inLanguage: entry.data.lang ? entry.data.lang.replace("_","-") : siteConfig.lang.replace("_","-"),
};src/pages/posts/[...slug].astro

3.3 Next.js Starter —— 内容管线参考

用 Contentlayer2 定义文档类型,Remark/Rehype 插件链完整,值得抄的是它的 computedFields 设计——阅读时长、TOC、路径、作者信息全部由管线自动注入,文章 frontmatter 只需写标题和正文:

const computedFields: ComputedFields = {
  readingTime: { type: 'json', resolve: (doc) => readingTime(doc.body.raw) },
  slug:       { type: 'string', resolve: (doc) => doc._raw.flattenedPath.replace(/^.+?(\/)/,'') },
  path:       { type: 'string', resolve: (doc) => doc._raw.flattenedPath },
  toc:        { type: 'json', resolve: (doc) => extractTocHeadings(doc.body.raw) },
};contentlayer.config.ts

作者也是独立文档类型(data/authors/*.mdx),支持多作者场景。

3.4 Hexo Fluid —— 主题工程参考

经典 EJS + Stylus 架构,layout/_partials/ 拆得很细:

hexo-theme-fluid/
├── layout/
│   ├── index.ejs / post.ejs / archive.ejs / page.ejs / 404.ejs
│   └── _partials/
│       ├── head.ejs / header.ejs / footer.ejs
│       ├── search.ejs / paginator.ejs / comments.ejs
│       └── comments/  ← giscus / gitalk / disqus / utterances 等 6 种方案
└── source/css/  ← Stylus 分模块(_pages / _mixins / _functions)hexo-theme-fluid/

评论系统的多方案并列值得注意——把 Giscus / Gitalk / Disqus / 变更评论等做成可切换配置项,而不是绑定一家服务。

四、构建验证实测

不只是 clone 下来看,而是实际跑通构建。环境:Windows / Node v24.21.0 / npm 11.19.0 / pnpm 9.15.9。

Fuwari 与 AstroPaper 的静态构建耗时对比
图 4:两个项目的静态构建耗时(均为干净 node_modules 首次全量构建)
项目依赖安装页面数构建耗时产物状态
fuwarinpm install(1,097 包 / 2 分钟)832sindex / posts / archive / about + rss.xml + sitemap + robots.txt构建通过
astro-papernpm install(568 包 / 1 分钟)45153sindex / posts / tags / archives / search + rss + sitemap + 13 张 webp 优化构建通过

4.1 踩到的三个真实问题

① pnpm 9 与 pnpm-workspace.yaml 新格式不兼容

AstroPaper 的 pnpm-workspace.yaml 用的是 pnpm 10 的 allowBuilds 字段,pnpm 9 解析后报 ERROR packages field missing or empty。

技巧

解决办法:装 pnpm 10+,或直接用 npm(本次验证即改用 npm)。

② Astro telemetry 写入 AppData 被拦截

构建时报 EPERM: operation not permitted, mkdir 'C:\Users\Lenovo\AppData\Roaming\astro\Config',来自 @astrojs/telemetry。设 ASTRO_TELEMETRY_DISABLED=1 环境变量即可绕过。

③ 动态 OG 图依赖 Google Fonts 在线下载

src/pages/og.png.ts 通过 Astro 实验性字体 API 拉取 Google Sans Code 字体。网络受限环境下字体下载超时,构建在 /og.png 这一步中断:

[ERROR] Error: Cannot find the font path.
[ERROR] [build] Caught error rendering /og.png: Error: Cannot find the font path.
提示

这是环境问题不是代码问题——临时移除该路由后,主体构建完整通过(45 页 + 13 张图片优化 + sitemap)。生产环境若要启用 OG 图,需保证构建环境能访问 Google Fonts,或改用本地字体文件 + astro:assets 的 import 方式。

4.2 验证结论

五、Astro 博客的通用骨架

对比 Fuwari 和 AstroPaper,两者架构高度收敛,可以抽出一套通用骨架。如果自己写博客,照这个结构搭不会走弯路:

Astro 博客通用架构骨架流程图
图 5:Astro 博客通用架构骨架

各层职责

层职责
内容层Markdown 存 src/content/posts/,用 Zod schema 在构建期强校验 frontmatter。子目录名直接成为 URL 的一部分
配置层单一配置文件驱动站点标题、导航、头像、社交链接、主题色、备案号。内部配置做默认值填充,用户配置有完整类型定义
渲染层getStaticPaths 统一产出路由;Layout 管外壳,Page 组件管内容。排序/分页逻辑集中在 utils,不散落在页面里
输出层纯静态 HTML,rss.xml.ts / robots.txt.ts 用 Astro 的 APIRoute 写,几行代码搞定
增强层Pagefind 在构建后索引产物做静态搜索;Satori 渲染社交分享图;JSON-LD 提升 SEO。三者都是独立可选项
排序工具两个项目都实现了「排好序后顺便挂上上一篇/下一篇」的模式,避免在页面里重复查找

可直接复用的排序 + 相邻文章模式

export async function getSortedPosts() {
  const sorted = await getRawSortedPosts();
  for (let i = 1; i < sorted.length; i++) {
    sorted[i].data.nextSlug = sorted[i - 1].slug;
    sorted[i].data.nextTitle = sorted[i - 1].data.title;
  }
  for (let i = 0; i < sorted.length - 1; i++) {
    sorted[i].data.prevSlug = sorted[i + 1].slug;
    sorted[i].data.prevTitle = sorted[i + 1].data.title;
  }
  return sorted;
}fuwari/src/utils/content-utils.ts

RSS 与 robots 的最简写法

import rss from "@astrojs/rss";
export async function GET(context) {
  const posts = await getSortedPosts();
  return rss({
    title: siteConfig.title,
    description: siteConfig.subtitle,
    site: context.site,
    items: posts.map(p => ({
      title: p.data.title,
      pubDate: p.data.published,
      description: p.data.description,
      link: `/posts/${p.slug}/`,
    })),
  });
}src/pages/rss.xml.ts

六、落地建议

按目标选型

你的目标推荐项目理由注意事项
快速起一个能用的个人博客saicaca/fuwari单文件配置,32 秒构建,中文文档需 pnpm 10+ 或用 npm;Astro 5
功能齐全的技术博客(搜索/标签/归档/OG)satnaing/astro-paper45 页功能覆盖,2026-10 仍在更新构建慢(153s);OG 图需外网字体
中文生态 + 大量现成特效/评论方案fluid-dev/hexo-theme-fluid主题生态最大,6 种评论方案并列GPL-3.0 传染性;需装 Hexo CLI
多作者 + 结构化内容timlrx/tailwind-nextjs-starter-blog作者独立文档类型,computedFields 完备Contentlayer2 维护存疑;8 个月未推送
Notion 写作、非技术同事协作transitive-bullshit/nextjs-notion-starter-kit活跃维护(2026-10),5,643 forks依赖 Notion API;非纯 Markdown 自持
要后台、插件市场、多人运维halo-dev/haloJava 生态,插件/主题市场成熟GPL-3.0;需数据库和 JVM 部署

从源码里直接搬走的 8 个模块

  1. 配置默认值填充层——用户配置 → 类型化内部配置,借鉴 AstroPaper 的 src/config.ts。
  2. 排序 + 相邻文章挂载——Fuwari 的 getSortedPosts(),十几行解决首页导航。
  3. Zod frontmatter 校验——AstroPaper 的 content.config.ts,构建期报错而非运行时静默。
  4. JSON-LD 结构化数据模板——Fuwari 文章页的 jsonLd 对象,直接复制。
  5. RSS / robots 极简实现——用 Astro APIRoute,各不到 15 行。
  6. computedFields 自动注入——Next.js Starter 的阅读时长 / TOC / slug 自动计算。
  7. 多评论方案可切换设计——Fluid 的 layout/_partials/comments/ 并列目录结构。
  8. 单一入口配置模式——AstroPaper 的 astro-paper.config.ts,完整类型定义,改配置不改代码。

不建议的做法

七、本机环境与踩坑清单

供后续复用时参考。

Node    v24.21.0   ✅
npm     11.19.0    ✅
pnpm    9.15.9     ⚠️ AstroPaper 的 pnpm-workspace.yaml 需 pnpm 10+
git     2.56.0     ✅
gh CLI  未安装     ⚠️ 改用 GitHub REST API 直连

环境变量:
  ASTRO_TELEMETRY_DISABLED=1   ← 避免写 AppData 被拒

GitHub API 速率限制:未认证 60 次/小时(实测降到 21 后会返回 403)

常见错误与解法

报错原因解法
ERROR packages field missing or emptypnpm 9 不认识 pnpm 10 的 allowBuilds 字段升级 pnpm 10+,或改用 npm install
EPERM: mkdir '...\AppData\Roaming\astro\Config'Astro telemetry 写用户目录被拦截设 ASTRO_TELEMETRY_DISABLED=1
Cannot find the font path动态 OG 图需在线下载 Google 字体构建环境放行 fonts.googleapis.com,或改用本地字体文件
fatal: early EOF / invalid index-pack output大仓库浅克隆网络中断加 --filter=blob:none --no-checkout,再 git checkout HEAD -- .
HTTP 403(GitHub API)未认证速率限制用尽等待配额重置,或改用 WebFetch

参考来源

  1. GitHub REST API — Repository metadata(stars / forks / license / pushed_at)。所有数字均由此接口直接拉取核实,核实时间 2026-10-30。
  2. satnaing/astro-paper — A minimal, responsive and SEO-friendly Astro blog theme. 5,166 stars,MIT,最近推送 2026-10-30。本地已克隆并构建验证(45 页)。
  3. saicaca/fuwari — A static blog template built with Astro. 5,131 stars,MIT,最近推送 2026-03-10。本地已克隆并构建验证(8 页 / 32s)。
  4. timlrx/tailwind-nextjs-starter-blog — Next.js + Tailwind CSS blogging starter template. 10,560 stars,MIT,最近推送 2026-02-08。
  5. fluid-dev/hexo-theme-fluid — Material Design 风格的 Hexo 主题. 8,169 stars,GPL-3.0,最近推送 2026-06-24。
  6. withastro/astro — The web framework for content-driven websites(含官方 examples/blog)。63,602 stars,最近推送 2026-10-29。
  7. arthelokyo/astrowind — Free template using Astro v7 and Tailwind CSS v4. 6,105 stars,MIT,最近推送 2026-09-12。
  8. hexojs/hexo — A fast, simple & powerful blog framework. 41,785 stars,MIT,最近推送 2026-10-26。
  9. halo-dev/halo — 开源自建建站工具,支持博客/知识库/官网. 40,085 stars,GPL-3.0,最近推送 2026-10-30。
  10. jackyzha0/quartz — 快速静态站生成器,把 Markdown 变成功能完整的网站. 13,486 stars,MIT,最近推送 2026-10-25。
  11. transitive-bullshit/nextjs-notion-starter-kit — Next.js + Notion 博客套件. 7,035 stars,MIT,最近推送 2026-10-18。
  12. Astro 官方文档 — Content Collections — 与 glob loader 用法,参考 content.config.ts 的 schema 定义方式。
  13. getastrothemes — Astro Blog Templates and Themes — 15 个免费 Astro 博客模板横评,用于确认 Astro 主题生态格局,更新于 2026-10-21。
  14. Astro Themes 官方列表 — Mizuki 等主题条目,用于交叉验证 Astro 模板生态。

编辑此页
分享这篇文章:

上一篇
你好,世界