重启自动化博客:把精力只交给思考
因为各种各样的原因,停更了好久好久,我重新发现了自己的博客!问题逐渐清晰:写作本身并不复杂,复杂的是围绕写作的那一整套维护流程。字体、标签、构建、发布,这些本应“透明存在”的事情,长期占据了注意力”。
这次重启博客,给也一个朴素的目标:
让博客系统退到后台,让注意力只给思考本身。
一、为什么要重构博客流程
5年前,博客方案高度依赖本地环境:
- 中文字体压缩依赖 FontSpider
- tag 页面靠手动或零散脚本维护
- 换一台电脑,就要重新搭环境
- Windows 下的使用体验尤为割裂
这些问题并不致命,但会持续消耗心力。
当维护成本开始高于写作成本,博客自然会停下来。
二、升级中文字体压缩:从“本地工具”到“构建环节”
1. 放弃 FontSpider
FontSpider 在早期解决了中文 Web 字体的实际问题,但在长期使用中逐渐显现出局限:
- 对本地 Node 环境依赖较重
- CLI 解析 HTML 的稳定性一般
- 与 CI 的协作成本偏高
更关键的一点在于:字体子集化本身属于构建行为,而不是写作行为。
2. 新方案:GitHub Actions + fonttools
现在的做法是:
- 本地只保留完整字体文件
- GitHub Actions 构建时:
- 扫描生成后的 HTML
- 提取实际出现的字符
- 使用
pyftsubset生成 woff2 子集字体
- 自动发布到 GitHub Pages
调整之后,本地写作流程变得非常简单,只剩下:
git push
三、tag 自动生成:让结构成为派生结果
1. pages-themes/minimal 的现实约束
在 GitHub Pages 环境下使用 pages-themes/minimal,意味着:
- 无法使用自定义 Jekyll 插件
- 官方不提供 tag 页面生成机制
- Ruby 侧的扩展空间有限
2. 使用 Python 生成 tag 页面
在构建前,通过一个 Python 脚本完成三件事:
-
扫描 _posts/*.md
-
解析 Front Matter 中的 tags
-
自动生成 tag/*.md
-
形如tags:[github, ai] 全部小写,无特殊符号
这些生成的 tag 页面本质上是普通 Markdown 文件,Jekyll 可以直接渲染,无需任何插件支持。
四、启示
这次调整过程中,逐渐形成了一个清晰的认识:
博客系统本身,也应当遵循工程化思维。
在这样的视角下:
-
Markdown 是源数据
- 页面、字体、tag 都是构建产物
- 人负责表达,机器负责派生
一旦角色边界清晰,很多纠结自然消失。 写作不再被环境、工具或配置打断。
最终留下的,只需要两件事:
1 持续思考,以及把思考记录下来。
2 其余工作,交给自动化即可。
补遗1
特别注意构建路径:_config.yaml 问题:
include:
- _pages
- tag
- .nojekyll #防止 GitHub Pages 二次处理
keep_files:
- assets
- tag
- CNAME
- .nojekyll
exclude:
- scripts/
- vendor/
- Gemfile
- Gemfile.lock
- node_modules/
- "*.gem"
- "*.gemspec"
- LICENSE
- README.md
- all-text.txt # 字体子集化临时文件
- assets/fonts/fontSource/ # 源字体文件目录
- "*.pyc"
- __pycache__/
# 不要排除 assets!
补遗2:GitHub Actions 工作流
on:
push:
branches: [mine] # 或你的默认分支
pull_request:
types: [opened, synchronize]
# 添加权限
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1️⃣ 拉代码
- uses: actions/checkout@v4
# 2️⃣ Ruby(Jekyll)
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.2
bundler-cache: true
# 3️⃣ Python(tag + 字体)
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install Python deps
run: |
pip install fonttools pyyaml brotli
# 4️⃣ 生成 tag 页面(在 Jekyll build 前)
- name: Generate tag pages
run: |
python scripts/gen_tags.py
ls -la tag/ || ls -la _site/tag/ || echo "Tag directory not found"
# 5️⃣ 字体子集化
- name: Subset Chinese font
run: |
find . \( -name "*.md" -o -name "*.html" -o -name "*.yml" \) -print0 \
| xargs -0 cat \
| sed 's/<[^>]*>//g' \
| tr -d '\n' \
| sort -u \
> all-text.txt
pyftsubset assets/fonts/fontSource/YangRenDongZhuShiTi.ttf \
--text-file=all-text.txt \
--output-file=assets/fonts/YangRenDongZhuShiTi.woff2 \
--flavor=woff2 \
--layout-features='*' \
--with-zopfli
ls -lh assets/fonts/YangRenDongZhuShiTi.woff2
# 6️⃣Jekyll 构建
- name: Build with Jekyll
run: bundle exec jekyll build
env:
JEKYLL_ENV: production
# 🆕 .nojekyll 防止 GitHub Pages 二次处理 CNAME 确保自定义域
- name: Add critical files
run: |
touch _site/.nojekyll
echo "blog.reaticle.com" > _site/CNAME
# 7️⃣ 验证构建产物
- name: Verify build output
run: |
echo "=== Checking tag directory ==="
ls -la _site/tag/ || echo "⚠️ No tag directory in _site"
echo "=== Checking fonts directory ==="
ls -la _site/assets/fonts/ || echo "⚠️ No fonts directory in _site"
echo "=== Site structure ==="
find _site -type f -name "*.woff2" -o -type d -name "tag"
# 8️⃣上传构建产物
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
# 部署任务
deploy:
if: github.ref == 'refs/heads/mine' # 只在主分支部署
environment:
name: github-pages
url: $
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
# 🆕 部署后验证(可选)
- name: Verify deployment
run: |
sleep 30 # 等待 CDN 传播
curl -I $BUILD_INFO.txt || true