perf: 完整性能优化 - JS按需加载 + 字体子集化 + 自动化

This commit is contained in:
Vaica committed 2026-06-03 13:03:17 +08:00
1 parent ca9e87be8f
commit d035a2179e
14 files changed
+2317 -10

No files matched your search

+165
View File
@@ -0,0 +1,165 @@
# GitHub Actions: 字体子集化自动化
# 当内容更新时自动提取字符并生成优化的子集字体
name: Font Subset Optimization
on:
# 当推送到main分支且content目录有变更时触发
push:
branches:
- main
paths:
- 'content/**'
- 'layouts/**'
# 允许手动触发
workflow_dispatch:
inputs:
force_rebuild:
description: '强制重新生成子集字体'
required: false
default: 'false'
type: boolean
# 可选:每周自动运行一次(检查是否需要更新)
schedule:
- cron: '0 2 * * 1' # 每周一凌晨2点
# 限制同时运行的工作流数量
concurrency:
group: font-subset-${{ github.ref }}
cancel-in-progress: true
jobs:
subset-fonts:
name: Subset Fonts
runs-on: ubuntu-latest
timeout-minutes: 30
# 只在主仓库上运行(fork不运行)
if: github.repository == 'zqlit/blog'
steps:
# 1. 检出代码
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史用于比较
# 2. 设置Python环境
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
# 3. 安装Python依赖
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install fonttools brotli
# 4. 检查是否需要更新(可选)
- name: Check if update needed
id: check
run: |
# 检查内容文件是否有变更
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "needs_update=true" >> $GITHUB_OUTPUT
else
# 比较content目录的变更
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD -- content/ layouts/ || echo "")
if [ -n "$CHANGED_FILES" ]; then
echo "needs_update=true" >> $GITHUB_OUTPUT
echo "Changed files: $CHANGED_FILES"
else
echo "needs_update=false" >> $GITHUB_OUTPUT
echo "No content changes detected"
fi
fi
# 5. 构建Hugo站点(用于提取字符)
- name: Build Hugo site
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
- name: Build
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
run: hugo --destination=public --minify
# 6. 运行字体子集化脚本
- name: Subset fonts
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
run: |
python scripts/subset-font-safe.py
# 7. 检查子集字体是否真的优化了
- name: Verify optimization
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
run: |
ORIGINAL_SIZE=$(stat -f%z themes/Ying/static/font/zql-v2.woff2 2>/dev/null || stat -c%s themes/Ying/static/font/zql-v2.woff2)
SUBSET_SIZE=$(stat -f%z themes/Ying/static/font/zql-v2-subset.woff2 2>/dev/null || stat -c%s themes/Ying/static/font/zql-v2-subset.woff2)
echo "Original font size: $ORIGINAL_SIZE bytes"
echo "Subset font size: $SUBSET_SIZE bytes"
# 检查子集字体是否真的更小
if [ $SUBSET_SIZE -ge $ORIGINAL_SIZE ]; then
echo "⚠️ Warning: Subset font is not smaller than original"
echo "Skipping commit..."
exit 0
fi
REDUCTION=$((ORIGINAL_SIZE - SUBSET_SIZE))
PERCENTAGE=$((REDUCTION * 100 / ORIGINAL_SIZE))
echo "✅ Font optimized: reduced $REDUCTION bytes ($PERCENTAGE%)"
# 8. 提交更改(如果有优化)
- name: Commit changes
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
run: |
# 配置git
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
# 检查是否有变更
if git diff --quiet; then
echo "No changes to commit"
exit 0
fi
# 添加变更的文件
git add themes/Ying/static/font/zql-v2-subset.*
git add themes/Ying/static/font/used_chars.txt
# 提交
git commit -m "chore: update font subset (automated)
- Updated font subset based on latest content
- Subset characters: $(wc -c < themes/Ying/static/font/used_chars.txt) chars
- Font size: $(stat -c%s themes/Ying/static/font/zql-v2-subset.woff2 2>/dev/null || echo 'N/A') bytes"
# 9. 推送更改
- name: Push changes
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
run: |
git push origin main
# 10. 创建摘要
- name: Create summary
if: steps.check.outputs.needs_update == 'true' || github.event.inputs.force_rebuild == 'true'
run: |
echo "## 🔤 Font Subset Optimization" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "✅ Font subset updated successfully!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📊 Statistics" >> $GITHUB_STEP_SUMMARY
echo "- **Characters in subset:** $(wc -c < themes/Ying/static/font/used_chars.txt)" >> $GITHUB_STEP_SUMMARY
echo "- **Subset font size:** $(stat -c%s themes/Ying/static/font/zql-v2-subset.woff2 2>/dev/null || echo 'N/A') bytes" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📝 Triggered by" >> $GITHUB_STEP_SUMMARY
echo "- Event: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
echo "- Commit: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY