网站开源文档
🔥 本次更新(v1.0.0)
上一版(3.22)是「整套博客直接开源」:主题还是 themes/butterfly,配置叫 _config.butterfly.yml,站点页面大多是空壳。
这一版把三年来的魔改做了一次彻底整理,几条主线:
| 方向 | 变化 |
|---|---|
| 主题独立 | themes/butterfly → themes/fomalhaut,包名与配置同步改名;配置迁到站点根 _config.fomalhaut.yml |
| 配置瘦身 | fomal.js 从 2973 行拆成 105 行主引导 + 10 个模块;配置里的 26 段内联样式与脚本抽成 source/css/site-inject.css 与 source/js/inject/ |
| 样式整理 | custom.css(近 4000 行)删掉 341 行死代码,并补上完整的文件头索引地图 |
| 新增功能 | AI 助手、美化设置面板、侧栏日历与倒计时(农历/节气/节日)、手机端抽屉、网站统计页、时间线归档、网址导航、天文星图 |
| 资源外链化 | 图片与字体统一走公共 CDN(jsDelivr 的 @fontsource、picsum),不再依赖自建对象存储 |
| 字体精简 | 11 款 → 6 款开源可商用字体(SIL OFL),面板上的名字也改成真实字体名 |
| 文档 | README 重写为完整文档(含架构、每一项配置示例、部署与 FAQ),并补上界面截图 |
🎈 这是什么
hexo-theme-Fomalhaut 是一个跑在 Hexo 上的个人博客主题 / 站点模板。它不是单纯的 themes/ 目录,而是一整套可运行站点:
- 一套主题代码(
themes/fomalhaut/,Pug + Stylus 渲染); - 一份站点配置(根目录
_config.yml+ 根目录_config.fomalhaut.yml); - 一批站点级增强(根目录
scripts/下的 Hexo 插件、source/js/与source/css/下的自定义脚本与样式); - 若干示例页面(网址导航、画廊、八音盒、友人帐、朋友圈、网站统计、时间线归档、天文星图……)与 2 篇示例文章。
它解决的问题是:Hexo 生态里大量的美化方案都靠「直接改主题源码」,一旦主题更新就得重新抄一遍。
本仓库把主题代码与站点改动放进不同目录,站点侧的东西全部通过「配置注入 + 独立 css/js 文件」实现。
来源背景:作者从 2022 年起用 Butterfly 4.3.1 搭建这个博客,三年间持续魔改,把散落在配置与主题里的大量改动逐步抽成独立文件;2026-10 做了一次完整重构(内部代号「屎山重构」),最终整理为 v1.0.0 开源。
📸 界面预览
首页
顶部是全屏大图 + 站点名 + 打字机副标题,右侧固定悬浮按钮列(设置 / AI 助手 / 分享 / 回到顶部)。

首页文章列表与侧栏
文章卡片、侧栏日历(含农历与节气)、倒计时卡、公告栏、小站资讯、右下角交互按钮。

文章页
文章标题栏、自动生成的右侧目录、代码块(语言标签 + 一键复制 + 行号)、外挂标签渲染。

美化设置面板
点右下角齿轮打开。访客可以自己换字体、主题色、背景、特效开关,设置存 localStorage,刷新不丢。

🏗 项目架构
1 | 用户请求 |
三层配置优先级(Hexo 5+ 的行为):
| 层级 | 文件 | 作用 |
|---|---|---|
| 站点 | 根 _config.yml | 站点名、作者、URL、部署、算法插件等 |
| 主题(生效) | 根 _config.fomalhaut.yml | 本站真正使用的主题配置,所有开关都在这里 |
| 主题(默认) | themes/fomalhaut/_config.yml | 主题自带的默认值模板,留作参考 / 兜底 |
🆚 相比上一版改了什么
1. 主题独立,改名为 fomalhaut
| 项 | 旧版 (3.22) | 新版 (v1.0.0) |
|---|---|---|
| 主题目录 | themes/butterfly/ | themes/fomalhaut/ |
| 主题包名 | hexo-theme-fomalhaut v4.3.1(沿用 Butterfly 的 package.json) | hexo-theme-fomalhaut v1.0.0(独立版本号) |
| 主题配置 | _config.butterfly.yml | _config.fomalhaut.yml |
| 配置注入 | 少量 inject | 完整 inject.head / inject.bottom 注入体系 + 独立 css/js 文件 |
2. 站点与主题彻底分离
- 所有自定义样式集中到
themes/fomalhaut/source/css/_custom/custom.css(文件头带完整索引地图)与source/css/*.css; - 所有自定义脚本从单文件
fomal.js(2973 行)拆成 105 行主引导 + 10 个模块(source/js/modules/)与 10 个注入脚本(source/js/inject/); - 配置里的 26 段内联样式与脚本抽成
source/css/site-inject.css与独立 js,配置文件从 2037 行瘦到 1482 行。
3. 新增功能
| 功能 | 位置 | 说明 |
|---|---|---|
| AI 助手 | source/js/ai-chat.js + scripts/ai-chat-inject.js + api/chat/completions.js | 右侧悬浮对话面板,前端可直连也可走同源代理隐藏 Key |
| 美化设置面板 | source/js/modules/settings.js | 访客可自选字体、主题色、暗色、阅读模式、背景、特效开关 |
| 侧栏日历 / 倒计时 | source/js/aside-calendar.js + source/js/lunar.js | 带农历、节气与节日提醒 |
| 手机端抽屉 | source/css/mobile-drawer.css | 独立样式表,13 个小节:面板、字标、头像、统计胶囊、菜单、遮罩、入场动效 |
| 网站统计页 | source/site/census/ + source/js/census.js | 图表看板,配色由主题色派生 |
| 时间线归档 | source/site/time/ + source/js/timeline-archive.js | 用时间线标签写站史 / 里程碑 |
| 网址导航 | source/box/nav/ | 圆形头像小卡式导航,纯 CSS 计数器 |
| 天文星图 | source/box/astronomy/voyager.html | 独立完整页面,用 iframe 引入,skip_render 不参与渲染 |
| PWA + Service Worker | themes/fomalhaut/source/sw.js | 离线预缓存 + 请求分流 |
| 多平台部署 | .github/workflows/autodeploy.yml、vercel.json、functions/ | GitHub Actions / Vercel / Cloudflare Pages |
4. 工程化与性能优化
- 构建链:
hexo generate→gulp(html / css 压缩),一条命令出产物; - 图片懒加载修复:
scripts/swiper-lazyload-fix.js处理轮播与 pjax 场景下 lazyload 失效; - 搜索懒加载:
source/js/inject/search-lazy.js只在点开搜索时才拉取; - pjax 守卫:
source/js/pjax-guard.js修复换页后状态残留; - CDN 预连接:配置里对首屏外部域名做
preconnect/dns-prefetch; - 字体:改为公共 CDN(jsDelivr 的
@fontsource/*),并精简为 6 款开源可商用字体; - 图片外链:封面 / 壁纸 / 站点截图全部改为公共占位图服务,不再依赖自建对象存储;
- 配置瘦身:
fomal.js2973 → 105 行,custom.css删掉 341 行死代码并补上索引地图。
🧰 环境要求
| 依赖 | 版本 | 说明 |
|---|---|---|
| Node.js | 18 / 20 / 22 LTS(推荐 22) | 仓库自带的 GitHub Actions 工作流使用 22.x |
| npm | 9+ | 随 Node 一起安装 |
| Hexo | 6.3.0 | 已写进 package.json 的 hexo.version,无需全局安装即可用 npx hexo |
| Git | 任意较新版本 | 克隆与部署用 |
除此之外不需要 Python、不需要全局 hexo-cli。
🚀 快速开始
1. 克隆并安装依赖
1 | git clone https://github.com/fomalhaut1998/hexo-theme-Fomalhaut.git my-blog |
这里绝不能使用 hexo init 初始化!一旦用了,站点的配置文件 _config.yml 内容会被重置。
2. 本地预览
1 | npx hexo server # 打开 http://localhost:4000 |
改 source/ 下的内容与 CSS 会自动重新渲染;改 themes/ 下的 .pug 模板需要重启 server(Hexo 只在启动时读模板)。
3. 改成你自己的站点(关键三步)
第一步:改 _config.yml(站点级)
1 | title: 我的小站 |
第二步:改 _config.fomalhaut.yml(主题级),至少改这几处:
1 | avatar: |
第三步:写文章
1 | hexo new post "我的第一篇文章" # 生成 source/_posts/YYYY-MM-DD-我的第一篇文章.md |
4. 构建产物
1 | hexo clean && hexo generate && gulp |
产物在 public/,gulp 负责 HTML / CSS 压缩。
🗂 目录结构与文件地图
整体结构
1 | ├─ _config.yml 站点级配置(标题/作者/域名/部署/插件) |
source/css/ —— 站点级样式,各管什么
| 文件 | 负责的功能 |
|---|---|
about-page.css | 关于页版式(Hero、线路卡、技术栈、时间线)。选择器全以 .ab2 开头,只影响 /personal/about/ |
aside-calendar.css | 侧栏「日历卡 + 倒计时卡」外观,只作用 #aside-calendar / #aside-countdown |
avatar-glow.css | 侧栏头像呼吸灯(颜色跟随主题色) |
census.css | 网站统计页看板排版,只由 /site/census/ 页面引入 |
coin.css | 投币按钮样式(文章底部「投喂」区) |
gitcalendar.css | GitHub 贡献日历底色与格子 |
kslink.css | 友人帐「快速申请」按钮 |
mobile-drawer.css | 手机端抽屉菜单改版(13 小节),窄屏自动生效 |
site-inject.css | 站点注入样式合集(横幅公告、PC 浅色主题、侧栏加宽、列表分页、面包屑、小站资讯卡、aplayer 音量条、页脚隐藏本站项等) |
stats.css | 文章统计页图表排版,只由 /tags/ 页生效 |
timeline-archive.css | 「旧时光」页时间轴外观 |
twikoo.css | Twikoo 评论区美化(表单/列表/按钮统一到主题色) |
typewriter.css | 首页副标题打字机观感 |
source/js/ —— 站点级脚本,各管什么
入口与模块(由 source/js/fomal.js 统一按顺序加载,加载清单在 _config.fomalhaut.yml 的 inject.bottom)
| 文件 | 负责的功能 |
|---|---|
fomal.js | 站点主引导(105 行)。控制台执行 __fomal.check() 可自检各模块是否加载成功 |
modules/reading.js | 阅读进度条 + FPS 检测 |
modules/nav.js | 导航栏吸顶、首屏欢迎语、侧栏「欢迎信息」卡片、分享按钮、「随便逛逛」 |
modules/console-art.js | 控制台字符画与版权署名 |
modules/effects.js | 页面装饰特效:雪花 / 星空 / 表情放大 |
modules/cursor.js | 鼠标相关:右键菜单、小猫咪、听话鼠标 |
modules/shell.js | 站点「外壳」行为:快捷键、夜间动画、标题恶搞、搜索框、手机滚动条 |
modules/settings.js | 美化设置面板(Winbox),字体 / 主题色 / 背景 / 显示偏好四节的全部交互 |
modules/footer-time.js | 页脚「本站已运行 X 天」计时器 + 摸鱼徽章 |
data/holidays.js | 法定休息日判断(纯数据) |
data/voyager1.js | 旅行者 1 号距离模型(纯计算) |
独立功能脚本
| 文件 | 负责的功能 |
|---|---|
ai-chat.js | AI 助手前端本体(对话面板、流式输出、Markdown 渲染) |
aside-calendar.js | 侧栏日历卡 + 倒计时卡渲染(农历、节气、下一个节日) |
lunar.js | 农历 / 二十四节气换算(1900–2100) |
festival.js | 节日提醒通知卡片(25 个节日集中成一张表) |
celebrate.js | 全屏礼炮 / 烟花(只在喜庆节日被 festival.js 动态插入) |
author-status.js | 侧栏个人信息卡右上角状态胶囊 |
census.js | 网站统计页图表数据(百度统计 API) |
stats.js | 文章统计页增强 |
gitcalendar.js | GitHub 贡献日历渲染 |
timeline-archive.js | 「旧时光」页时间轴行为层 |
notify.js | 轻量通知组件(替代 Vue + Element-UI 的 $notify) |
pjax-guard.js | 修 pjax 选择器不匹配导致的换页整刷与遮罩转圈 |
wechat-qr.js | 社交二维码点击 → 同页灯箱展示 |
kslink.js | 友人帐「快速申请」表单填充 |
bibi.js | B 站粉丝数等数据展示 |
coin.js | 投币音效与动画 |
footer-music.js | 页脚「猜你想看」补一条「听点音乐」→ /life/music/ |
leaves.js | 落叶特效 |
love.js | 「在一起 X 天」计时 |
51la.js | 51LA 统计与灵雀监控初始化 |
source/js/inject/(由 inject.head / inject.bottom 以 <script> 引入)
| 文件 | 负责的功能 |
|---|---|
beauty-boot.js | 美化模块首屏预置(把 localStorage 里的字体/主题色/背景尽早写进 :root,避免闪默认样式) |
typewriter.js | 首页副标题打字机「丝滑版」 |
search-lazy.js | Algolia 搜索按需加载 |
scroll-gap-fix.js | 锚点跳转补偿(常驻顶栏 70px) |
webinfo-card.js | 侧栏「小站资讯」卡:KPI 数字滚动、运行天数、站点更新时间 |
ping-route.js + ping-route-boot.js | 公告栏里每条部署线路的实时延迟徽标 |
about-route-probe.js | 关于页线路卡右下角的「实时延迟」徽标 |
pc-local-link.js | 版权卡「文章链接」显示当前访问域名 |
right-menu-state-boot.js | 侧栏「右键模式」按钮的状态同步 |
ft-ad-extra.js | 页脚友链补一个「广告位招租」 |
scripts/ —— 站点级 Hexo 插件(构建期跑)
| 文件 | 负责的功能 |
|---|---|
ai-chat-inject.js | 往每个页面 </body> 前注入 window.AI_CHAT_CONFIG 与 /js/ai-chat.js |
gallery-pager.js | 相册自动分页 |
magnet-local-links.js | 修首页小冰磁贴跳到外站的问题 |
post-copyright-local-link.js | 修文章版权卡「文章链接」写死主域名的问题 |
sticky-post.js | 正文标记置顶(sticky: true → 首页置顶角标) |
swiper-lazyload-fix.js | 修首页轮播在 pjax 往返后懒加载失效 |
tag-map-local.js | 把 hexo-tag-map 的 jsDelivr CDN 改成本站自托管 |
vercel-api-copy.js | 构建后把 api/、functions/、vercel.json 拷进 public/ |
💡 要不要改主题? 尽量别改。能用配置解决的走
_config.fomalhaut.yml;配置解决不了的,写进source/css/*.css或source/js/,再用inject引入——这样升级主题时直接覆盖themes/fomalhaut/就行。
⚙️ 主要功能怎么配
下面所有片段都写在站点根目录的
_config.fomalhaut.yml里(除非特别说明)。
1. 导航菜单
1 | menu: |
缩进一层就是二级菜单。图标可以写 fas fa-xxx(Font Awesome)或 faa-tada、faa-spin 这类动画类名。
2. 顶部图与封面
1 | disable_top_img: false |
- 单篇文章想指定封面:在文章 Front-matter 写
cover: 图片链接。 cover.default_cover现在填的是固定的 picsum 图片 ID(不是随机 seed),所以每次刷新不会变图、也不会出现奇怪内容。换成你自己的图床地址即可。
3. 主题色与暗色模式
1 | theme_color: |
站点里绝大部分自定义样式的颜色都由 var(--theme-color) 派生(用了 color-mix),所以换主题色时整站会跟着变——这也是美化面板「主题色设置」能实时预览的原因。
4. 侧栏卡片
1 | aside: |
想加完全自定义的卡片:写进 source/_data/widget.yml,用 top: / bottom: 分组,html: 里写任意 HTML。侧栏的「日历卡 / 倒计时卡」就是这么做出来的。
5. 评论系统
支持 11 种:Twikoo / Waline / Valine / Giscus / Utterances / Gitalk / Disqus / Disqusjs / Livere / Remark42 / Facebook Comments。
1 | comments: |
Twikoo 完整配置(推荐,无需后端服务器)
- 部署 Twikoo 服务端(三选一):
- Vercel 一键部署(最省事):打开 https://twikoo.js.org/quick-start.html → 点「Vercel 部署」→ 登录 Vercel → 一路 Next → 部署完把首页那张图里的地址复制下来;
- Docker:
docker run -d -p 8080:8080 -v /data/twikoo:/data -e TWIKOO_THROTTLE=200 ikew0ng/twikoo; - 云函数:腾讯云 SCF / 阿里云 FC 都有 Twikoo 模板。
- 在配置里填地址:
1 | twikoo: |
- 打开评论区:把上面的
comments.use设成Twikoo。 - (可选)美化:仓库已带
source/css/twikoo.css,由inject.head引入,把表单/列表/按钮统一到主题色。不需要就删掉那一行。 - (可选)首页显示最新评论:把
aside.card_newest_comment.enable设为true。
6. 搜索
1 | local_search: # 方案 A:本地搜索,零后端、零 Key |
用 Algolia 还要在根 _config.yml 补上应用信息:
1 | algolia: |
改完执行 hexo algolia 推送索引,再 hexo generate。仓库里 source/js/inject/search-lazy.js 会让 Algolia 的资源延后到点开搜索才加载。
7. 网站统计
① 不蒜子(前端 PV / UV,零配置)
1 | busuanzi: |
② 各平台统计脚本(填 ID 即生效)
1 | baidu_analytics: # 百度统计 ID,https://tongji.baidu.com/web/welcome/login |
③ 51LA + 灵雀监控(这个不在 yml 里)——打开 source/js/51la.js,换成你自己的 ID:
1 | LA.init({ id: "YOUR_51LA_ID", ck: "YOUR_51LA_CK", hashMode: true }); |
④ 网站统计页 /site/census/(图表看板,用百度统计开放 API)——配置在 source/js/census.js:
1 | var start_date = '20200101' // 统计开始日期 |
⑤ GitHub 贡献日历(根 _config.yml,默认关闭,因为需要你自己搭数据源):
1 | gitcalendar: |
8. 美化设置面板(每一项都干什么)
打开方式:右下角齿轮图标。所有设置存在浏览器 localStorage,不写服务器;面板底部有「恢复默认设置」。
| 分节 | 项目 | 作用 |
|---|---|---|
| 一、显示偏好 | 卡片透明度 | 正文卡片背景的不透明度(0–100%) |
| 背景滤镜 | 对全站背景图做模糊 / 饱和度 / 对比度处理 | |
| 星空特效(夜间模式) | 夜间背景上飘的星空粒子 | |
| 霓虹彩虹(夜间模式) | 夜间标题的霓虹发光动画 | |
| 帧率监测 | 左下角 FPS 数字(调试用,平时可关) | |
| 雪花特效(白天模式) | 白天飘雪 | |
| 右侧部件 | 右下角按钮列的显示/隐藏 | |
| 顶栏常驻 | 滚动时导航栏是否一直吸顶 | |
| 侧栏显隐 / 侧栏位置 | 侧栏显示隐藏、放左边还是右边 | |
| 二、主题色设置 | 13 个预设色 | red / orange / yellow / green / puregreen / blue / heoblue / darkblue / purple / purepurple / pink / gray / black,点一下全站换色 |
| 三、字体设置 | 常规字体 3 款 | 霞鹜文楷(默认)/ 思源宋体 / 霞鹜新晰黑,另有「系统默认」 |
| 代码块字体 3 款 | JetBrains Mono / Fira Code / Source Code Pro | |
| 四、背景设置 | 1 风景 · 山野 / 2 风景 · 水与森林 / 3 风景 · 更多 | 三组风景壁纸(各 8 张,走 picsum 公共 CDN) |
| 4 渐变色 / 5 纯色 | 免图片的渐变与纯色背景 | |
| 6 适配手机 | 竖屏比例的背景图 | |
| 7 壁纸 API | 每次刷新随机换一张的在线壁纸接口 | |
| 8 自定义背景 | 自己粘贴图片链接 |
改面板本身:
- 改默认值(访客没动过面板时用什么):改
_config.fomalhaut.yml的font/theme_color/background段,以及source/js/inject/beauty-boot.js; - 改可选列表(加字体、加壁纸、加主题色):改
source/js/modules/settings.js的FONT_LIST/CODE_FONT_LIST(第 108–111 行)与面板 HTML(第 845–1050 行),新增字体的@font-face写在themes/fomalhaut/source/css/_custom/custom.css的「字体引入」一节; - 直接关掉面板:
beautify.enable: false,然后去掉inject.bottom里settings.js那一行。
9. 刷新与性能相关开关
1 | pjax: |
10. AI 助手
右侧悬浮的对话面板,能总结当前页面、解释名词。前端本体在 source/js/ai-chat.js,由 scripts/ai-chat-inject.js 自动注入到每个页面(不改主题源码)。
1 | ai_chat: |
用法 A:直连服务商(本地 / 内网测试用)——把 Key 放进 .ai-chat-key(站点根目录,一行纯文本)或直接写 ai_chat.api_key。这样 Key 会随页面下发到浏览器,任何人 F12 都能看到,别在公网用。
用法 B:同源代理(公网推荐,仓库已带实现)
- 部署平台加环境变量
DEEPSEEK_API_KEY(Vercel:Settings → Environment Variables;Cloudflare Pages:Settings → Environment variables); - 构建时
scripts/ai-chat-inject.js会自动把前端的api_base改成/api、Key 换成占位符via-proxy; - 请求打到
api/chat/completions.js(Vercel)或functions/api/chat/completions.js(Cloudflare Pages),由它在服务端读环境变量再去请求服务商。
代理函数自带:每 IP 限流、max_tokens 上限(MAX_TOKENS_CAP = 8192)、CORS 白名单。改白名单两种方式:
1 | # 方式一:改两个常量(api/ 与 functions/ 两份都要改) |
换成别的大模型:api_base 改成服务商地址(如 https://api.openai.com、https://api.moonshot.cn),model 改成对应模型名;代理函数里的 Authorization: Bearer <key> 是 OpenAI 兼容格式,大多数国内厂商都通用。
关掉它:ai_chat.enable: false 即可。
11. 友人帐 / 朋友圈 / 画廊等页面
| 页面 | 入口文件 | 数据来源 |
|---|---|---|
| 友人帐(友链) | source/social/link/index.md | source/_data/link.yml |
| 朋友圈 | source/social/fcircle/index.md | hexo-circle-of-friends 产出的静态 JSON |
| 画廊 | source/box/gallery/index.md + wallpaper/index.md | 页面内 Markdown 图片 |
| 网址导航 | source/box/nav/index.md | 页面内 HTML + source/box/nav/icons/ 图标 |
| 关于 | source/personal/about/index.md | 页面内 HTML,样式在 source/css/about-page.css |
| 旧时光(时间线) | source/site/time/index.md | {% timeline %} 标签 |
| 八音盒 | source/life/music/index.md | Meting API + 网易云歌单 ID |
| 天文星图 | source/box/astronomy/voyager.html | 独立 HTML,skip_render 不参与渲染 |
友人帐怎么加人:编辑 source/_data/link.yml:
1 | - class_name: 小伙伴们🍭 |
友人帐有三种样式,改 flink_style: volantis(可选 butterfly / volantis / flexcard)。
12. 页脚与页脚徽标
页脚模板在 themes/fomalhaut/layout/includes/footer.pug,四块内容:
格言+猜你想看(第 1–31 行):文案与链接直接写在 pug 里;推荐友链小头像格(第 32–59 行):硬编码的展示位,换成你自己的朋友即可(头像建议 100×100 以内);source/js/inject/ft-ad-extra.js会在末尾再补一个「广告位招租」凑成 4+4 两排;- 版权行 / 已运行天数 / 摸鱼徽章(第 60–85 行):文字来自
footer.owner与footer.custom_text; - 徽章列
p#ghbdages(第 86–113 行):两种来源——- 本地 SVG:放在
source/assets/badge/,用/assets/badge/xxx.svg引用; - shields.io 动态徽章:
https://img.shields.io/badge/左侧文字-右侧文字-颜色.svg,文字里的空格写成_,颜色可用十六进制(去掉#)。
- 本地 SVG:放在
增删一行徽章的写法:
1 | a.github-badge(target='_blank' href='https://hexo.io/' style='margin-inline:5px' title='博客框架为 Hexo') |
改完 .pug 记得重启 hexo server,Hexo 只在启动时读模板。
✍️ 怎么开始写文章
新建文章
1 | hexo new post "文章标题" # 按 scaffolds/post.md 生成 source/_posts/YYYY-MM-DD-文章标题.md |
或者直接在 source/_posts/ 里新建一个 .md 文件——文件名建议用 YYYY-MM-DD-标题.md(由 _config.yml 的 new_post_name 决定)。
文章网址由 permalink: posts/:abbrlink.html 自动生成一串哈希(hexo-abbrlink 插件),所以改标题不会改变已发布文章的网址。
Front-matter 全字段说明
写在文件开头 --- 之间:
1 |
|
只写需要的字段即可,其余留空就是默认行为。
加一个新页面
- 在
source/下建目录(例如source/tools/),里面放index.md:
1 | --- |
- 在
_config.fomalhaut.yml的menu:里加一项:工具箱: /tools/ || fas fa-toolbox。
页面里可以直接写 HTML,想让样式单独成文件就写到 source/css/xxx.css,再在 inject.head 里加一行 <link>。
图片怎么放
| 方式 | 写法 | 适用 |
|---|---|---|
| 站内相对路径 |  | 图片放 source/assets/ |
| 同目录相对路径 |  | 需要在 _config.yml 打开 post_asset_folder: true |
| 外链 / 图床 |  | 图片多时推荐 |
分类与标签
- 分类与标签不用提前创建,Front-matter 里写了就会自动生成
/categories/xxx/、/tags/xxx/; - 分类页与标签页的版式由
category_ui/tag_ui控制(留空默认,填index为卡片式); - 首页的「小冰分类磁贴」由根
_config.yml的magnet段控制,display列表里的name必须与文章分类名一致。
🔧 最常改的地方(速查)
| 我想改…… | 去哪改 |
|---|---|
| 站点名 / 作者 / 域名 / 部署仓库 | 根 _config.yml 的 title / author / url / deploy |
| 首页标题下的副标题 | _config.fomalhaut.yml 的 subtitle |
| 主题色 | _config.fomalhaut.yml 的 theme_color.main,或让访客用面板自己选 |
| 头像 | _config.fomalhaut.yml 的 avatar.img(默认 /assets/avatar.webp) |
| 首页大图 | index_img;全站背景改 inject.head 里 #defineBg 那行的 --default-bg |
| 文章默认封面池 | cover.default_cover |
| 顶部导航 | menu |
| 页脚文案 / 版权 / 徽章 | themes/fomalhaut/layout/includes/footer.pug(改完重启 server)+ footer.owner / footer.custom_text |
| 侧栏卡片开关 | aside 段 |
| 评论区 | comments.use + 对应系统的段(如 twikoo.envId) |
| 统计 ID | baidu_analytics 等;51LA 在 source/js/51la.js |
| AI 助手 | ai_chat 段 |
| 字体 | themes/fomalhaut/source/css/_custom/custom.css 的「字体引入」+ source/js/modules/settings.js 的 FONT_LIST |
| 社交图标 | social(格式:名称: 链接 || 图标类名 || 动画类名) |
| 首页轮播 | 根 _config.yml 的 swiper 段 |
| 首屏加载动画 | preloader(样式在 themes/fomalhaut/layout/includes/loading/load_style/) |
| 文章置顶 | 文章 Front-matter 写 sticky: 1 |
🏷 外挂标签速查
主题注册的全部标签(实现都在 themes/fomalhaut/scripts/tag/):
| 标签 | 用法 | 说明 |
|---|---|---|
note | {% note info flat %}文字{% endnote %} | 提示块。样式:default/primary/success/info/warning/danger;形状:flat/modern/simple/disabled |
tabs | {% tabs 组名 %} + <!-- tab 标题 --> | 标签页,支持 subtabs / subsubtabs 嵌套 |
timeline | {% timeline 标题 %} + <!-- timeline 日期 --> | 时间线 |
btn | {% btn 链接, 文字, 图标, 选项 %} | 按钮。选项:color outline center block larger |
label | {% label 文字 颜色 %} | 行内小标签 |
gallery | {% gallery %} … {% endgallery %} | 相册(带灯箱) |
galleryGroup | {% galleryGroup '名称' '描述' '/链接' 封面图 %} | 相册分组入口 |
mermaid | {% mermaid %}graph LR; A-->B;{% endmermaid %} | Mermaid 图表 |
flink | {% flink %} | 读取 source/_data/link.yml 渲染友人帐 |
hideToggle | {% hideToggle 标题 %}内容{% endhideToggle %} | 折叠块,另有 hideInline / hideBlock |
inlineImg | {% inlineImg 图片链接 宽度 %} | 行内小图 |
注意标签名:是 btn 不是 button,也没有 span,写错会报 unknown block tag。
现成的例子见仓库里的 source/_posts/2026-10-02-外挂标签速查.md。
🌐 部署
方案 A:GitHub Pages + GitHub Actions(推荐,仓库已带工作流)
- 把仓库推到你自己的 GitHub 账号;
- 在仓库
Settings → Secrets and variables → Actions里按需添加密钥; - 修改
.github/workflows/autodeploy.yml里的repository-name为你的用户名/你的用户名.github.io; - 推送到
main分支,或在 Actions 页面手动 Run workflow。
方案 B:Vercel —— npx vercel,首次会引导你关联项目。仓库根目录的 vercel.json 已声明 AI 代理函数的超时与内存。
方案 C:Cloudflare Pages —— 构建命令 hexo clean && hexo generate && gulp,输出目录 public。
方案 D:本地生成 + 手动推送 —— hexo clean && hexo generate && gulp,然后把 public/ 推到任意静态托管。
❓ 常见问题
Q:执行 hexo server 报找不到主题?
确认 _config.yml 里的 theme: 值与 themes/ 下的目录名一致(默认 fomalhaut)。
Q:改了 themes/ 下的 .pug 文件没生效?
重启 hexo server。Hexo 只在启动时读取模板;改样式与文章则不需要重启。
Q:_config.fomalhaut.yml 和 themes/fomalhaut/_config.yml 改哪个?
改根目录的 _config.fomalhaut.yml。主题目录里那份只是默认值模板,会被根目录那份覆盖。
Q:首页文章列表没有封面图?
在文章 Front-matter 写 cover: 图片链接,或在 cover.default_cover 里配置封面池。
Q:字体 / 图片挂了?
默认走公共 CDN(cdn.jsdelivr.net 的 @fontsource/* 与 picsum.photos)。若网络访问不畅,把 custom.css 里的 @font-face 换成你自己的字体,把 cover.default_cover 换成你自己的图床即可。
Q:美化面板的颜色/字体改了,下次打开又变回默认?
设置存在浏览器 localStorage。换了域名、清了浏览器数据或改了 storage_key 就会重置,属于正常行为。
🙏 授权与致谢
- 本项目基于 hexo-theme-butterfly(Apache-2.0,作者 Jerry)二次开发,继续沿用 Apache-2.0 协议,
themes/fomalhaut/LICENSE保留了上游许可证; - 部分美化思路参考了 Hexo 社区的公开方案(akilar、anzhiyu 等),在此致谢;
- 示例图片来自 picsum.photos,字体来自 jsDelivr 上的
@fontsource/*开源字体包(全部为 SIL OFL 许可); - 仓库里的示例数据(域名、邮箱、友链、统计 ID)均为占位内容,请替换为你自己的。
📚 相关文章
- Hexo 博客搭建基础教程(一):从零装 Node、Hexo、Git 到连上 GitHub
- 博客魔改教程总结:这个主题里各种细节是怎么做出来的
- 网站性能优化的一些小技巧:本站在用的加载与渲染优化
🌟 Star 概况
本文章会长期更新。安装或使用中遇到问题,欢迎在评论区留言,或者直接去 GitHub 仓库 提 Issue。





