docs: 全量梳理文档结构;补 Gitea 迁移指南 / 架构精简候选;架构总览补证书管家子系统

用户四问:「把项目文件全部理一遍 还有readme文件」「gitea 后面可能还要迁移 帮我写一个迁移文档」
「证书管家做完了吗」「感觉现在架构还是复杂了」

一、文档梳理:根目录 15 个 md → 2 个

根目录只留 README.md(入口)+ 架构总览.md(现状唯一事实源),其余全部归位:

  docs/
  ├── README.md              ← 新增:文档地图(入口 / 当前有效 / 历史归档 三层)
  ├── 证书管家.md             ← 原「函数版证书管家-方案.md」改名
  │                              (它早已是「现状+沿革」文档,标题名不副实 —— 签发早已不在 CF Worker)
  ├── Gitea迁移指南.md        ← 新增
  ├── 架构精简候选.md         ← 新增
  ├── CNB构建落地方案.md / GITEA_SECRETS.md
  └── archive/{平台与选型,功能与修复,主题与内容}/   ← 32 份

- 32 个归档文档统一加 `> 📦 本文档已归档` banner,并指向架构总览
  —— 这个仓库历史文档里全是「权威口径」,混看很容易拿废弃结论当现状
- gitea-backup/ → deploy/gitea/(原名「backup」不准,它是部署包;与其它 deploy 单元并列)
- 新增 md 链接校验(python 脚本,中文路径用 sed 不安全)→ 首轮 18 处断链
  (多一层目录要让 banner 里的相对路径补一个 ../)→ 修正后 0 断链

二、新增 docs/Gitea迁移指南.md(★ 有死线:境外 VPS 11 月到期)

★ 核心价值是「指出迁移面已大幅缩小」:仓库原有的 deploy/gitea/迁移前检查清单.md
(2026-10-04)是为「Gitea + act_runner + 又拍云同步 *整套* 搬迁」写的,**那个前提已经不存在**——
构建归 CNB,runner / upyun-sync / 中转机 / COS 都不需要了。迁移实际只剩「搬数据卷 + 改地址」。

★★ 全文最重要:本仓有 9 处写死了旧地址,按易漏程度排序(1-3 本机,4-5 线上)
  1 本机 .git/config 的 gitea remote
  2 scripts/setup-cnb-remotes.sh 的 GITEA_URL 默认值
  3 deploy/editor-api/bootstrap.sh 的 GITEA_URL 默认值
  4 ★ /srv/editor-api/.env 的 GITEA_URL      ← 漏了会「持续报错但只警告不阻断」,没人发现
  5 ★ /srv/blog 的 gitea remote               ← 同上
  6 docs/GITEA_SECRETS.md
  7-9 架构总览.md / README.md / editor-api/README.md
(不用改:docker-compose.editor.yml、server.mjs、pushall 别名 —— 只引用 remote 名字)

另含:建议新实例改用域名而非 IP(以后搬机器只改 DNS;⚠️ Gitea 28 起只读 ROOT_URL 不读
[server] DOMAIN);rsync 而非 dump(属主必须 uid/gid 1000);切换顺序「先建新的→验证→再拆旧的」;
验证清单强调 `git push gitea --dry-run`;第九节给出「干脆不留这个辅仓」的选项与判断依据。

顺带修掉两个硬伤:
- deploy/gitea/docker-compose.yml 的镜像 tag `1.28.0-rootless` 根本不存在
  (Gitea 28 起去掉 1. 前缀)→ 改 28.0.0-rootless(pin 死,不用 latest)
- deploy/gitea/.gitignore 漏了 backups/(跑一次备份就会把含 secrets 的 dump 写进历史)

三、证书管家核实(结论:已上线运行,2 个遗留)

线上实测:容器 Up (healthy);/preflight 7/7 全过;3 组域名;下次自动续期 04:10。

遗留 ① writeapi.usj.cc 证书没纳管(真问题):nginx 配置在 /www/conf.d/writeapi.usj.cc.conf,
不在 /www/sites/ 管理树里 → 1Panel 的 ssl/upload+sslID 物化碰不到它。
实测仍是 RSA / CN=usj.cc / 到期 2026-12-07,本项目续期不会更新 → 12 月会断。
遗留 ② dnsapi.usj.cc 没上 HTTPS。
(澄清假问题:200181.xyz 公网看到的 LE 证书是 CF 自家边缘证书,与本项目无关)

四、新增 docs/架构精简候选.md(回应「架构还是复杂了」)

结论:复杂度不在件数,在「跨 6 个环境,其中 4 个要自己维护」。国内机 9 个容器里属于本项目的
只有 3 个,能动的只有 2 个。5 个候选 + 建议执行顺序:
  1 停 certimate 容器(工作流已全停用)——先 stop 观察,别急着删
  2 cn-dns-helper 大概率已是遗留(「Worker 侧签发」时代产物;现在签发在国内机且自带 dnsprovider,
    /preflight 显示 CF 凭据可读;Worker 侧 dnsremoted.ts 已无任何引用)
  3 Gitea:迁 or 不留
  4 两套写作前端收敛(本轮不动,先看使用频率)
  5 writeapi.usj.cc 证书纳管(12 月死线)
并明确列出 6 项「必要复杂度,不建议动」。

五、架构总览补齐证书管家子系统(★ 之前完全缺席)

一个完整子系统在「事实源文档」里一个字都没有 —— 这本身就是文档债。补:
- §0 一句话(四→五个子系统)、§1.1 子系统表、§1.2 地址地图两行
- **新增 §5.7 证书管家**:职责划分 / 为什么非要这么分(Worker 免费版 CPU 10ms)/
  三条不能破的红线(Worker 不得签发 · 证书路由只认 Bearer 会话 · 角色必须正着枚举放行)/
  纳管域名表 / 与 certimate 的关系 / 已知遗留
- .cnb.yml 行数 284 → 337(数字漂了);头部更新时间 → 2026-10-06;附录表改指 docs/
- §6 待办:#13(证书遗留)、#14(复杂度盘点)新增;#7 改写为「Gitea 11 月到期,★ 有死线」

六、记忆

.workbuddy/memory/MEMORY.md 新增「文档结构」「Gitea 迁移死线」两节;证书管家节补实测与遗留。
This commit is contained in:
zqlit committed 2026-10-06 22:27:36 +08:00
1 parent 15a8b502db
commit 1568b150b3
48 files changed
+782 -100

No files matched your search

@@ -0,0 +1,184 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../架构总览.md)。
# 🧹 Ying主题文档清理指南
## 📋 需要删除的文件(20个)
这些文件都已经整理到 `docs/性能优化文档/` 文件夹,可以安全删除。
### 删除命令(Windows CMD)
```bash
cd E:\GitHub\blog
# 删除优化文档
del themes\Ying\OPTIMIZATION_REPORT.md
del themes\Ying\OPTIMIZATION_STEP1_PLAN.md
del themes\Ying\TEST_STEP1.md
del themes\Ying\OPTIMIZATION_STEP2_PLAN.md
del themes\Ying\OPTIMIZATION_STEP2_FINAL.md
del themes\Ying\OPTIMIZATION_STEP3_PLAN.md
del themes\Ying\OPTIMIZATION_COMPLETE_GUIDE.md
del themes\Ying\IMPLEMENTATION_SUMMARY.md
del themes\Ying\TEST_JS_OPTIMIZATION.md
del themes\Ying\GUIDE_FONT_SUBSETTING.md
del themes\Ying\PLAN1_COMPLETE_SUMMARY.md
del themes\Ying\PJAX_COMPATIBILITY.md
del themes\Ying\PJAX_FIX_SUMMARY.md
del themes\Ying\FONT_OPTIMIZATION_MANUAL.md
del themes\Ying\FONT_OPTIMIZATION_FALLBACK.md
del themes\Ying\FINAL_FONT_TEST.md
del themes\Ying\GITHUB_ACTIONS_GUIDE.md
del themes\Ying\COMMIT_GUIDE.md
del themes\Ying\ACTIONS_FIX_GUIDE.md
del themes\Ying\PROJECT_COMPLETE_SUMMARY.md
```
### 删除命令(Mac/Linux)
```bash
cd E:\GitHub\blog
# 删除优化文档
rm themes/Ying/OPTIMIZATION_REPORT.md
rm themes/Ying/OPTIMIZATION_STEP1_PLAN.md
rm themes/Ying/TEST_STEP1.md
rm themes/Ying/OPTIMIZATION_STEP2_PLAN.md
rm themes/Ying/OPTIMIZATION_STEP2_FINAL.md
rm themes/Ying/OPTIMIZATION_STEP3_PLAN.md
rm themes/Ying/OPTIMIZATION_COMPLETE_GUIDE.md
rm themes/Ying/IMPLEMENTATION_SUMMARY.md
rm themes/Ying/TEST_JS_OPTIMIZATION.md
rm themes/Ying/GUIDE_FONT_SUBSETTING.md
rm themes/Ying/PLAN1_COMPLETE_SUMMARY.md
rm themes/Ying/PJAX_COMPATIBILITY.md
rm themes/Ying/PJAX_FIX_SUMMARY.md
rm themes/Ying/FONT_OPTIMIZATION_MANUAL.md
rm themes/Ying/FONT_OPTIMIZATION_FALLBACK.md
rm themes/Ying/FINAL_FONT_TEST.md
rm themes/Ying/GITHUB_ACTIONS_GUIDE.md
rm themes/Ying/COMMIT_GUIDE.md
rm themes/Ying/ACTIONS_FIX_GUIDE.md
rm themes/Ying/PROJECT_COMPLETE_SUMMARY.md
```
---
## ✅ 保留的文件
**不要删除这些文件:**
- ✅ `README.md` - 主题说明文档
- ✅ `archetypes/post.md` - Hugo模板文件
---
## 📊 清理验证
### 清理前
```bash
dir themes\Ying\*.md
```
**应该看到20个优化文档**
### 清理后
```bash
dir themes\Ying\*.md
```
**应该只看到2个文件:**
- README.md
- archetypes\post.md
---
## 💡 已整理的文档位置
**所有优化文档已整理到:**
```
E:\GitHub\blog\docs\性能优化文档\
```
**索引文档:**
```
E:\GitHub\blog\docs\性能优化文档\README.md
```
---
## 🎯 快速清理命令
### 一键清理(Windows PowerShell)
```powershell
cd E:\GitHub\blog
# 删除所有优化文档
Remove-Item themes\Ying\OPTIMIZATION_*.md -Force
Remove-Item themes\Ying\TEST_*.md -Force
Remove-Item themes\Ying\PLAN1_*.md -Force
Remove-Item themes\Ying\PJAX_*.md -Force
Remove-Item themes\Ying\FONT_*.md -Force
Remove-Item themes\Ying\FINAL_*.md -Force
Remove-Item themes\Ying\GITHUB_*.md -Force
Remove-Item themes\Ying\COMMIT_*.md -Force
Remove-Item themes\Ying\ACTIONS_*.md -Force
Remove-Item themes\Ying\PROJECT_*.md -Force
Remove-Item themes\Ying\IMPLEMENTATION_*.md -Force
Remove-Item themes\Ying\GUIDE_*.md -Force
Remove-Item themes\Ying\OPTIMIZATION_COMPLETE_GUIDE.md -Force
Write-Host "✅ 清理完成"
```
---
## 📝 清理后提交
```bash
# 查看删除的文件
git status
# 提交清理
git add -A
git commit -m "docs: 清理Ying主题冗余文档
- 删除20个优化相关文档
- 已整理到 docs/性能优化文档/ 文件夹
- 保留 README.md 和 archetypes/post.md"
# 推送
git push origin main
```
---
## 🎉 清理完成
### 清理效果
- ✅ Ying主题目录更简洁
- ✅ 只保留必要文件
- ✅ 优化文档已整理到专门文件夹
- ✅ 便于维护和查找
### 文档位置
**所有优化文档:**
```
E:\GitHub\blog\docs\性能优化文档\
```
**索引文档:**
```
E:\GitHub\blog\docs\性能优化文档\README.md
```
---
**清理指南完成!** 🎉
**按照指南操作即可清理Ying主题中的冗余文档!**
@@ -0,0 +1,357 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../架构总览.md)。
# 博客字体优化方案 - 文章规划
## 📋 文章定位
- **目标读者:** 生活博主、非技术背景博主
- **文章风格:** 通俗易懂、重效果、少术语
- **核心卖点:** 用真实案例告诉你,字体优化能让博客快多少
---
## 📝 推荐文章结构
### 标题建议(选一个)
1. **我的博客加载快了50%,只因为改了字体**
2. **博客太慢?可能是字体拖后腿了**
3. **从3秒到1秒:我是怎么优化博客字体的**
4. **博客字体优化:一个让网站变快的简单技巧**
**推荐:** 第1个(有具体数字,有悬念)
---
### 文章大纲
```
一、开头:我的博客有多慢?(引入问题)
二、发现问题:原来是字体拖后腿(诊断过程)
三、字体优化到底是什么?(通俗解释)
四、我是怎么做的(真实案例)
五、效果对比(数据说话)
六、你也可以这样做(通用方案)
七、总结
```
---
## 📝 详细内容规划
### 一、开头:我的博客有多慢?(200字)
**写法:** 从用户视角出发,描述痛点
**要点:**
- 博客打开要3秒以上
- 移动端更慢,用户等不及就走了
- 用了各种缓存、CDN都没用
- 最后发现是字体文件太大
**示例段落:**
> 我的博客一直有个问题:打开太慢。
>
> 用PageSpeed Insights测了一下,移动端得分只有60分。加载时间3秒多,这在现在这个"3秒定生死"的时代,基本等于告诉用户"别等了,走吧"。
>
> 我试过开CDN、压缩图片、用缓存插件,效果都不明显。直到有一天,我在Network面板里发现了一个1.2MB的字体文件...
---
### 二、发现问题:原来是字体拖后腿(300字)
**写法:** 用通俗语言解释问题
**要点:**
- 中文字体为什么这么大?(2万个字符)
- 你的博客实际用了多少字?(可能只有2000个)
- 浪费了90%的带宽在不需要的字上
**类比:**
> 这就好比你要寄一封信,但邮局让你把整本字典一起寄出去。你只用了里面的几十个字,却要为整本字典的重量买单。
**数据展示:**
```
原始字体:1,226 KB(包含20,000+字符)
实际使用:2,485字符
浪费:90%的字符从未出现过
```
---
### 三、字体优化到底是什么?(200字)
**写法:** 用比喻解释,避免术语
**核心概念:**
- 字体子集化:只保留你用到的字
- 就像"按需定制",不是"全买"
**比喻:**
> 字体优化就像是去餐厅点菜。
>
> 原来的方式:把整本菜单都买下来,只吃其中几道。
> 优化后的方式:只点你要吃的菜,吃完走人。
>
> 结果:花更少的钱,吃得一样饱。
**技术原理(简化版):**
1. 扫描你博客的所有文章
2. 提取实际使用的字符
3. 生成一个"精简版"字体
4. 体积减少80%+
---
### 四、我是怎么做的(真实案例)(500字)
**写法:** 分步骤讲解,附代码和截图
**步骤1:分析现状**
```
工具:Chrome DevTools → Network面板
发现:zql-v2.woff2 文件大小 1.2MB
```
**步骤2:选择工具**
- 推荐:Python + fonttools
- 备选:在线工具(无需编程)
**步骤3:提取字符**
```bash
# 运行脚本,自动提取
python subset-font.py
```
**步骤4:生成子集**
```
结果:
- 原始:1,226 KB → 子集:740 KB
- 减少:40%
```
**步骤5:更新CSS**
```css
/* 修改前 */
src: url('../font/zql-v2.woff2');
/* 修改后 */
src: url('../font/zql-v2-subset.woff2');
```
**截图建议:**
1. Network面板显示字体大小对比
2. 脚本运行结果截图
3. 优化前后文件大小对比
---
### 五、效果对比(数据说话)(300字)
**写法:** 用图表和数据展示效果
**数据表格:**
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| 字体大小 | 1.2 MB | 740 KB | -40% |
| 加载时间 | 3.2秒 | 1.8秒 | -44% |
| PageSpeed得分 | 60 | 85 | +42% |
| 移动端体验 | 差 | 良好 | ✅ |
**用户体感:**
> 优化后最明显的变化是:页面"刷"一下就出来了。
>
> 以前打开文章,能明显看到文字先显示为方块,然后才变成正常字体。现在几乎看不到这个过程了。
**截图建议:**
1. PageSpeed Insights优化前后对比
2. Network面板加载瀑布图
3. 实际打开速度对比GIF
---
### 六、你也可以这样做(通用方案)(400字)
**写法:** 提供可复用的方案
**方案A:在线工具(零代码)**
1. 访问 fontsquirrel.com/webfont-generator
2. 上传你的字体文件
3. 选择"Expert"模式
4. 勾选"Custom Subsetting"
5. 下载优化后的字体
6. 替换原文件,更新CSS
**方案B:Python脚本(推荐)**
```bash
# 安装工具
pip install fonttools brotli
# 运行脚本
python subset-font.py
```
**方案C:找我帮忙(最简单)**
- 提供你的博客地址
- 我帮你分析和优化
- 全程指导,保证效果
**注意事项:**
- 优化前备份原文件
- 测试所有页面的显示效果
- 特殊符号可能需要单独处理
---
### 七、总结(150字)
**要点回顾:**
1. 中文字体很大,但你用的字很少
2. 字体优化可以减少40-90%的大小
3. 加载速度提升明显
4. 操作并不复杂
**结尾金句:**
> 博客优化就像减肥:找对方法,效果立竿见影。
>
> 字体优化就是那个你一直忽略、但效果惊人的"减肥方法"。
>
> 试试看,你的博客也能快50%。
---
## 📊 文章数据
### 预期指标
- **字数:** 2000-2500字
- **阅读时间:** 8-10分钟
- **代码块:** 5-6个(简化版)
- **截图:** 8-10张
- **表格:** 2-3个
### SEO关键词
- 博客优化
- 字体优化
- 网站加速
- Hugo优化
- 字体子集化
- PageSpeed提升
---
## 🎨 排版建议
### 标题层级
- H2:大章节(7个)
- H3:小节(每章节2-3个)
- H4:更细的点(少用)
### 视觉元素
- ✅ 数据表格(对比效果)
- ✅ 代码块(简化版,带注释)
- ✅ 截图(Network面板、PageSpeed)
- ✅ 比喻图(餐厅点菜的比喻)
- ✅ 对比图(优化前后)
### 代码展示原则
- 只展示必要的代码
- 每行代码都有注释
- 提供"复制即用"的版本
- 避免大段代码块
---
## 📸 截图清单
### 必须截图
1. [ ] PageSpeed Insights优化前得分
2. [ ] PageSpeed Insights优化后得分
3. [ ] Network面板字体文件大小
4. [ ] 脚本运行结果
5. [ ] 优化前后文件大小对比
### 建议截图
6. [ ] 字体加载瀑布图
7. [ ] 实际打开速度对比
8. [ ] 移动端测试结果
---
## ✍️ 写作技巧
### 开头吸引人
- 用具体数字("3秒"、"50%")
- 描述用户痛点("用户等不及就走了")
- 制造悬念("最后发现是...")
### 中间讲清楚
- 用比喻解释技术概念
- 分步骤讲解,每步都清晰
- 提供"复制即用"的代码
### 结尾有力量
- 总结核心要点
- 给出行动建议
- 用金句收尾
### 语言风格
- ❌ 避免:"首先、其次、最后"
- ❌ 避免:"众所周知"
- ✅ 使用:"我发现"、"我试过"
- ✅ 使用:"你也可以"、"很简单"
---
## 🎯 文章亮点
### 独特卖点
1. **真实数据** - 不是理论,是实际优化结果
2. **通俗易懂** - 生活博主也能看懂
3. **可复用** - 读者可以直接照着做
4. **效果明显** - 40%的提升很震撼
### 差异化
- 其他文章:讲技术原理
- 你的文章:讲实际效果 + 简单方案
---
## 📅 写作计划
### 第1天:素材收集
- [ ] 整理优化前后的数据
- [ ] 截图关键页面
- [ ] 准备代码示例
### 第2天:初稿写作
- [ ] 按大纲写完整初稿
- [ ] 插入截图和代码
- [ ] 检查逻辑连贯性
### 第3天:润色发布
- [ ] 精简语言,删除冗余
- [ ] 优化标题和开头
- [ ] 检查错别字
- [ ] 发布并分享
---
## 💡 进阶建议
### 如果想更深入
- 添加"常见问题"章节
- 提供不同Hugo主题的适配方案
- 分享自动化脚本
### 如果想更简洁
- 只保留"问题→方案→效果"三部分
- 删除技术细节,只留结论
- 用对比图代替文字描述
---
**文档版本:** v1.0
**创建日期:** 2026-06-03
**适用场景:** 博客字体优化技术文章
@@ -0,0 +1,166 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../架构总览.md)。
# 📜 添加古风官职字符到字体子集
## 📋 需要添加的字符
古风官职文本中的特殊字符(可能缺失):
```
— 庶 民 太 尉 谏 给 簿 司 户 录 丞 判 殿
```
---
## 🚀 方法1:运行Python脚本(推荐)
```bash
cd E:\GitHub\blog
# 运行合并脚本
python scripts/merge_ancient_chars.py
# 重新生成字体子集
python scripts/subset-font-safe.py
```
---
## 🚀 方法2:手动添加字符
### 步骤1:编辑字符列表
打开文件:`themes/Ying/static/font/used_chars.txt`
在文件末尾添加:
```
—庶民太尉谏给簿司户录丞判殿
```
### 步骤2:重新生成字体子集
```bash
cd E:\GitHub\blog
# 重新生成字体子集
python scripts/subset-font-safe.py
```
---
## 🧪 验证添加成功
### 检查字符列表
```bash
# 查看字符列表
type themes\Ying\static\font\used_chars.txt
# 搜索特殊字符
findstr "—" themes\Ying\static\font\used_chars.txt
```
### 检查字体文件
```bash
# 查看字体文件大小
dir themes\Ying\static\font\zql-v2-subset.*
```
**预期:** 字体文件大小应该略有增加(包含新字符)
---
## 📊 预期效果
### 字体大小变化
| 指标 | 添加前 | 添加后 | 变化 |
|------|--------|--------|------|
| **字符数** | 2,485 | ~2,500 | +15 |
| **字体大小** | 757KB | ~760KB | +3KB |
**说明:** 增加15个字符,字体大小增加约3KB(可忽略)
---
## 🎯 使用场景
### 古风官职系统
这些字符用于:
```
正一品 太师 2000
从一品 太尉 1400
正二品 参知政事 1050
...
正九品 主簿 15
从九品 司户参军 5
— 庶民 0
```
**应用场景:**
- 古风游戏
- 历史题材文章
- 等级系统展示
---
## 💡 后续优化
### 如果还有其他特殊字符
1. 收集所有需要的特殊字符
2. 添加到 `used_chars.txt`
3. 重新运行字体子集化
### 自动化
**GitHub Actions会自动处理:**
- 当你发布包含这些字符的文章时
- 自动重新生成字体子集
- 自动部署到UpYun
---
## 🔄 回滚方案
### 如果出现问题
```bash
# 恢复原始字符列表
git checkout themes/Ying/static/font/used_chars.txt
# 重新生成字体子集
python scripts/subset-font-safe.py
```
---
## ✅ 完成确认
### 检查清单
- [ ] 字符已添加到 used_chars.txt
- [ ] 字体子集已重新生成
- [ ] 字体文件大小略有增加
- [ ] 新字符可以正常显示
### 测试
```bash
# 启动Hugo
hugo server -D
# 访问包含古风官职的页面
# 检查字符是否正常显示
```
---
**添加古风官职字符指南完成!** 🎉
**按照指南操作即可完成字符添加!**
@@ -0,0 +1,302 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 01-项目完成总结
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
---
## 🎉 项目概述
### 项目目标
对Hugo主题Ying进行全面性能优化,包括:
- JS按需加载优化
- 字体子集化优化
- GitHub Actions自动化
### 优化效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **总体资源** | ~3MB | ~1.5MB | ⚡ -50% |
| **加载速度** | 慢 | 快 | ⚡ +40% |
| **Lighthouse** | 60 | 75-80 | ⚡ +33% |
---
## ✅ 已完成的工作
### 1. JS按需加载优化(第1步)
**完成时间:** 2026-06-03
**优化效果:**
- 首页JS:800KB → 350KB(⚡ -56%)
- 文章页JS:800KB → 450KB(⚡ -44%)
**主要工作:**
- ✅ JS代码拆分为4个bundle
- ✅ 核心JS始终加载
- ✅ 页面特定JS按需加载
- ✅ 非关键JS延迟加载
- ✅ PJAX完美适配
**修改文件:**
- `themes/Ying/layouts/partials/footer.html`
- `themes/Ying/assets/js/modules/mypjax.js`
---
### 2. 字体子集化优化(第2步)
**完成时间:** 2026-06-03
**优化效果:**
- 字体大小:1.2MB → 757KB(⚡ -37%)
**主要工作:**
- ✅ 使用Python fonttools提取字符
- ✅ 生成子集字体(2,485个字符)
- ✅ 更新CSS字体声明
- ✅ 保持所有字符正常显示
**修改文件:**
- `themes/Ying/assets/css/main.css`
- `themes/Ying/static/font/zql-v2-subset.woff2`
- `themes/Ying/static/font/zql-v2-subset.woff`
- `themes/Ying/static/font/used_chars.txt`
---
### 3. GitHub Actions自动化(第3步)
**完成时间:** 2026-06-03
**自动化程度:** 100%
**主要工作:**
- ✅ 创建字体子集化工作流
- ✅ 配置自动触发条件
- ✅ 与deploy.yml完美协调
- ✅ 智能检测变更
- ✅ 自动部署到UpYun
**创建文件:**
- `.github/workflows/subset-fonts.yml`
- `requirements.txt`
---
## 📊 技术实现
### JS优化策略
```
core.js (200KB) - 始终加载
├── UIkit
├── 图标字体
├── 图片灯箱
├── 工具函数
├── 搜索功能
├── 浮动工具
├── 进度条
├── PJAX
└── 主题主逻辑
page-only.js (180KB) - 文章详情页
├── Artalk评论
├── 段落评论
└── 打赏功能
deferred.js (25KB) - 延迟加载
├── Toast消息
└── 图片懒加载
infinite-scroll.js (20KB) - 首页(如果启用)
tiaozhuan.js (8KB) - 特定页面
```
### 字体优化策略
```
原始字体(1.2MB)
├── 20,000+ 字符
└── 完整中文字符集
子集字体(757KB)
├── 2,485 个字符
├── 常用中文字符
├── 英文字母和数字
├── 常用标点符号
└── 特殊符号
优化效果:-37%
```
### 自动化流程
```
用户push内容更新
↓
deploy.yml(部署文章)
↓
subset-fonts.yml(优化字体)
↓
deploy.yml(部署新字体)
↓
✅ 完成!
```
---
## 🎯 项目亮点
### 1. 性能显著提升
- ✅ 资源减少50%
- ✅ 加载速度提升40%
- ✅ Lighthouse 75-80分
- ✅ 用户体验大幅改善
### 2. 完全自动化
- ✅ GitHub Actions自动运行
- ✅ 智能检测变更
- ✅ 无需手动干预
- ✅ 节省时间和精力
### 3. 智能优化
- ✅ 只在需要时优化
- ✅ 避免不必要的部署
- ✅ 节省资源和成本
- ✅ 保持系统高效
### 4. 完整文档
- ✅ 16份详细文档
- ✅ 覆盖所有场景
- ✅ 故障排除指南
- ✅ 最佳实践说明
---
## 📁 文档清单
### 核心文档(3份)
- ✅ 01-项目完成总结.md(本文件)
- ✅ 02-方案1完成总结.md
- ✅ 03-三步优化完整指南.md
### 优化实施(4份)
- ✅ 04-JS按需加载优化.md
- ✅ 05-PJAX适配说明.md
- ✅ 06-PJAX修复总结.md
- ✅ 07-字体子集化优化.md
### 自动化(3份)
- ✅ 08-GitHub-Actions使用指南.md
- ✅ 09-Actions修复指南.md
- ✅ 10-提交指南.md
### 测试验证(2份)
- ✅ 11-JS优化测试指南.md
- ✅ 12-字体优化测试指南.md
### 详细方案(4份)
- ✅ 13-主题全面优化分析.md
- ✅ 14-JS优化最终方案.md
- ✅ 15-字体优化手动指南.md
- ✅ 16-实施总结报告.md
---
## 💡 后续使用
### 日常开发
```bash
# 发布新文章
git add content/posts/new-article.md
git commit -m "feat: new article"
git push origin main
# 等待自动化(3-10分钟)
# - deploy.yml:部署文章
# - subset-fonts.yml:优化字体(如果需要)
# - deploy.yml:部署新字体(如果需要)
```
### 监控系统
```bash
# 查看GitHub Actions
https://github.com/zqlit/blog/actions
# 查看工作流状态
- Deploy to Production(部署)
- Font Subset Optimization(字体优化)
```
### 性能测试
```bash
# 每月测试一次
# 使用Chrome DevTools的Lighthouse
# 或者:https://pagespeed.web.dev/
# 记录:Performance、FCP、LCP、TTI
```
---
## 🎓 学到了什么?
### 技术技能
- ✅ JavaScript代码拆分
- ✅ 字体子集化技术
- ✅ GitHub Actions工作流
- ✅ Hugo静态站点优化
### DevOps实践
- ✅ CI/CD流程设计
- ✅ 自动化部署
- ✅ 工作流协调
- ✅ 性能监控
---
## 🏆 成就解锁
- ⚡ **性能优化大师** - 资源减少50%
- 🤖 **自动化专家** - 完整CI/CD流程
- 🚀 **前端优化师** - Lighthouse 75-80分
- 💡 **DevOps工程师** - GitHub Actions精通
---
## 🎊 项目完成
**恭喜你完成了完整的Hugo博客性能优化和自动化系统!**
- ✅ 性能提升50%
- ✅ 加载速度提升40%
- ✅ Lighthouse 75-80分
- ✅ 完全自动化
- ✅ 生产就绪
**现在可以专注于创作优质内容了!** 🚀
---
**项目完成时间:** 2026-06-03
**总耗时:** 约6小时
**优化效果:** 性能提升50%
**自动化程度:** 100%
**维护成本:** 0(完全自动化)
**祝你博客越办越好!** 🎉
@@ -0,0 +1,364 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 02-方案1完成总结
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
**方案:** 保守优化(JS + 字体,不改变CSS加载方式)
---
## 📋 方案概述
### 为什么选择方案1(保守优化)?
**原因:**
1. ✅ 零风险,不会破坏现有功能
2. ✅ 快速实施(3-4小时)
3. ✅ 仍然获得显著性能提升
4. ✅ 样式完全不变
**对比方案2(激进优化):**
- 方案2包括CSS内联优化
- 需要100%提取所有CSS,风险高
- 可能遗漏某些样式
- 维护成本高
---
## ✅ 已完成的优化
### 第1步:JS按需加载优化
**完成时间:** 2026-06-03
**优化效果:**
- 首页JS:800KB → 350KB(⚡ -56%)
- 文章页JS:800KB → 450KB(⚡ -44%)
**主要工作:**
- ✅ JS代码拆分为4个bundle
- ✅ 核心JS始终加载(~200KB)
- ✅ 页面特定JS按需加载(~180KB)
- ✅ 非关键JS延迟加载(~25KB)
- ✅ PJAX完美适配
**修改文件:**
- `themes/Ying/layouts/partials/footer.html`
- `themes/Ying/assets/js/modules/mypjax.js`
---
### 第2步:字体子集化优化
**完成时间:** 2026-06-03
**优化效果:**
- 字体大小:1.2MB → 757KB(⚡ -37%)
**主要工作:**
- ✅ 使用Python fonttools提取字符
- ✅ 生成子集字体(2,485个字符)
- ✅ 更新CSS字体声明
- ✅ 保持所有字符正常显示
**修改文件:**
- `themes/Ying/assets/css/main.css`
- `themes/Ying/static/font/zql-v2-subset.woff2`
- `themes/Ying/static/font/zql-v2-subset.woff`
- `themes/Ying/static/font/used_chars.txt`
---
## 📊 优化效果
### 性能提升数据
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **JS(首页)** | 800KB | 350KB | ⚡ -56% |
| **JS(文章页)** | 800KB | 450KB | ⚡ -44% |
| **字体** | 1.2MB | 757KB | ⚡ -37% |
| **总体资源(首页)** | ~3MB | ~1.5MB | ⚡ -50% |
| **总体资源(文章页)** | ~3MB | ~1.6MB | ⚡ -47% |
| **FCP** | 2.5s | ~1.5s | ⚡ -40% |
| **TTI** | 4.0s | ~2.0s | ⚡ -50% |
| **TBT** | 350ms | ~100ms | ⚡ -71% |
| **Lighthouse** | 60 | 75-80 | ⚡ +25-33% |
---
## 🔧 技术实现
### JS优化策略
**核心JS(始终加载):**
- UIkit框架
- 图标字体
- 图片灯箱
- 工具函数
- 搜索功能
- 浮动工具
- 进度条
- PJAX
- 主题主逻辑
**页面特定JS(按需加载):**
- Artalk评论系统(文章详情页)
- 段落评论(文章详情页)
- 打赏功能(文章详情页)
**延迟加载的JS:**
- Toast消息
- 图片懒加载
---
### 字体优化策略
**方法:** Python fonttools
**步骤:**
1. 构建Hugo站点
2. 扫描所有HTML和CSS文件
3. 提取实际使用的字符
4. 生成子集字体
5. 更新CSS字体声明
**结果:**
- 提取了2,485个字符
- 字体大小减少37%
- 保持所有字符正常显示
---
## ✅ 测试验证
### 功能测试
- ✅ 首页功能正常
- ✅ 文章详情页正常
- ✅ 评论区正常加载
- ✅ 打赏功能正常
- ✅ 深色模式正常
- ✅ 响应式布局正常
### 性能测试
- ✅ Network面板显示JS大小减少
- ✅ Network面板显示字体大小减少
- ✅ Lighthouse得分提升
- ✅ 无Console错误
---
## 💡 优势和劣势
### 优势 ✅
1. **零风险** - 不会破坏现有功能
2. **快速实施** - 3-4小时完成
3. **显著提升** - 性能提升50%
4. **样式不变** - CSS保持不变
5. **易于维护** - 代码结构清晰
### 劣势 ⚠️
1. **CSS未优化** - 仍有优化空间
2. **字体优化有限** - 只减少37%(预期87%)
3. **需要Python** - 字体优化依赖Python环境
---
## 🔄 与方案2对比
### 方案1(保守优化)✅ 已选择
**优化内容:**
- JS按需加载
- 字体子集化
- 保持CSS不变
**预期效果:**
- 性能提升40-50%
- Lighthouse 75-80分
**风险:** 低
**实施时间:** 3-4小时
---
### 方案2(激进优化)❌ 未选择
**优化内容:**
- CSS内联优化
- JS按需加载
- 字体子集化
**预期效果:**
- 性能提升60-70%
- Lighthouse 90+分
**风险:** 高
**实施时间:** 8-10小时
---
## 🎯 为什么方案1更好?
### 对于你的场景
1. **零风险** - 生产环境最重要
2. **快速见效** - 立即享受性能提升
3. **保持稳定** - 所有功能正常
4. **易于维护** - 代码结构清晰
5. **成本低** - 无需大量测试
### 如果选择方案2
**可能出现的问题:**
- CSS内联不完整,导致样式丢失
- 需要大量测试验证
- 维护成本高
- 风险大
---
## 📁 修改的文件清单
### 1. JS优化
**修改文件:**
- `themes/Ying/layouts/partials/footer.html`(JS拆分)
- `themes/Ying/assets/js/modules/mypjax.js`(PJAX适配)
**创建文件:**
- 无(使用Hugo资源管道)
---
### 2. 字体优化
**修改文件:**
- `themes/Ying/assets/css/main.css`(字体声明)
**创建文件:**
- `themes/Ying/static/font/zql-v2-subset.woff2`(子集字体)
- `themes/Ying/static/font/zql-v2-subset.woff`(子集字体)
- `themes/Ying/static/font/used_chars.txt`(字符列表)
---
## 🧪 测试清单
### JS优化测试
- [ ] 首页正常显示
- [ ] 导航菜单正常
- [ ] 搜索功能正常
- [ ] 主题切换正常
- [ ] 文章详情页正常
- [ ] 评论区正常加载
- [ ] 打赏功能正常
- [ ] PJAX导航正常
- [ ] 无限滚动正常(如果启用)
### 字体优化测试
- [ ] 中文字符正常
- [ ] 英文字符正常
- [ ] 数字正常
- [ ] 标点符号正常
- [ ] 深色模式正常
- [ ] 移动端正常
### 性能测试
- [ ] Network面板显示JS大小减少
- [ ] Network面板显示字体大小减少
- [ ] Lighthouse得分提升
- [ ] 无Console错误
---
## 💡 使用建议
### 日常开发
```bash
# 发布新文章
git add content/posts/new-article.md
git commit -m "feat: new article"
git push origin main
# 等待自动化(3-10分钟)
# - deploy.yml:部署文章
# - subset-fonts.yml:优化字体(如果需要)
# - deploy.yml:部署新字体(如果需要)
```
### 监控系统
```bash
# 查看GitHub Actions
https://github.com/zqlit/blog/actions
# 查看工作流状态
- Deploy to Production(部署)
- Font Subset Optimization(字体优化)
```
---
## 🔄 后续优化
### 如果需要进一步优化
**选项1:实施CSS内联(方案2的一部分)**
- 风险:高
- 收益:额外提升20-30%
- 建议:谨慎考虑
**选项2:优化字体子集化**
- 使用更大的字符集
- 或者使用系统字体
- 建议:当前方案已足够
**选项3:其他优化**
- 图片优化
- CDN配置
- 缓存策略
- 建议:按需实施
---
## 🎉 项目完成
### 完成情况
- ✅ JS按需加载优化(-56%首页,-44%文章页)
- ✅ 字体子集化优化(-37%)
- ✅ 总体性能提升50%
- ✅ Lighthouse 75-80分
- ✅ 完全自动化
### 下一步
**什么都不用做!** 🚀
- ✅ 系统已经自动化运行
- ✅ 发布新文章时自动优化
- ✅ 享受性能提升
- ✅ 专注于内容创作
---
**方案1完成时间:** 2026-06-03
**总耗时:** 约4小时
**优化效果:** 性能提升50%
**风险等级:** 低(零风险)
**维护成本:** 0(完全自动化)
**方案1是最优选择!** 🎉
@@ -0,0 +1,602 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 03-三步优化完整指南
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
**适用对象:** Hugo主题Ying性能优化
---
## 📋 概述
### 三步优化内容
1. **JS按需加载优化** - 减少56%首页JS
2. **字体子集化优化** - 减少37%字体大小
3. **GitHub Actions自动化** - 100%自动化
### 预期效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **总体资源** | ~3MB | ~1.5MB | ⚡ -50% |
| **加载速度** | 慢 | 快 | ⚡ +40% |
| **Lighthouse** | 60 | 75-80 | ⚡ +33% |
---
## 🚀 第1步:JS按需加载优化
### 1.1 优化目标
将JS拆分为多个bundle,实现按需加载:
- 核心JS始终加载
- 页面特定JS按需加载
- 非关键JS延迟加载
### 1.2 实施步骤
#### 步骤1:分析JS结构
**核心JS(必须加载):**
- UIkit框架
- 图标字体
- 图片灯箱
- 工具函数
- 搜索功能
- 浮动工具
- 进度条
- PJAX
- 主题主逻辑
**页面特定JS(按需加载):**
- Artalk评论系统(文章详情页)
- 段落评论(文章详情页)
- 打赏功能(文章详情页)
**延迟加载的JS:**
- Toast消息
- 图片懒加载
---
#### 步骤2:修改footer.html
**文件:** `themes/Ying/layouts/partials/footer.html`
**修改内容:**
1. 创建核心JS bundle
```gohtml
{{ $coreScripts := slice $iconfont $uikit $viewimage $utils $loader $cache $search $floatingTools $nprogress $pjaxLib $mypjax $pangu $linkify $main | resources.Concat "js/core.js" | resources.Minify | resources.Fingerprint }}
<script defer src="{{ $coreScripts.RelPermalink }}"></script>
```
2. 创建页面特定JS bundle
```gohtml
{{ if .IsPage }}
{{ $artalkModule := resources.Get "js/modules/artalk.js" }}
{{ $paragraphComments := resources.Get "js/modules/paragraph-comments.js" }}
{{ $reward := resources.Get "js/modules/reward.js" }}
{{ $pageScripts := slice $artalkModule $paragraphComments $reward | resources.Concat "js/page-only.js" | resources.Minify | resources.Fingerprint }}
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ end }}
```
3. 创建延迟加载JS bundle
```gohtml
{{ $toast := resources.Get "js/modules/toast.js" }}
{{ $easylazyload := resources.Get "js/modules/lazyload.js" }}
{{ $deferredScripts := slice $toast $easylazyload | resources.Concat "js/deferred.js" | resources.Minify | resources.Fingerprint }}
<script>
if ('requestIdleCallback' in window) {
requestIdleCallback(function() {
var script = document.createElement('script');
script.src = '{{ $deferredScripts.RelPermalink }}';
script.defer = true;
document.body.appendChild(script);
});
} else {
setTimeout(function() {
var script = document.createElement('script');
script.src = '{{ $deferredScripts.RelPermalink }}';
script.defer = true;
document.body.appendChild(script);
}, 1000);
}
</script>
```
---
#### 步骤3:适配PJAX
**文件:** `themes/Ying/assets/js/modules/mypjax.js`
**修改内容:**
在 `pjax:complete` 事件中添加动态加载逻辑:
```javascript
// 动态加载页面特定JS(PJAX适配)
var isArticlePage = document.querySelector('#Comments') !== null ||
document.querySelector('.post-content') !== null;
if (isArticlePage && !window._pageOnlyLoaded && window._pageOnlyScriptUrl) {
var script = document.createElement('script');
script.src = window._pageOnlyScriptUrl;
script.onload = function() {
window._pageOnlyLoaded = true;
console.log('page-only.js loaded for PJAX navigation');
if (typeof window.initArtalk === 'function') {
try { window.initArtalk(); } catch(e) {}
}
};
document.body.appendChild(script);
}
```
---
### 1.3 预期效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页JS** | 800KB | 350KB | ⚡ -56% |
| **文章页JS** | 800KB | 450KB | ⚡ -44% |
| **TTI** | 4.0s | ~2.0s | ⚡ -50% |
| **TBT** | 350ms | ~100ms | ⚡ -71% |
---
### 1.4 测试验证
**功能测试:**
- [ ] 首页功能正常
- [ ] 文章详情页正常
- [ ] 评论区正常加载
- [ ] PJAX导航正常
- [ ] 打赏功能正常
**性能测试:**
- [ ] Network面板显示JS大小减少
- [ ] Lighthouse得分提升
- [ ] 无Console错误
---
## 🚀 第2步:字体子集化优化
### 2.1 优化目标
将中文字体从1.2MB优化到757KB,减少37%。
### 2.2 实施步骤
#### 步骤1:备份原始字体
```bash
cd E:\GitHub\blog
# Windows
copy themes\Ying\static\font\zql-v2.woff2 themes\Ying\static\font\zql-v2.woff2.backup
copy themes\Ying\static\font\zql-v2.woff themes\Ying\static\font\zql-v2.woff.backup
# Mac/Linux
cp themes/Ying/static/font/zql-v2.woff2 themes/Ying/static/font/zql-v2.woff2.backup
cp themes/Ying/static/font/zql-v2.woff themes/Ying/static/font/zql-v2.woff.backup
```
---
#### 步骤2:安装Python依赖
```bash
pip install fonttools brotli
```
---
#### 步骤3:构建Hugo站点
```bash
hugo --destination=public
```
---
#### 步骤4:运行字体子集化
```bash
python scripts/subset-font-safe.py
```
**预期输出:**
```
🔤 字体子集化工具(安全版本)
==================================================
✅ 找到public目录,将扫描构建后的HTML
🔍 扫描目录: content, layouts, public
📝 提取了 2492 个唯一字符
💾 字符列表已保存到: themes/Ying/static/font\used_chars.txt
✂️ 正在生成子集字体...
✅ 子集化完成!
📊 优化结果:
子集字符数: 2485
子集文件大小: 739.7 KB
减少: 486.8 KB (39.7%)
🎉 所有子集字体生成成功!
```
---
#### 步骤5:更新CSS字体声明
**文件:** `themes/Ying/assets/css/main.css`
**修改字体声明:**
```css
@font-face {
font-family: 'zql';
src: url('../font/zql-v2-subset.woff2') format('woff2'),
url('../font/zql-v2-subset.woff') format('woff');
font-display: swap;
}
```
**关键改动:**
- `zql-v2.woff2` → `zql-v2-subset.woff2`
- `zql-v2.woff` → `zql-v2-subset.woff`
- 删除 `unicode-range`
---
### 2.3 预期效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **字体大小** | 1.2MB | 757KB | ⚡ -37% |
| **字符数** | 20,000+ | 2,485 | - |
| **字体加载时间** | ~6s | ~4s | ⚡ -33% |
---
### 2.4 测试验证
**功能测试:**
- [ ] 中文字符正常
- [ ] 英文字符正常
- [ ] 数字正常
- [ ] 标点符号正常
- [ ] 深色模式正常
**性能测试:**
- [ ] Network面板显示字体大小减少
- [ ] 无404错误
- [ ] Lighthouse无字体警告
---
## 🚀 第3步:GitHub Actions自动化
### 3.1 优化目标
实现字体子集化的完全自动化:
- 内容更新时自动优化
- 每周定期检查
- 智能检测变更
- 与deploy.yml完美协调
### 3.2 实施步骤
#### 步骤1:创建requirements.txt
**文件:** `requirements.txt`
```
fonttools
brotli
```
---
#### 步骤2:创建GitHub Actions工作流
**文件:** `.github/workflows/subset-fonts.yml`
**关键配置:**
1. **触发条件:**
```yaml
on:
push:
branches:
- main
paths:
- 'content/**'
- 'layouts/**'
schedule:
- cron: '0 2 * * 1' # 每周一凌晨2点
workflow_dispatch:
inputs:
force_rebuild:
description: '强制重新生成子集字体'
required: false
default: 'false'
type: boolean
```
2. **工作流步骤:**
```yaml
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
pip install fonttools brotli
- name: Build Hugo site
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
- name: Subset fonts
run: python scripts/subset-font-safe.py
- name: Commit changes
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add themes/Ying/static/font/zql-v2-subset.*
git commit -m "chore: update font subset (automated) [skip ci]"
- name: Push changes
run: git push origin main
```
3. **避免循环触发:**
```yaml
git commit -m "chore: update font subset (automated) [skip ci]"
```
---
#### 步骤3:与deploy.yml协调
**你的deploy.yml已有防循环机制:**
```yaml
- name: Push Image Optimizations
run: |
if ! git log --oneline -1 | grep -q "\[skip ci\]"; then
echo "No auto-commits to push"
else
git push origin HEAD:main
fi
```
**协调流程:**
```
你push到main
↓
deploy.yml(部署文章)
↓
subset-fonts.yml(优化字体)
↓
commit [skip ci]
↓
push到main
↓
deploy.yml看到[skip ci],不再次触发 ✅
↓
完美协调!
```
---
### 3.3 预期效果
**自动化程度:** 100%
**触发条件:**
- ✅ 内容更新时自动优化
- ✅ 每周定期检查
- ✅ 手动触发支持
**协调机制:**
- ✅ 与deploy.yml完美协调
- ✅ 无循环触发
- ✅ 智能检测变更
---
### 3.4 测试验证
**功能测试:**
- [ ] GitHub Actions正常运行
- [ ] 字体优化成功
- [ ] 自动commit和push
- [ ] 与deploy.yml协调正常
**自动化测试:**
- [ ] 发布新文章时触发
- [ ] 每周定时触发
- [ ] 手动触发成功
---
## 📊 完整优化效果
### 性能提升总结
| 优化步骤 | 优化内容 | 提升 |
|---------|---------|------|
| **第1步** | JS按需加载 | ⚡ -56%(首页) |
| **第2步** | 字体子集化 | ⚡ -37% |
| **第3步** | 自动化 | ⚡ 100%自动化 |
| **总计** | 性能优化 | ⚡ -50%(总体) |
### Lighthouse得分
- **优化前:** 60分
- **优化后:** 75-80分
- **提升:** +25-33%
---
## 🎯 实施时间表
### 第1天:JS优化(2小时)
**上午:**
- 分析JS结构
- 修改footer.html
- 测试功能
**下午:**
- 适配PJAX
- 性能测试
- 提交代码
---
### 第2天:字体优化(1.5小时)
**上午:**
- 备份字体
- 安装Python依赖
- 运行子集化
**下午:**
- 更新CSS
- 测试字体显示
- 提交代码
---
### 第3天:自动化(1小时)
**上午:**
- 创建requirements.txt
- 创建GitHub Actions工作流
- 测试自动化
**下午:**
- 验证与deploy.yml协调
- 提交代码
- 监控Actions运行
---
## 💡 最佳实践
### 1. 逐步实施
- ✅ 先实施JS优化
- ✅ 验证无问题后实施字体优化
- ✅ 最后配置自动化
- ✅ 每个步骤都测试验证
### 2. 充分测试
- ✅ 功能测试(所有页面)
- ✅ 性能测试(Lighthouse)
- ✅ 兼容性测试(多浏览器)
- ✅ 自动化测试(GitHub Actions)
### 3. 文档记录
- ✅ 记录所有修改
- ✅ 记录测试结果
- ✅ 记录问题和解决方案
- ✅ 创建故障排除指南
---
## 🔄 回滚方案
### 如果JS优化失败
```bash
# 恢复footer.html
git checkout themes/Ying/layouts/partials/footer.html
# 恢复mypjax.js
git checkout themes/Ying/assets/js/modules/mypjax.js
# 重新构建
hugo --cleanDestinationDir
```
### 如果字体优化失败
```bash
# 恢复字体文件
cp themes/Ying/static/font/zql-v2.woff2.backup themes/Ying/static/font/zql-v2.woff2
cp themes/Ying/static/font/zql-v2.woff.backup themes/Ying/static/font/zql-v2.woff
# 恢复CSS
git checkout themes/Ying/assets/css/main.css
# 重新构建
hugo --cleanDestinationDir
```
### 如果自动化失败
```bash
# 删除工作流文件
rm .github/workflows/subset-fonts.yml
# 或者禁用工作流
# 在GitHub仓库设置中禁用Actions
```
---
## 🎉 项目完成
### 完成情况
- ✅ 第1步:JS按需加载优化(-56%首页)
- ✅ 第2步:字体子集化优化(-37%)
- ✅ 第3步:GitHub Actions自动化(100%)
- ✅ 总体性能提升50%
- ✅ Lighthouse 75-80分
### 后续使用
**什么都不用做!** 🚀
- ✅ 系统已经自动化运行
- ✅ 发布新文章时自动优化
- ✅ 享受性能提升
- ✅ 专注于内容创作
---
**三步优化完成时间:** 2026-06-03
**总耗时:** 约4.5小时
**优化效果:** 性能提升50%
**自动化程度:** 100%
**维护成本:** 0(完全自动化)
**祝你博客越办越好!** 🎉
@@ -0,0 +1,559 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 04-JS按需加载优化
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
**优化效果:** 首页JS减少56%,文章页JS减少44%
---
## 📋 优化概述
### 优化目标
将所有JS打包为单个bundle(800KB)拆分为多个bundle,实现按需加载:
- 核心JS始终加载(~200KB)
- 页面特定JS按需加载(~180KB)
- 非关键JS延迟加载(~25KB)
### 优化效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页JS** | 800KB | 350KB | ⚡ -56% |
| **文章页JS** | 800KB | 450KB | ⚡ -44% |
| **TTI** | 4.0s | ~2.0s | ⚡ -50% |
| **TBT** | 350ms | ~100ms | ⚡ -71% |
---
## 🔍 JS文件分析
### 原始JS结构(优化前)
所有JS打包为单个bundle.js(800KB):
```
bundle.js (800KB)
├── iconfont.js
├── uikit.min.js
├── view-image.min.js
├── utils.js
├── loader.js
├── cache.js
├── search.js
├── floating-tools.js
├── paragraph-comments.js
├── infinite-scroll.js
├── artalk.js
├── nprogress.js
├── pjax.js
├── pangu.js
├── linkify.js
├── main.js
├── mypjax.js
├── toast.js
├── tiaozhuan.js
├── reward.js
└── lazyload.js
```
**问题:**
- 所有页面都加载所有JS
- 首页不需要Artalk评论
- 文章页不需要无限滚动
- 浪费带宽和加载时间
---
### 优化后JS结构
拆分为4个bundle:
```
1. core.js (200KB) - 始终加载
├── iconfont.js
├── uikit.min.js
├── view-image.min.js
├── utils.js
├── loader.js
├── cache.js
├── search.js
├── floating-tools.js
├── nprogress.js
├── pjax.js
├── mypjax.js
├── pangu.js
├── linkify.js
└── main.js
2. page-only.js (180KB) - 文章详情页
├── artalk.js
├── paragraph-comments.js
└── reward.js
3. deferred.js (25KB) - 延迟加载
├── toast.js
└── lazyload.js
4. infinite-scroll.js (20KB) - 首页(如果启用)
5. tiaozhuan.js (8KB) - 特定页面
```
---
## 🛠️ 实施步骤
### 步骤1:修改footer.html
**文件:** `themes/Ying/layouts/partials/footer.html`
**修改内容:**
#### 1. 创建核心JS bundle
```gohtml
{{/* ====== 1. 核心JS Bundle - 始终加载 ====== */}}
{{ $iconfont := resources.Get "js/libs/iconfont.js" }}
{{ $uikit := resources.Get "js/libs/uikit.min.js" }}
{{ $viewimage := resources.Get "js/libs/view-image.min.js" }}
{{ $utils := resources.Get "js/modules/utils.js" }}
{{ $loader := resources.Get "js/modules/loader.js" }}
{{ $cache := resources.Get "js/modules/cache.js" }}
{{ $search := resources.Get "js/modules/search.js" }}
{{ $floatingTools := resources.Get "js/modules/floating-tools.js" }}
{{ $nprogress := resources.Get "js/libs/nprogress.js" }}
{{ $pjaxLib := resources.Get "js/libs/pjax.js" }}
{{ $mypjax := resources.Get "js/modules/mypjax.js" }}
{{ $pangu := resources.Get "js/modules/pangu.js" }}
{{ $linkify := resources.Get "js/modules/linkify.js" }}
{{ $main := resources.Get "js/main.js" }}
{{ $coreScripts := slice $iconfont $uikit $viewimage $utils $loader $cache $search $floatingTools $nprogress $pjaxLib $mypjax $pangu $linkify $main | resources.Concat "js/core.js" | resources.Minify | resources.Fingerprint }}
<script defer src="{{ $coreScripts.RelPermalink }}"></script>
```
---
#### 2. 创建页面特定JS bundle
```gohtml
{{/* ====== 4. 页面特定JS - 按需加载 ====== */}}
{{/* 文章详情页专用JS */}}
{{ if .IsPage }}
{{ $artalkModule := resources.Get "js/modules/artalk.js" }}
{{ $paragraphComments := resources.Get "js/modules/paragraph-comments.js" }}
{{ $reward := resources.Get "js/modules/reward.js" }}
{{ $pageScripts := slice $artalkModule $paragraphComments $reward | resources.Concat "js/page-only.js" | resources.Minify | resources.Fingerprint }}
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ else }}
{{/* 非文章页面:只存储URL,不加载 */}}
{{ $artalkModule := resources.Get "js/modules/artalk.js" }}
{{ $paragraphComments := resources.Get "js/modules/paragraph-comments.js" }}
{{ $reward := resources.Get "js/modules/reward.js" }}
{{ $pageScripts := slice $artalkModule $paragraphComments $reward | resources.Concat "js/page-only.js" | resources.Minify | resources.Fingerprint }}
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ end }}
```
---
#### 3. 创建延迟加载JS bundle
```gohtml
{{/* ====== 5. 延迟加载的非关键JS ====== */}}
{{ $toast := resources.Get "js/modules/toast.js" }}
{{ $easylazyload := resources.Get "js/modules/lazyload.js" }}
{{ $deferredScripts := slice $toast $easylazyload | resources.Concat "js/deferred.js" | resources.Minify | resources.Fingerprint }}
<script>
// 使用requestIdleCallback在浏览器空闲时加载
if ('requestIdleCallback' in window) {
requestIdleCallback(function() {
var script = document.createElement('script');
script.src = '{{ $deferredScripts.RelPermalink }}';
script.defer = true;
document.body.appendChild(script);
});
} else {
setTimeout(function() {
var script = document.createElement('script');
script.src = '{{ $deferredScripts.RelPermalink }}';
script.defer = true;
document.body.appendChild(script);
}, 1000);
}
</script>
```
---
#### 4. 首页专用JS
```gohtml
{{/* ====== 6. 首页专用JS ====== */}}
{{ if .IsHome }}
{{ if .Site.Params.infiniteScroll.enable }}
{{ $infiniteScroll := resources.Get "js/modules/infinite-scroll.js" }}
<script defer src="{{ $infiniteScroll.RelPermalink }}"></script>
{{ end }}
{{ end }}
```
---
#### 5. 特定页面专用JS
```gohtml
{{/* ====== 7. 特定页面专用JS ====== */}}
{{ if or (eq .Type "links") (eq .Type "circles") }}
{{ $tiaozhuan := resources.Get "js/modules/tiaozhuan.js" }}
<script defer src="{{ $tiaozhuan.RelPermalink }}"></script>
{{ end }}
```
---
### 步骤2:适配PJAX
**文件:** `themes/Ying/assets/js/modules/mypjax.js`
**修改内容:**
在 `pjax:complete` 事件中添加动态加载逻辑:
```javascript
// pjax加载完成
document.addEventListener("pjax:complete", function () {
// 立即执行:进度条、基础 UI
if (typeof NProgress !== 'undefined') NProgress.done();
pjax_reload();
// 动态加载页面特定JS(PJAX适配)
// 检测当前页面是否为文章详情页,如果是则加载page-only.js
var currentPath = window.location.pathname;
var isArticlePage = document.querySelector('#Comments') !== null ||
document.querySelector('.post-content') !== null;
if (isArticlePage && !window._pageOnlyLoaded && window._pageOnlyScriptUrl) {
// 动态加载page-only.js(使用Hugo fingerprint后的正确URL)
var script = document.createElement('script');
script.src = window._pageOnlyScriptUrl;
script.onload = function() {
window._pageOnlyLoaded = true;
console.log('page-only.js loaded for PJAX navigation');
// 初始化Artalk等
if (typeof window.initArtalk === 'function') {
try { window.initArtalk(); } catch(e) { console.error('initArtalk error:', e); }
}
if (typeof window.initParagraphComments === 'function') {
try { window.initParagraphComments(); } catch(e) {}
}
};
document.body.appendChild(script);
}
// 下一帧执行:轻量初始化
requestAnimationFrame(function() {
if (typeof initCodeCopy === 'function') initCodeCopy();
if (typeof window.initSearch === 'function') {
try { window.initSearch(); } catch(e) {}
}
if (typeof window.refreshFloatingTools === 'function') {
window.refreshFloatingTools();
} else if (typeof window.initFloatingTools === 'function') {
try { window.initFloatingTools(); } catch(e) {}
}
// 文章动画
if (typeof window.initPostScrollspy === 'function') window.initPostScrollspy();
});
// 空闲时执行:非关键功能
var idle = window.requestIdleCallback || function(fn) { return setTimeout(fn, 200); };
idle(function() {
if (typeof window.initParagraphComments === 'function') {
try { window.initParagraphComments(); } catch(e) {}
}
if (typeof window.initInfiniteScroll === 'function' && window.enableInfiniteScroll) {
window.initInfiniteScroll();
}
if (typeof window.initLinkStatus === 'function') {
try { window.initLinkStatus(); } catch(e) {}
}
if (typeof window.initArtalk === 'function') {
try { window.initArtalk(); } catch(e) {}
}
if (typeof window.bsz_fetch === 'function') {
try { window.bsz_fetch(); } catch(e) {}
}
if (typeof window.initImageFrameReveal === 'function') {
try { window.initImageFrameReveal(); } catch(e) {}
}
// 链接卡片和中英文间距(DOM 扫描,非关键)
if (typeof window.initLinkify === 'function') window.initLinkify();
if (typeof window.initPangu === 'function') window.initPangu();
});
// 延迟:代码折叠
setTimeout(function() {
if (typeof window.initCodeFold === 'function') window.initCodeFold();
}, 300);
});
```
---
## 📊 加载时序
### 优化前
```
页面加载
↓
下载bundle.js (800KB)
↓
执行所有JS
↓
渲染页面
↓
用户可以交互
```
**问题:** 所有JS都在首屏加载,阻塞渲染
---
### 优化后
```
页面加载
↓
下载core.js (200KB) - 立即
↓
渲染页面(核心功能可用)
↓
用户可以交互
↓
下载page-only.js (180KB) - 按需(仅文章页)
↓
下载deferred.js (25KB) - 延迟(浏览器空闲)
↓
所有功能可用
```
**优势:**
- ✅ 首屏渲染更快
- ✅ 核心功能立即可用
- ✅ 非核心功能延迟加载
- ✅ 节省带宽
---
## 🧪 测试验证
### 功能测试清单
#### 首页功能
- [ ] 导航菜单正常
- [ ] 搜索功能正常
- [ ] 主题切换正常
- [ ] 文章列表显示正常
- [ ] 分页功能正常
- [ ] 无限滚动正常(如果启用)
- [ ] 浮动工具栏正常
#### 文章详情页功能
- [ ] 文章内容正常显示
- [ ] 图片灯箱正常
- [ ] 评论区正常加载(Artalk)
- [ ] 打赏功能正常
- [ ] 段落评论正常
- [ ] 返回顶部正常
#### 其他页面功能
- [ ] 友链页面正常
- [ ] circles页面正常
- [ ] 归档页面正常
- [ ] 搜索结果页正常
#### 跨页面功能
- [ ] PJAX导航正常
- [ ] 浏览器前进/后退正常
- [ ] 书签/分享链接正常
---
### 性能测试
#### Network面板
1. 打开DevTools → Network
2. 刷新页面
3. 检查:
- [ ] core.js首先加载(~200KB)
- [ ] page-only.js仅在文章页加载(~180KB)
- [ ] deferred.js最后加载(~25KB)
- [ ] 总体JS大小减少
#### Lighthouse测试
1. 打开DevTools → Lighthouse
2. 运行Performance审计
3. 预期指标:
- [ ] Performance得分:75-85
- [ ] TTI:改善20-30%
- [ ] TBT:改善40-50%
- [ ] Speed Index:改善20-30%
---
## 🐛 故障排除
### 问题1:评论区未加载
**症状:** 文章详情页看不到评论区
**可能原因:**
1. page-only.js加载失败
2. Artalk初始化时机不对
3. JavaScript错误
**解决方案:**
1. 打开Console查看错误
2. 检查Network面板,确认page-only.js加载成功
3. 确认window._pageOnlyScriptUrl已定义
---
### 问题2:功能延迟响应
**症状:** 点击某些按钮后1-2秒才响应
**原因:** 非关键JS还在加载
**解决方案:**
- 这是预期行为,用户可能会感觉到轻微延迟
- 如果延迟明显(>3秒),考虑将该模块移到core.js
---
### 问题3:无限滚动失效
**症状:** 首页无法加载更多文章
**可能原因:**
1. infinite-scroll.js未加载
2. window.enableInfiniteScroll未定义
**解决方案:**
1. 检查hugo.toml中infiniteScroll.enable是否为true
2. 查看Console是否有错误
3. 确认infinite-scroll.js加载成功
---
### 问题4:PJAX导航失效
**症状:** 点击链接后页面完全刷新
**可能原因:**
1. PJAX库未加载
2. mypjax.js初始化失败
**解决方案:**
1. 检查Console是否有错误
2. 确认pjax.js在core.js中
3. 检查mypjax.js的配置
---
## 🔄 回滚方案
### 如果优化后出现严重问题
**快速回滚:**
```bash
cd E:\GitHub\blog
# 恢复footer.html
git checkout themes/Ying/layouts/partials/footer.html
# 恢复mypjax.js
git checkout themes/Ying/assets/js/modules/mypjax.js
# 重新构建
hugo --cleanDestinationDir
hugo server -D
```
---
## 💡 最佳实践
### 1. 逐步优化
- ✅ 先测试核心功能
- ✅ 逐步添加按需加载
- ✅ 充分测试每个步骤
- ✅ 记录问题和解决方案
### 2. 监控性能
- ✅ 定期Lighthouse测试
- ✅ 监控网络请求
- ✅ 检查Console错误
- ✅ 记录性能数据
### 3. 持续改进
- ✅ 根据实际使用调整
- ✅ 优化加载时序
- ✅ 减少bundle大小
- ✅ 提升用户体验
---
## 📈 优化效果总结
### 性能提升
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页JS** | 800KB | 350KB | ⚡ -56% |
| **文章页JS** | 800KB | 450KB | ⚡ -44% |
| **TTI** | 4.0s | ~2.0s | ⚡ -50% |
| **TBT** | 350ms | ~100ms | ⚡ -71% |
### 用户体验提升
- 🚀 **首屏更快** - 资源减少56%
- ⚡ **交互更流畅** - TTI提升50%
- 📱 **移动端更好** - 节省带宽
- 🎨 **功能完整** - 所有功能正常
---
**JS优化完成时间:** 2026-06-03
**实施耗时:** 约2小时
**优化效果:** 首页JS减少56%
**风险等级:** 低
**维护成本:** 低
**JS优化效果显著!** 🎉
@@ -0,0 +1,330 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 05-PJAX适配说明
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
**适用范围:** JS按需加载优化的PJAX适配
---
## 📋 问题背景
### PJAX是什么?
PJAX(PushState + AJAX)是一种页面无刷新加载技术:
- 通过AJAX加载新内容
- 更新浏览器地址栏
- 无需刷新整个页面
- 提升用户体验
### 问题场景
**优化前:**
```
用户访问首页 → bundle.js加载(800KB)
用户点击文章 → PJAX导航(无刷新)
进入文章详情页 → 评论区正常(因为所有JS已加载)
```
**优化后(有问题):**
```
用户访问首页 → core.js加载(200KB)
用户点击文章 → PJAX导航(无刷新)
进入文章详情页 → 评论区不加载 ❌
→ page-only.js未加载 ❌
→ initArtalk未定义 ❌
```
**根本原因:**
- PJAX不重新加载JS文件
- page-only.js只在首次访问时加载
- PJAX导航时,JS已经加载过了,不会重新加载
---
## ✅ 解决方案
### 方案:动态加载 + 全局URL
**实现思路:**
1. **存储URL** - 在footer.html中存储page-only.js的URL到全局变量
2. **检测页面** - 在mypjax.js中检测当前页面是否为文章详情页
3. **动态加载** - 如果是且page-only.js未加载,动态创建script标签加载
4. **初始化功能** - 加载完成后自动初始化Artalk等功能
---
## 🛠️ 实施步骤
### 步骤1:修改footer.html
**修改内容:**
- 所有页面都计算page-only.js的URL
- 存储在window._pageOnlyScriptUrl全局变量中
- 文章页面直接加载,非文章页面只存储URL
**关键代码:**
```gohtml
{{ if .IsPage }}
{{/* 文章页面:加载page-only.js */}}
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ else }}
{{/* 非文章页面:只存储URL,不加载 */}}
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ end }}
```
**作用:**
- 确保PJAX导航时能找到page-only.js的正确路径
- Hugo会自动添加fingerprint(如page-only.min.abc123.js)
---
### 步骤2:修改mypjax.js
**修改内容:**
- 在pjax:complete事件中添加动态加载逻辑
- 检测当前页面是否为文章详情页
- 如果是且page-only.js未加载,动态加载
- 设置window._pageOnlyLoaded标志防止重复加载
**关键代码:**
```javascript
// 动态加载页面特定JS(PJAX适配)
var isArticlePage = document.querySelector('#Comments') !== null ||
document.querySelector('.post-content') !== null;
if (isArticlePage && !window._pageOnlyLoaded && window._pageOnlyScriptUrl) {
var script = document.createElement('script');
script.src = window._pageOnlyScriptUrl;
script.onload = function() {
window._pageOnlyLoaded = true;
console.log('page-only.js loaded for PJAX navigation');
if (typeof window.initArtalk === 'function') {
try { window.initArtalk(); } catch(e) {}
}
if (typeof window.initParagraphComments === 'function') {
try { window.initParagraphComments(); } catch(e) {}
}
};
document.body.appendChild(script);
}
```
**作用:**
- 当PJAX导航到文章页时,自动加载page-only.js
- 初始化Artalk评论、段落评论、打赏功能
- 确保用户体验无缝
---
## 🧪 测试验证
### 测试场景
#### 场景1:首页 → 文章详情页
**步骤:**
1. 访问首页
2. 点击文章链接
3. 检查文章详情页
**预期结果:**
- ✅ PJAX导航成功(地址栏更新,无刷新)
- ✅ 文章内容正常显示
- ✅ 评论区正常加载
- ✅ Console显示:`page-only.js loaded for PJAX navigation`
---
#### 场景2:文章 → 另一篇文章
**步骤:**
1. 在文章详情页
2. 点击"下一篇"或其他文章
3. 检查新文章页
**预期结果:**
- ✅ PJAX导航成功
- ✅ 新文章内容正常
- ✅ 评论区正常(无需重新加载page-only.js)
---
#### 场景3:文章 → 首页
**步骤:**
1. 在文章详情页
2. 点击导航栏"首页"
3. 检查首页
**预期结果:**
- ✅ PJAX导航成功
- ✅ 首页内容正常
- ✅ 无Console错误
---
### Console日志检查
**正常情况应该看到:**
**访问首页时:**
```
Pjax initialized: {...}
(无page-only.js相关日志)
```
**PJAX导航到文章详情页时:**
```
Pjax reload triggered
page-only.js loaded for PJAX navigation
```
---
## 💡 技术细节
### 为什么需要全局URL?
**问题:** Hugo构建时会自动添加fingerprint
**示例:**
```
原始:page-only.js
构建后:page-only.min.abc123.js
```
**解决:** 使用全局变量存储正确的URL
```javascript
window._pageOnlyScriptUrl = '/js/page-only.min.abc123.js';
```
---
### 如何防止重复加载?
**使用标志位:**
```javascript
// 检查是否已加载
if (!window._pageOnlyLoaded) {
// 加载page-only.js
// ...
window._pageOnlyLoaded = true;
}
```
---
### 错误处理
**如果page-only.js加载失败:**
```javascript
script.onerror = function() {
console.error('Failed to load page-only.js');
// 可以尝试重新加载或显示错误提示
};
```
---
## 📊 性能影响
### 首次加载(首页)
- ✅ page-only.js不加载(节省~180KB)
- ✅ 首页加载更快
### PJAX导航到文章详情页
- ⚠️ 需要额外加载page-only.js(~180KB)
- ⚠️ 会有100-200ms延迟(网络请求)
- ✅ 但这是按需加载,用户正在看文章,可以接受
### 后续PJAX导航(文章→文章)
- ✅ page-only.js已加载,无需重新加载
- ✅ 性能无影响
---
## 🔄 回滚方案
### 如果PJAX适配出现问题
**方案1:回滚mypjax.js**
```bash
git checkout themes/Ying/assets/js/modules/mypjax.js
```
**方案2:始终加载page-only.js**
修改footer.html,所有页面都加载page-only.js:
```gohtml
{{/* 始终加载page-only.js */}}
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
```
**缺点:** 首页也会加载artalk等JS,违背优化初衷
---
## 💡 最佳实践
### 1. 充分测试
- ✅ 测试所有页面类型
- ✅ 测试PJAX导航场景
- ✅ 测试边界情况
- ✅ 监控Console错误
### 2. 性能监控
- ✅ 监控page-only.js加载时间
- ✅ 检查是否有重复加载
- ✅ 记录PJAX导航耗时
- ✅ 优化加载时序
### 3. 错误处理
- ✅ 添加加载失败处理
- ✅ 提供降级方案
- ✅ 记录错误日志
- ✅ 及时修复问题
---
## 📈 总结
### PJAX适配完成
- ✅ 动态加载page-only.js
- ✅ 全局变量传递URL
- ✅ 事件监听(pjax:complete)
- ✅ 加载状态标志(防止重复加载)
### 优化效果保持
- ✅ 首页JS减少56%
- ✅ 文章页JS减少44%
- ✅ PJAX完美适配
- ✅ 所有功能正常
### 兼容性
- ✅ Chrome 47+
- ✅ Firefox 55+
- ✅ Safari 12.1+
- ✅ Edge 79+
---
**PJAX适配完成时间:** 2026-06-03
**实施耗时:** 约30分钟
**风险等级:** 低
**测试状态:** 通过
**PJAX适配完美!** 🎉
@@ -0,0 +1,204 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 06-PJAX修复总结
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
**问题:** PJAX导航后评论区不加载
---
## 🔴 问题描述
### 问题现象
用户反馈:通过PJAX导航到文章详情页后,评论区不加载。
### 复现步骤
1. 访问首页
2. 点击文章链接(PJAX导航,无刷新)
3. 进入文章详情页
4. 评论区未加载
### 错误信息
Console显示:
```
Uncaught ReferenceError: initArtalk is not defined
```
---
## 🔍 问题分析
### 根本原因
1. **page-only.js只在首次访问时加载**
- 文章详情页直接访问时,page-only.js在footer.html中加载
- PJAX导航时,不会重新加载JS文件
2. **initArtalk函数未定义**
- artalk.js中的initArtalk函数在page-only.js中
- 如果page-only.js未加载,该函数不存在
3. **mypjax.js尝试调用未定义的函数**
- pjax:complete事件中调用initArtalk
- 但函数未定义,导致错误
---
## ✅ 解决方案
### 方案:动态加载 + 全局URL
**核心思路:**
1. 存储page-only.js的URL到全局变量
2. PJAX导航时检测是否需要加载
3. 动态创建script标签加载
4. 加载完成后初始化功能
---
## 🛠️ 实施步骤
### 步骤1:修改footer.html
**修改内容:**
- 所有页面都计算page-only.js的URL
- 存储在window._pageOnlyScriptUrl全局变量
**关键代码:**
```gohtml
{{ if .IsPage }}
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ else }}
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
{{ end }}
```
---
### 步骤2:修改mypjax.js
**修改内容:**
- 在pjax:complete事件中添加动态加载逻辑
- 检测当前页面是否为文章详情页
- 动态加载page-only.js
- 初始化Artalk等功能
**关键代码:**
```javascript
// 动态加载页面特定JS(PJAX适配)
var isArticlePage = document.querySelector('#Comments') !== null ||
document.querySelector('.post-content') !== null;
if (isArticlePage && !window._pageOnlyLoaded && window._pageOnlyScriptUrl) {
var script = document.createElement('script');
script.src = window._pageOnlyScriptUrl;
script.onload = function() {
window._pageOnlyLoaded = true;
console.log('page-only.js loaded for PJAX navigation');
if (typeof window.initArtalk === 'function') {
try { window.initArtalk(); } catch(e) {}
}
};
document.body.appendChild(script);
}
```
---
## 🧪 测试验证
### 测试场景
**场景1:首页 → 文章详情页**
- [ ] PJAX导航成功
- [ ] 评论区正常加载
- [ ] Console显示加载日志
**场景2:文章 → 另一篇文章**
- [ ] PJAX导航成功
- [ ] 评论区正常(无需重新加载)
**场景3:文章 → 首页**
- [ ] PJAX导航成功
- [ ] 首页正常
---
## 📊 性能影响
### 优化效果保持
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页JS** | 800KB | 350KB | ⚡ -56% |
| **文章页JS** | 800KB | 450KB | ⚡ -44% |
| **PJAX适配** | ✅ | ✅ | - |
### PJAX适配开销
- **代码量:** +30行(mypjax.js)
- **运行时开销:** 可忽略不计
- **网络开销:** 仅首次加载page-only.js(~180KB)
---
## 🔄 回滚方案
### 如果修复出现问题
**方案1:回滚mypjax.js**
```bash
git checkout themes/Ying/assets/js/modules/mypjax.js
```
**方案2:始终加载page-only.js**
```gohtml
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
```
---
## 💡 经验总结
### 关键点
1. **PJAX不重新加载JS**
- 需要手动处理动态加载
- 使用全局变量传递URL
2. **函数定义检查**
- 调用前检查函数是否存在
- 使用typeof检查
3. **加载状态管理**
- 使用标志位防止重复加载
- window._pageOnlyLoaded
4. **错误处理**
- 添加try-catch
- 记录错误日志
---
## ✅ 修复完成
- ✅ PJAX导航正常
- ✅ 评论区正常加载
- ✅ 性能优化保持
- ✅ 所有功能正常
**PJAX修复成功!** 🎉
---
**修复完成时间:** 2026-06-03
**修复耗时:** 约30分钟
**风险等级:** 低
**测试状态:** 通过
@@ -0,0 +1,239 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 07-字体子集化优化
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已完成
**优化效果:** 字体减少37%(1.2MB → 757KB)
---
## 📋 优化概述
### 优化目标
将中文字体从1.2MB优化到757KB,减少37%,提升加载速度。
### 优化效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **字体大小** | 1.2MB | 757KB | ⚡ -37% |
| **字符数** | 20,000+ | 2,485 | - |
| **加载时间** | ~6s | ~4s | ⚡ -33% |
---
## 🔍 优化原理
### 原始字体
- 包含完整中文字符集(20,000+字符)
- 包含CJK扩展区(生僻字)
- 文件大小:1.2MB
### 子集字体
- 只包含实际使用的字符(2,485个)
- 常用中文字符
- 英文字母和数字
- 常用标点符号
- 文件大小:757KB
---
## 🛠️ 实施步骤
### 步骤1:备份原始字体
```bash
cd E:\GitHub\blog
# Windows
copy themes\Ying\static\font\zql-v2.woff2 themes\Ying\static\font\zql-v2.woff2.backup
copy themes\Ying\static\font\zql-v2.woff themes\Ying\static\font\zql-v2.woff.backup
# Mac/Linux
cp themes/Ying/static/font/zql-v2.woff2 themes/Ying/static/font/zql-v2.woff2.backup
cp themes/Ying/static/font/zql-v2.woff themes/Ying/static/font/zql-v2.woff.backup
```
---
### 步骤2:安装Python依赖
```bash
pip install fonttools brotli
```
---
### 步骤3:构建Hugo站点
```bash
hugo --destination=public
```
---
### 步骤4:运行字体子集化
```bash
python scripts/subset-font-safe.py
```
**预期输出:**
```
🔤 字体子集化工具(安全版本)
==================================================
✅ 找到public目录,将扫描构建后的HTML
🔍 扫描目录: content, layouts, public
📝 提取了 2492 个唯一字符
💾 字符列表已保存到: themes/Ying/static/font\used_chars.txt
✂️ 正在生成子集字体...
✅ 子集化完成!
📊 优化结果:
子集字符数: 2485
子集文件大小: 739.7 KB
减少: 486.8 KB (39.7%)
🎉 所有子集字体生成成功!
```
---
### 步骤5:更新CSS字体声明
**文件:** `themes/Ying/assets/css/main.css`
**修改字体声明:**
```css
@font-face {
font-family: 'zql';
src: url('../font/zql-v2-subset.woff2') format('woff2'),
url('../font/zql-v2-subset.woff') format('woff');
font-display: swap;
}
```
**关键改动:**
- `zql-v2.woff2` → `zql-v2-subset.woff2`
- `zql-v2.woff` → `zql-v2-subset.woff`
- 删除 `unicode-range`
---
## 🧪 测试验证
### 功能测试
- [ ] 中文字符正常
- [ ] 英文字符正常
- [ ] 数字正常
- [ ] 标点符号正常
- [ ] 深色模式正常
- [ ] 移动端正常
### 性能测试
- [ ] Network面板显示字体大小减少
- [ ] 无404错误
- [ ] Lighthouse无字体警告
---
## 🔄 回滚方案
### 如果优化失败
```bash
# 恢复原始字体
cp themes/Ying/static/font/zql-v2.woff2.backup themes/Ying/static/font/zql-v2.woff2
cp themes/Ying/static/font/zql-v2.woff.backup themes/Ying/static/font/zql-v2.woff
# 恢复CSS
git checkout themes/Ying/assets/css/main.css
```
---
## 📊 Python脚本说明
### 脚本功能
**subset-font-safe.py:**
- 扫描所有HTML、CSS、Markdown文件
- 提取实际使用的字符
- 生成子集字体
- 验证优化效果
### 工作原理
1. **扫描目录**
- content/(文章内容)
- layouts/(模板文件)
- public/(构建后的HTML)
2. **提取字符**
- 中文字符
- 英文字母和数字
- 常用标点符号
- 特殊符号
3. **生成子集**
- 使用fonttools库
- 保留字体特性
- 压缩输出
---
## 💡 最佳实践
### 1. 定期更新
```bash
# 每月运行一次
python scripts/subset-font-safe.py
```
### 2. 监控字符覆盖
```bash
# 查看字符列表
cat themes/Ying/static/font/used_chars.txt
```
### 3. 验证优化效果
```bash
# 检查文件大小
ls -lh themes/Ying/static/font/zql-v2-subset.*
```
---
## 📈 优化总结
### 完成情况
- ✅ 字体大小减少37%
- ✅ 保持所有字符正常显示
- ✅ 加载速度提升33%
- ✅ 自动化脚本就绪
### 后续使用
- ✅ GitHub Actions自动优化
- ✅ 内容更新时自动触发
- ✅ 无需手动干预
---
**字体优化完成时间:** 2026-06-03
**实施耗时:** 约1.5小时
**优化效果:** 字体减少37%
**风险等级:** 低
**维护成本:** 0(自动化)
**字体优化效果显著!** 🎉
@@ -0,0 +1,359 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 08-GitHub-Actions使用指南
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已配置完成
**工作流:** Font Subset Optimization
---
## 📋 工作流概述
### 工作流名称
`Font Subset Optimization`(字体子集优化)
### 工作流文件
`.github/workflows/subset-fonts.yml`
### 触发条件
1. **自动触发** - 推送到main分支且content/或layouts/有变更
2. **手动触发** - 在GitHub Actions界面手动运行
3. **定期触发** - 每周一凌晨2点自动检查
---
## 🚀 使用方法
### 方法1:自动触发(推荐)✅
**无需任何操作!** 当你推送内容更新时,工作流自动运行:
```bash
# 发布新文章
git add content/posts/new-article.md
git commit -m "feat: new article"
git push origin main
# GitHub Actions自动:
# 1. 检测到content目录有变更
# 2. 构建Hugo站点
# 3. 运行字体子集化
# 4. 提交优化后的字体
```
**查看运行状态:**
```
访问:https://github.com/zqlit/blog/actions
```
---
### 方法2:手动触发
**适用场景:**
- 强制重新生成子集字体
- 修改了字体脚本
- 测试工作流
**操作步骤:**
1. 访问GitHub仓库 → **Actions** 标签
2. 选择 **Font Subset Optimization**
3. 点击 **Run workflow**
4. (可选)勾选 **强制重新生成子集字体**
5. 点击 **Run workflow** 按钮
---
### 方法3:定期自动运行
**默认:** 每周一凌晨2点自动运行
**作用:** 检查是否需要更新
**修改频率:**
```yaml
# 编辑 .github/workflows/subset-fonts.yml
schedule:
# 每天凌晨3点
- cron: '0 3 * * *'
# 每月1号凌晨2点
- cron: '0 2 1 * *'
```
---
## 📊 工作流步骤
### 步骤1:检出代码
```yaml
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
```
**作用:** 下载仓库代码
---
### 步骤2:设置Python环境
```yaml
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
```
**作用:** 安装Python 3.11
---
### 步骤3:安装依赖
```yaml
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install fonttools brotli
```
**作用:** 安装字体处理工具
---
### 步骤4:构建Hugo站点
```yaml
- name: Build Hugo site
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
- name: Build
run: hugo --destination=public --minify
```
**作用:** 生成静态HTML
---
### 步骤5:运行字体子集化
```yaml
- name: Subset fonts
run: python scripts/subset-font-safe.py
```
**作用:** 提取字符并生成优化字体
---
### 步骤6:验证优化效果
```yaml
- name: Verify optimization
run: |
ORIGINAL_SIZE=$(stat -c%s themes/Ying/static/font/zql-v2.woff2)
SUBSET_SIZE=$(stat -c%s themes/Ying/static/font/zql-v2-subset.woff2)
# 检查子集字体是否更小
```
**作用:** 确保优化有效
---
### 步骤7:提交更改
```yaml
- name: Commit changes
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add themes/Ying/static/font/zql-v2-subset.*
git commit -m "chore: update font subset (automated) [skip ci]"
```
**作用:** 保存优化后的字体
**关键:** `[skip ci]` 避免触发deploy.yml
---
### 步骤8:推送更改
```yaml
- name: Push changes
run: git push origin main
```
**作用:** 推送到GitHub仓库
---
## 🔍 监控和调试
### 查看运行状态
1. 访问GitHub仓库
2. 点击 **Actions** 标签
3. 查看运行列表
**状态图标:**
- ✅ **绿色** - 成功
- ❌ **红色** - 失败
- 🟡 **黄色** - 进行中
---
### 查看详细日志
1. 点击具体运行记录
2. 点击 **subset-fonts** 任务
3. 展开每个步骤查看日志
**关键日志:**
```
✅ Font optimized: reduced 486800 bytes (39%)
```
---
## ⚙️ 自定义配置
### 修改触发条件
**只在特定文件变更时触发:**
```yaml
on:
push:
paths:
- 'content/posts/**'
- 'content/**/*.md'
```
---
### 修改运行频率
```yaml
schedule:
# 每天凌晨3点
- cron: '0 3 * * *'
# 每周一和周四凌晨2点
- cron: '0 2 * * 1,4'
```
---
### 禁用定期运行
```yaml
# schedule:
# - cron: '0 2 * * 1'
```
---
## 🐛 故障排除
### 问题1:工作流没有触发
**解决方案:**
1. 检查仓库设置 → Actions → 已启用
2. 检查路径过滤是否正确
3. 查看Actions页面的错误信息
---
### 问题2:Python依赖安装失败
**解决方案:**
```yaml
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install fonttools brotli --no-cache-dir
```
---
### 问题3:Hugo构建失败
**解决方案:**
1. 检查hugo.toml配置
2. 确保所有主题文件存在
3. 查看Hugo错误日志
---
### 问题4:推送失败
**原因:** GitHub Actions没有写权限
**解决方案:**
1. 仓库设置 → Actions → General
2. **Workflow permissions** → 选择 **Read and write permissions**
---
## 💡 最佳实践
### 1. 保护主分支
**建议:** 启用分支保护规则
---
### 2. 监控工作流
**建议:** 设置失败通知
---
### 3. 测试工作流
**建议:** 在feature分支测试
---
## 📈 工作流优势
### ✅ 自动化
- 无需手动运行脚本
- 内容更新时自动优化
- 定期检查确保最新
### ✅ 智能化
- 检测内容变更
- 验证优化效果
- 避免不必要的提交
### ✅ 可靠性
- 使用官方GitHub Actions
- 完整的错误处理
- 详细的日志记录
---
**GitHub Actions配置完成!** 🎉
**现在可以:**
- ✅ 推送内容时自动优化字体
- ✅ 每周定期检查
- ✅ 手动触发(需要时)
- ✅ 无需手动干预
@@ -0,0 +1,210 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 09-Actions修复指南
**创建日期:** 2026-06-03
**版本:** v1.0
**状态:** ✅ 已修复
**适用范围:** GitHub Actions常见问题
---
## 🔴 问题1:Python依赖安装失败
### 错误信息
```
Error: No file in /home/runner/work/blog/blog matched to [**/requirements.txt or **/pyproject.toml]
```
### 原因
actions/setup-python@v5的cache功能需要requirements.txt文件
### 解决方案
**创建requirements.txt:**
```bash
echo fonttools > requirements.txt
echo brotli >> requirements.txt
```
**恢复cache配置:**
```yaml
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
```
---
## 🔴 问题2:与deploy.yml冲突
### 问题场景
```
subset-fonts.yml push到main
↓
触发deploy.yml
↓
deploy.yml可能又push
↓
再次触发subset-fonts.yml
↓
无限循环!❌
```
### 解决方案
**在subset-fonts.yml的commit消息中添加[skip ci]:**
```yaml
git commit -m "chore: update font subset (automated) [skip ci]"
```
**原理:**
- deploy.yml检查commit消息
- 如果包含[skip ci],不会再次触发
- 避免循环触发
---
## 🔴 问题3:工作流没有触发
### 可能原因
1. Actions未启用
2. 路径过滤不正确
3. 仓库名配置错误
### 解决方案
**检查仓库设置:**
```
Settings → Actions → General → 选择 "Allow all actions"
```
**检查仓库名:**
```yaml
if: github.repository == 'zqlit/blog' # 确保正确
```
---
## 🔴 问题4:推送失败
### 错误信息
```
Permission denied
```
### 解决方案
**修改仓库权限:**
```
Settings → Actions → General → Workflow permissions
→ 选择 "Read and write permissions"
→ 勾选 "Allow GitHub Actions to create and approve pull requests"
```
---
## 🔴 问题5:Hugo构建失败
### 可能原因
1. hugo.toml配置错误
2. 主题文件缺失
3. Hugo版本不兼容
### 解决方案
**检查配置文件:**
```bash
hugo config
```
**指定Hugo版本:**
```yaml
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.128.2' # 指定版本
extended: true
```
---
## 🔴 问题6:字体子集化失败
### 可能原因
1. Python脚本语法错误
2. 字体文件不存在
3. 依赖版本不兼容
### 解决方案
**检查Python脚本:**
```bash
python scripts/subset-font-safe.py
```
**检查依赖版本:**
```bash
pip show fonttools
pip show brotli
```
---
## 💡 预防措施
### 1. 定期检查
```bash
# 每周查看Actions运行状态
# https://github.com/zqlit/blog/actions
```
### 2. 监控日志
```bash
# 查看详细日志
# Actions → 具体运行 → subset-fonts → 查看日志
```
### 3. 测试工作流
```bash
# 在feature分支测试
git checkout -b test/workflow
git push origin test/workflow
```
---
## 📞 获取帮助
### 查看GitHub文档
- [GitHub Actions文档](https://docs.github.com/en/actions)
- [workflow语法](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions)
### 查看Actions日志
```
Actions → 具体运行 → 查看详细日志
```
---
**故障排除指南完成!** 🎉
**遇到问题时:**
1. 查看本文档
2. 检查Actions日志
3. 搜索GitHub文档
@@ -0,0 +1,313 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 10-提交指南
**创建日期:** 2026-06-03
**版本:** v1.0
**适用范围:** 性能优化代码提交
---
## 📋 提交内容清单
### 1. JS优化(已提交)✅
**修改文件:**
- `themes/Ying/layouts/partials/footer.html`
- `themes/Ying/assets/js/modules/mypjax.js`
**提交信息:**
```
perf: JS按需加载优化 + PJAX适配
- 首页JS减少56%(800KB → 350KB)
- 文章页JS减少44%(800KB → 450KB)
- 完美适配PJAX导航
- 所有功能正常
```
---
### 2. 字体优化(待提交)⏳
**修改文件:**
- `themes/Ying/assets/css/main.css`
- `themes/Ying/static/font/zql-v2-subset.woff2`
- `themes/Ying/static/font/zql-v2-subset.woff`
- `themes/Ying/static/font/used_chars.txt`
**提交信息:**
```
perf: 字体子集化优化 - 减少37%
- 字体大小:1.2MB → 757KB
- 使用Python fonttools提取2,485个字符
- 保持所有字符正常显示
```
---
### 3. 自动化工作流(待提交)⏳
**创建文件:**
- `.github/workflows/subset-fonts.yml`
- `requirements.txt`
**提交信息:**
```
ci: 添加字体子集化自动化工作流
- GitHub Actions自动运行
- 内容更新时自动触发
- 每周定期检查
- 智能检测变更
```
---
## 🚀 推荐提交命令
### 方案A:一次提交所有优化(推荐)
```bash
cd E:\GitHub\blog
# 查看修改
git status
# 添加所有文件
git add themes/Ying/assets/css/main.css
git add themes/Ying/static/font/zql-v2-subset.*
git add themes/Ying/static/font/used_chars.txt
git add .github/workflows/subset-fonts.yml
git add requirements.txt
# 提交
git commit -m "perf: 完整性能优化 - JS按需加载 + 字体子集化 + 自动化
JS优化:
- 首页JS减少56%(800KB → 350KB)
- 文章页JS减少44%(800KB → 450KB)
- 完美适配PJAX导航
字体优化:
- 字体大小减少37%(1.2MB → 757KB)
- 使用Python fonttools提取2,485个字符
自动化:
- GitHub Actions自动字体子集化
- 内容更新时自动触发
- 每周定期检查
总体效果:
- 总体资源减少50%+
- Lighthouse得分提升至75-80"
# 推送
git push origin main
```
---
### 方案B:分步提交
**步骤1:提交JS优化**
```bash
git add themes/Ying/layouts/partials/footer.html
git add themes/Ying/assets/js/modules/mypjax.js
git commit -m "perf: JS按需加载优化 + PJAX适配"
```
**步骤2:提交字体优化**
```bash
git add themes/Ying/assets/css/main.css
git add themes/Ying/static/font/zql-v2-subset.*
git add themes/Ying/static/font/used_chars.txt
git commit -m "perf: 字体子集化优化 - 减少37%"
```
**步骤3:提交自动化工作流**
```bash
git add .github/workflows/subset-fonts.yml
git add requirements.txt
git commit -m "ci: 添加字体子集化自动化工作流"
```
**步骤4:推送所有提交**
```bash
git push origin main
```
---
## 📋 提交前检查清单
### 文件检查
- [ ] main.css已修改(字体路径)
- [ ] zql-v2-subset.woff2已生成(757KB)
- [ ] zql-v2-subset.woff已生成(757KB)
- [ ] subset-fonts.yml已创建
- [ ] requirements.txt已创建
### 功能检查
- [ ] 首页正常显示
- [ ] 文章详情页正常
- [ ] 评论区正常加载
- [ ] 深色模式正常
- [ ] 字体显示正常
### 性能检查
- [ ] Network面板显示字体大小 ~757KB
- [ ] JS大小减少(首页~350KB)
- [ ] 无Console错误
---
## 🔍 验证提交
### 提交后检查
```bash
# 查看提交历史
git log --oneline -5
# 查看提交详情
git show HEAD
# 查看远程是否同步
git fetch origin
git log --oneline origin/main -3
```
### GitHub Actions验证
1. 访问:`https://github.com/zqlit/blog/actions`
2. 查看是否有新的工作流运行
3. 检查工作流状态
---
## 💡 提交最佳实践
### 1. 清晰的提交信息
**好的示例:**
```
perf: JS按需加载优化 - 首页减少56%
- 拆分为core.js、page-only.js、deferred.js
- 核心JS始终加载
- 页面特定JS按需加载
- 完美适配PJAX导航
```
**不好的示例:**
```
update
fix
perf
```
---
### 2. 原子性提交
**好的做法:**
- 一个提交解决一个问题
- 便于回滚和追踪
- 代码审查更容易
**不好的做法:**
- 一个提交包含多个不相关修改
- 难以回滚
- 代码审查困难
---
### 3. 测试后再提交
**流程:**
1. 本地测试通过
2. 提交代码
3. 推送到远程
4. 等待CI/CD运行
5. 验证部署成功
---
## 🔄 回滚方案
### 如果提交后发现问题
**回滚到上一个提交:**
```bash
# 查看提交历史
git log --oneline -10
# 回滚到特定提交
git revert <commit-hash>
# 或者回滚到上一个提交
git reset --hard HEAD~1
git push origin main --force
```
**注意:** `--force` 会覆盖远程历史,谨慎使用
---
## 📊 提交统计
### 本次优化提交
**提交次数:** 3-4次
**修改文件:** 8-10个
**新增文件:** 5-6个
**代码行数:** +500行(估算)
### 提交时间线
```
Day 1: JS优化
├── 修改footer.html
├── 修改mypjax.js
└── 测试验证
Day 2: 字体优化
├── 运行子集化脚本
├── 修改main.css
└── 测试验证
Day 3: 自动化
├── 创建subset-fonts.yml
├── 创建requirements.txt
└── 测试自动化
```
---
## ✅ 提交完成
### 验证成功
- ✅ 所有文件已提交
- ✅ GitHub Actions正常运行
- ✅ 部署成功
- ✅ 性能提升生效
### 后续使用
**现在可以:**
- ✅ 发布新文章时自动优化
- ✅ 享受性能提升
- ✅ 无需手动干预
---
**提交指南完成!** 🎉
**祝你提交顺利!**
@@ -0,0 +1,190 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 11-JS优化测试指南
**创建日期:** 2026-06-03
**版本:** v1.0
**适用范围:** JS按需加载优化测试
---
## 🧪 测试步骤
### 步骤1:构建并启动Hugo
```bash
cd E:\GitHub\blog
hugo --cleanDestinationDir
hugo server -D
```
访问:`http://localhost:1313`
---
### 步骤2:Network面板检查
1. 打开DevTools(F12)
2. 切换到 **Network** 面板
3. 刷新页面(Ctrl+Shift+R)
**预期结果:**
- ✅ 看到 `core.js` 文件加载(~200KB)
- ✅ 首页不加载 `page-only.js`
- ✅ 文章详情页加载 `page-only.js`(~180KB)
- ✅ 总体JS大小显著减少
---
### 步骤3:Lighthouse测试
1. 切换到 **Lighthouse** 面板
2. 选择 **Performance**
3. 点击 **Analyze page load**
**预期指标:**
- [ ] Performance得分:75-85(提升15-25分)
- [ ] TTI:改善20-30%
- [ ] TBT:改善40-50%
- [ ] Speed Index:改善20-30%
---
## 🔍 功能测试清单
### 首页功能
**核心功能(必须正常):**
- [ ] 导航菜单点击正常
- [ ] 搜索框打开/关闭正常
- [ ] 搜索结果显示正常
- [ ] 主题切换(深色/浅色)正常
- [ ] 文章列表显示正常
- [ ] 分页功能正常
- [ ] 浮动工具栏正常
**条件加载功能:**
- [ ] 无限滚动正常(如果启用)
---
### 文章详情页功能
**核心功能(必须正常):**
- [ ] 文章内容正常显示
- [ ] 图片灯箱正常(点击查看大图)
- [ ] 返回顶部按钮正常
**按需加载功能(必须正常):**
- [ ] Artalk评论区正常加载(等待1-2秒)
- [ ] 评论功能正常(发布、回复)
- [ ] 打赏按钮功能正常
- [ ] 段落评论正常(如果启用)
---
### 其他页面功能
- [ ] 友链页面(/links)正常
- [ ] circles页面(/circles)正常
- [ ] 归档页面(/archives)正常
- [ ] 搜索结果页正常
---
### 跨页面功能
- [ ] PJAX导航正常(页面无刷新切换)
- [ ] 浏览器前进/后退正常
- [ ] 书签/分享链接正常
---
## 📊 性能指标对比表
### Network面板数据
| 资源 | 优化前大小 | 优化后大小 | 减少 |
|------|-----------|-----------|------|
| **首页JS** | 800KB | ____KB | ____% |
| **文章页JS** | 800KB | ____KB | ____% |
| **总体资源** | ~3MB | ____KB | ____% |
### Lighthouse指标
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **Performance得分** | 60 | ____ | +____ |
| **FCP** | 2.5s | ____s | ____% |
| **LCP** | 3.5s | ____s | ____% |
| **TTI** | 4.0s | ____s | ____% |
| **TBT** | 350ms | ____ms | ____% |
| **Speed Index** | 3.0s | ____s | ____% |
---
## 🐛 故障排除
### 问题1:评论区未加载
**解决方案:**
1. 打开Console查看错误
2. 检查Network面板,确认page-only.js加载成功
3. 等待2-3秒,Artalk可能需要时间初始化
---
### 问题2:功能延迟响应
**解决方案:**
- 这是预期行为,用户可能会感觉到轻微延迟
- 如果延迟明显(>3秒),考虑将该模块移到core.js
---
### 问题3:无限滚动失效
**解决方案:**
1. 检查hugo.toml中infiniteScroll.enable是否为true
2. 查看Console是否有错误
3. 确认infinite-scroll.js加载成功
---
## 🔄 回滚方案
### 如果优化后出现严重问题
```bash
# 备份当前文件
cp themes/Ying/layouts/partials/footer.html themes/Ying/layouts/partials/footer.html.optimized
# 恢复原始代码(参考TEST_JS_OPTIMIZATION.md中的回滚方案)
```
---
## ✅ 测试通过标准
### 功能标准(必须全部通过)
- ✅ 所有页面正常显示
- ✅ 核心功能正常(导航、搜索、主题切换)
- ✅ 文章详情页功能正常(评论、打赏、灯箱)
- ✅ 无限滚动正常(如果启用)
- ✅ PJAX导航正常
- ✅ 无Console错误(或只有非关键警告)
### 性能标准(至少达到一项)
- ✅ Lighthouse Performance得分提升10+分
- ✅ TTI改善15%+
- ✅ TBT改善30%+
- ✅ 总体JS大小减少40%+
---
**JS优化测试指南完成!** 🎉
**测试通过后即可提交代码!**
@@ -0,0 +1,197 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 12-字体优化测试指南
**创建日期:** 2026-06-03
**版本:** v1.0
**适用范围:** 字体子集化优化测试
---
## 🧪 测试步骤
### 步骤1:重新构建Hugo
```bash
cd E:\GitHub\blog
hugo --cleanDestinationDir
hugo server -D
```
访问:`http://localhost:1313`
---
### 步骤2:检查字体加载
1. 打开DevTools(F12)
2. 切换到 **Network** 面板
3. 刷新页面
4. 筛选 `woff2` 或 `woff`
**预期结果:**
- ✅ 看到 `zql-v2-subset.woff2` 被加载
- ✅ 文件大小:~757KB(而不是1.2MB)
- ✅ 无404错误
---
### 步骤3:视觉检查
#### 中文字符测试
- [ ] 导航菜单中文正常
- [ ] 文章标题中文正常
- [ ] 文章内容中文正常
- [ ] 深色模式下中文正常
#### 英文字符测试
- [ ] 英文字母正常(A-Z, a-z)
- [ ] 数字正常(0-9)
- [ ] 常用符号正常(@#$%)
#### 标点符号测试
- [ ] 中文标点正常(,。!?、;:""'')
- [ ] 英文标点正常(,.!?;:'")
- [ ] 括号正常(()【】《》)
#### 不同页面测试
- [ ] 首页字体正常
- [ ] 文章详情页字体正常
- [ ] 友链页面字体正常
- [ ] 归档页面字体正常
- [ ] 移动端字体正常
---
### 步骤4:深色模式测试
1. 点击头像或主题切换按钮
2. 检查深色模式下:
- [ ] 所有文字正常显示
- [ ] 字体颜色正确
- [ ] 无闪烁或异常
---
## 📊 性能验证
### Network面板数据记录
| 文件 | 优化前 | 优化后 | 减少 |
|------|--------|--------|------|
| **zql-v2.woff2** | 1.2MB | ____KB | ____% |
| **zql-v2.woff** | 1.2MB | ____KB | ____% |
| **总字体大小** | 2.4MB | ____KB | ____% |
---
### Lighthouse测试(可选)
使用Chrome DevTools的Lighthouse面板测试
**预期指标:**
- Performance得分:75-85
- 无字体相关警告
- FCP:改善20-30%
---
## 🔍 验证子集化效果
### 检查字符覆盖
你的子集字体包含 **2,485个字符**,包括:
**基本字符:**
- ✅ 英文字母(A-Z, a-z)
- ✅ 数字(0-9)
- ✅ 常用标点符号
**中文字符:**
- ✅ 常用汉字(根据网站内容提取)
- ✅ 中文标点符号
- ✅ CJK符号
---
## 🐛 故障排除
### 问题1:字符显示为方块(□)
**解决方案A:重新运行子集化**
```bash
python scripts/subset-font-safe.py
```
**解决方案B:保留原始字体作为fallback**
```css
@font-face {
font-family: 'zql';
src: url('../font/zql-v2-subset.woff2') format('woff2');
font-display: swap;
}
@font-face {
font-family: 'zql-full';
src: url('../font/zql-v2.woff2') format('woff2');
font-display: swap;
}
body {
font-family: 'zql', 'zql-full', serif;
}
```
---
### 问题2:字体文件404错误
**解决方案:**
1. 确认文件存在:`ls themes/Ying/static/font/zql-v2-subset.*`
2. 检查CSS路径是否正确
3. 清理Hugo缓存:`hugo --cleanDestinationDir`
---
## 🔄 回滚方案
### 如果优化后出现问题
```bash
# 恢复原始字体
cp themes/Ying/static/font/zql-v2.woff2.backup themes/Ying/static/font/zql-v2.woff2
cp themes/Ying/static/font/zql-v2.woff.backup themes/Ying/static/font/zql-v2.woff
# 恢复CSS
git checkout themes/Ying/assets/css/main.css
```
---
## ✅ 测试通过标准
### 功能标准(必须全部通过)
- ✅ 所有页面正常显示
- ✅ 中文字符正常(常用汉字、标点)
- ✅ 英文字符正常(字母、数字、符号)
- ✅ 深色模式正常
- ✅ 响应式布局正常
- ✅ 无Console错误
### 性能标准(至少达到一项)
- ✅ 字体大小减少30%+(1.2MB → 757KB ✅ 已达成)
- ✅ 加载时间减少20%+
- ✅ Lighthouse无字体警告
---
**字体优化测试指南完成!** 🎉
**测试通过后即可提交代码!**
@@ -0,0 +1,239 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 13-主题全面优化分析
**创建日期:** 2026-06-03
**版本:** v1.0
**分析对象:** Hugo主题Ying
**分析范围:** 性能、代码质量、SEO、安全性
---
## 📋 主题概述
### 主题信息
- **主题名称:** Ying
- **主题类型:** Hugo静态站点主题
- **功能特点:** 简洁优雅、深色模式、PJAX导航、响应式设计
### 技术栈
- **前端框架:** UIkit
- **图标库:** Remixicon
- **评论系统:** Artalk
- **图表库:** Echarts
- **导航技术:** PJAX
---
## ✅ 优点
### 1. 优秀的资源压缩策略
- ✅ CSS/JS文件合并和压缩
- ✅ 使用Hugo资源管道
- ✅ Fingerprint缓存破坏
### 2. 深色模式支持
- ✅ CSS变量实现
- ✅ 平滑过渡动画
- ✅ 用户偏好存储
### 3. 响应式设计
- ✅ 移动端适配
- ✅ 触摸优化
- ✅ 灵活布局
### 4. 模块化JavaScript
- ✅ 功能模块分离
- ✅ 按需初始化
- ✅ 错误处理
### 5. 现代化SEO基础
- ✅ Open Graph标签
- ✅ Twitter Card
- ✅ Canonical URL
---
## ⚠️ 需要优化的地方
### 1. 性能优化(已实施)✅
**问题:**
- 所有JS打包为单个bundle(800KB)
- 字体文件过大(1.2MB)
- 所有页面加载所有资源
**解决方案:**
- ✅ JS按需加载(减少56%)
- ✅ 字体子集化(减少37%)
- ✅ 总体性能提升50%
---
### 2. CSS架构(建议优化)
**问题:**
- main.css为单一大文件(500KB+)
- 深度嵌套选择器
- 缺少CSS变量管理
**建议:**
- 拆分为模块化CSS
- 使用BEM命名规范
- 集中管理CSS变量
---
### 3. SEO完善(建议优化)
**问题:**
- 缺少结构化数据(JSON-LD)
- Meta keywords逻辑不完善
- 缺少面包屑导航
**建议:**
- 添加JSON-LD结构化数据
- 优化meta keywords提取
- 添加面包屑导航
---
### 4. 安全性(建议优化)
**问题:**
- 缺少SRI(Subresource Integrity)
- 未实施CSP(Content Security Policy)
- 第三方脚本安全审计
**建议:**
- 添加SRI哈希
- 实施CSP头部
- 审计第三方依赖
---
### 5. 可访问性(建议优化)
**问题:**
- 缺少ARIA标签
- 键盘导航不完整
- 颜色对比度可能不足
**建议:**
- 添加ARIA标签
- 完善键盘导航
- 检查颜色对比度
---
## 📊 优化优先级
### 高优先级(已实施)✅
1. **JS按需加载** - 减少56%
2. **字体子集化** - 减少37%
3. **GitHub Actions自动化** - 100%自动化
---
### 中优先级(建议实施)
1. **CSS架构重构** - 提升可维护性
2. **SEO完善** - 提升搜索引擎排名
3. **安全性增强** - 保护用户安全
---
### 低优先级(可选)
1. **可访问性改进** - 提升用户体验
2. **代码注释增强** - 提升可读性
3. **文档完善** - 便于维护
---
## 🎯 已实施的优化
### 1. JS按需加载优化
**优化效果:**
- 首页JS:800KB → 350KB(⚡ -56%)
- 文章页JS:800KB → 450KB(⚡ -44%)
**技术实现:**
- 代码拆分为4个bundle
- 核心JS始终加载
- 页面特定JS按需加载
- 非关键JS延迟加载
---
### 2. 字体子集化优化
**优化效果:**
- 字体大小:1.2MB → 757KB(⚡ -37%)
**技术实现:**
- Python fonttools提取字符
- 生成子集字体(2,485字符)
- 更新CSS字体声明
---
### 3. GitHub Actions自动化
**自动化程度:** 100%
**功能:**
- 内容更新时自动优化字体
- 每周定期检查
- 智能检测变更
- 自动部署到UpYun
---
## 📈 优化效果总结
### 性能提升
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **总体资源** | ~3MB | ~1.5MB | ⚡ -50% |
| **加载速度** | 慢 | 快 | ⚡ +40% |
| **Lighthouse** | 60 | 75-80 | ⚡ +33% |
---
## 💡 后续建议
### 1. 定期监控
- ✅ 每月Lighthouse测试
- ✅ 监控Core Web Vitals
- ✅ 收集用户反馈
### 2. 持续优化
- ✅ CSS架构重构
- ✅ SEO完善
- ✅ 安全性增强
### 3. 文档维护
- ✅ 更新优化文档
- ✅ 记录最佳实践
- ✅ 分享优化经验
---
**主题全面优化分析完成!** 🎉
**核心优化已实施,性能提升50%!**
@@ -0,0 +1,201 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 14-JS优化最终方案
**创建日期:** 2026-06-03
**版本:** v2.0
**状态:** ✅ 已实施
**优化效果:** 首页JS减少56%,文章页JS减少44%
---
## 📋 方案概述
### 优化目标
将JS拆分为多个bundle,实现按需加载,提升性能。
### 优化效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页JS** | 800KB | 350KB | ⚡ -56% |
| **文章页JS** | 800KB | 450KB | ⚡ -44% |
| **TTI** | 4.0s | ~2.0s | ⚡ -50% |
| **TBT** | 350ms | ~100ms | ⚡ -71% |
---
## 🔧 技术实现
### JS Bundle拆分
**1. core.js (200KB) - 始终加载**
- UIkit框架
- 图标字体
- 图片灯箱
- 工具函数
- 搜索功能
- 浮动工具
- 进度条
- PJAX
- 主题主逻辑
**2. page-only.js (180KB) - 文章详情页**
- Artalk评论系统
- 段落评论
- 打赏功能
**3. deferred.js (25KB) - 延迟加载**
- Toast消息
- 图片懒加载
**4. infinite-scroll.js (20KB) - 首页(如果启用)**
**5. tiaozhuan.js (8KB) - 特定页面**
---
## 🛠️ 实施步骤
### 步骤1:修改footer.html
**文件:** `themes/Ying/layouts/partials/footer.html`
**修改内容:**
- 创建核心JS bundle
- 创建页面特定JS bundle
- 创建延迟加载JS bundle
- 首页专用JS
- 特定页面专用JS
---
### 步骤2:适配PJAX
**文件:** `themes/Ying/assets/js/modules/mypjax.js`
**修改内容:**
- 在pjax:complete事件中添加动态加载逻辑
- 检测当前页面是否为文章详情页
- 动态加载page-only.js
- 初始化Artalk等功能
---
## 📊 加载时序
### 优化前
```
页面加载
↓
下载bundle.js (800KB)
↓
执行所有JS
↓
渲染页面
↓
用户可以交互
```
---
### 优化后
```
页面加载
↓
下载core.js (200KB) - 立即
↓
渲染页面(核心功能可用)
↓
用户可以交互
↓
下载page-only.js (180KB) - 按需(仅文章页)
↓
下载deferred.js (25KB) - 延迟(浏览器空闲)
↓
所有功能可用
```
---
## 🧪 测试验证
### 功能测试
- [ ] 首页功能正常
- [ ] 文章详情页正常
- [ ] 评论区正常加载
- [ ] 打赏功能正常
- [ ] PJAX导航正常
- [ ] 无限滚动正常(如果启用)
### 性能测试
- [ ] Network面板显示JS大小减少
- [ ] Lighthouse得分提升
- [ ] 无Console错误
---
## 🔄 回滚方案
### 如果优化后出现严重问题
```bash
# 恢复footer.html
git checkout themes/Ying/layouts/partials/footer.html
# 恢复mypjax.js
git checkout themes/Ying/assets/js/modules/mypjax.js
# 重新构建
hugo --cleanDestinationDir
```
---
## 💡 最佳实践
### 1. 逐步优化
- ✅ 先测试核心功能
- ✅ 逐步添加按需加载
- ✅ 充分测试每个步骤
- ✅ 记录问题和解决方案
### 2. 监控性能
- ✅ 定期Lighthouse测试
- ✅ 监控网络请求
- ✅ 检查Console错误
- ✅ 记录性能数据
---
## 📈 优化效果总结
### 性能提升
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页JS** | 800KB | 350KB | ⚡ -56% |
| **文章页JS** | 800KB | 450KB | ⚡ -44% |
| **TTI** | 4.0s | ~2.0s | ⚡ -50% |
| **TBT** | 350ms | ~100ms | ⚡ -71% |
### 用户体验提升
- 🚀 **首屏更快** - 资源减少56%
- ⚡ **交互更流畅** - TTI提升50%
- 📱 **移动端更好** - 节省带宽
- 🎨 **功能完整** - 所有功能正常
---
**JS优化最终方案完成!** 🎉
**优化效果显著,性能提升56%!**
@@ -0,0 +1,207 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 15-字体优化手动指南
**创建日期:** 2026-06-03
**版本:** v1.0
**适用场景:** 手动执行字体子集化
---
## 📋 手动操作步骤
### 步骤1:备份原始字体(2分钟)
**Windows:**
```bash
cd E:\GitHub\blog
copy themes\Ying\static\font\zql-v2.woff2 themes\Ying\static\font\zql-v2.woff2.backup
copy themes\Ying\static\font\zql-v2.woff themes\Ying\static\font\zql-v2.woff.backup
```
**Mac/Linux:**
```bash
cd E:\GitHub\blog
cp themes/Ying/static/font/zql-v2.woff2 themes/Ying/static/font/zql-v2.woff2.backup
cp themes/Ying/static/font/zql-v2.woff themes/Ying/static/font/zql-v2.woff.backup
```
---
### 步骤2:安装Python依赖(3分钟)
```bash
pip install fonttools brotli
```
**验证安装:**
```bash
python -c "from fontTools.ttLib import TTFont; print('fonttools installed')"
```
---
### 步骤3:构建Hugo站点(2分钟)
```bash
cd E:\GitHub\blog
hugo --destination=public
```
**验证构建:**
```bash
ls public/
```
---
### 步骤4:运行字体子集化(5分钟)
```bash
python scripts/subset-font-safe.py
```
**预期输出:**
```
🔤 字体子集化工具(安全版本)
==================================================
✅ 找到public目录,将扫描构建后的HTML
🔍 扫描目录: content, layouts, public
📝 提取了 2492 个唯一字符
💾 字符列表已保存到: themes/Ying/static/font\used_chars.txt
✂️ 正在生成子集字体...
✅ 子集化完成!
📊 优化结果:
子集字符数: 2485
子集文件大小: 739.7 KB
减少: 486.8 KB (39.7%)
🎉 所有子集字体生成成功!
```
---
### 步骤5:验证生成的文件(1分钟)
**Windows:**
```bash
dir themes\Ying\static\font\zql-v2-subset.*
```
**Mac/Linux:**
```bash
ls -lh themes/Ying/static/font/zql-v2-subset.*
```
**预期大小:**
- `zql-v2-subset.woff2`: ~757KB
- `zql-v2-subset.woff`: ~757KB
---
### 步骤6:更新CSS字体声明(3分钟)
**编辑文件:** `themes/Ying/assets/css/main.css`
**找到第1-14行的字体声明:**
```css
@font-face {
font-family: 'zql';
src: url('../font/zql-v2.woff2') format('woff2'),
url('../font/zql-v2.woff') format('woff');
font-display: swap;
unicode-range: U+0000-007F,
U+4E00-9FFF,
U+2000-206F,
U+3000-303F;
}
```
**替换为:**
```css
@font-face {
font-family: 'zql';
src: url('../font/zql-v2-subset.woff2') format('woff2'),
url('../font/zql-v2-subset.woff') format('woff');
font-display: swap;
}
```
---
### 步骤7:测试验证(5分钟)
**重新构建:**
```bash
hugo --cleanDestinationDir
hugo server -D
```
**访问:** `http://localhost:1313`
**检查清单:**
- [ ] 中文字符正常
- [ ] 英文字符正常
- [ ] 深色模式正常
- [ ] Network面板显示字体大小 ~757KB
---
### 步骤8:提交代码(2分钟)
```bash
git add themes/Ying/assets/css/main.css
git add themes/Ying/static/font/zql-v2-subset.*
git commit -m "perf: 字体子集化优化 - 减少37%"
git push origin main
```
---
## 🐛 故障排除
### 问题1:字符显示为方块
**解决方案:** 重新运行子集化脚本
### 问题2:字体文件404
**解决方案:** 检查CSS路径,清理Hugo缓存
### 问题3:Python脚本运行失败
**解决方案:** 检查Python版本和依赖
---
## 🔄 回滚方案
```bash
# 恢复原始字体
cp themes/Ying/static/font/zql-v2.woff2.backup themes/Ying/static/font/zql-v2.woff2
cp themes/Ying/static/font/zql-v2.woff.backup themes/Ying/static/font/zql-v2.woff
# 恢复CSS
git checkout themes/Ying/assets/css/main.css
```
---
## 📊 操作时间
- 步骤1:备份字体 - 2分钟
- 步骤2:安装依赖 - 3分钟
- 步骤3:构建Hugo - 2分钟
- 步骤4:运行子集化 - 5分钟
- 步骤5:验证文件 - 1分钟
- 步骤6:更新CSS - 3分钟
- 步骤7:测试验证 - 5分钟
- 步骤8:提交代码 - 2分钟
**总计:约23分钟**
---
**字体优化手动指南完成!** 🎉
**按照步骤操作即可完成字体优化!**
@@ -0,0 +1,316 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 16-实施总结报告
**创建日期:** 2026-06-03
**版本:** v1.0
**报告类型:** 性能优化实施总结
**项目状态:** ✅ 已完成
---
## 📋 项目概述
### 项目目标
对Hugo主题Ying进行全面性能优化,包括:
1. JS按需加载优化
2. 字体子集化优化
3. GitHub Actions自动化
### 优化效果
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **总体资源** | ~3MB | ~1.5MB | ⚡ -50% |
| **加载速度** | 慢 | 快 | ⚡ +40% |
| **Lighthouse** | 60 | 75-80 | ⚡ +33% |
---
## ✅ 已完成的工作
### 1. JS按需加载优化(第1步)
**完成时间:** 2026-06-03
**实施耗时:** 约2小时
**优化效果:**
- 首页JS:800KB → 350KB(⚡ -56%)
- 文章页JS:800KB → 450KB(⚡ -44%)
**主要工作:**
- ✅ JS代码拆分为4个bundle
- ✅ 核心JS始终加载(~200KB)
- ✅ 页面特定JS按需加载(~180KB)
- ✅ 非关键JS延迟加载(~25KB)
- ✅ PJAX完美适配
**修改文件:**
- `themes/Ying/layouts/partials/footer.html`
- `themes/Ying/assets/js/modules/mypjax.js`
---
### 2. 字体子集化优化(第2步)
**完成时间:** 2026-06-03
**实施耗时:** 约1.5小时
**优化效果:**
- 字体大小:1.2MB → 757KB(⚡ -37%)
**主要工作:**
- ✅ 使用Python fonttools提取字符
- ✅ 生成子集字体(2,485个字符)
- ✅ 更新CSS字体声明
- ✅ 保持所有字符正常显示
**修改文件:**
- `themes/Ying/assets/css/main.css`
- `themes/Ying/static/font/zql-v2-subset.woff2`
- `themes/Ying/static/font/zql-v2-subset.woff`
- `themes/Ying/static/font/used_chars.txt`
---
### 3. GitHub Actions自动化(第3步)
**完成时间:** 2026-06-03
**实施耗时:** 约1小时
**自动化程度:** 100%
**主要工作:**
- ✅ 创建字体子集化工作流
- ✅ 配置自动触发条件
- ✅ 与deploy.yml完美协调
- ✅ 智能检测变更
- ✅ 自动部署到UpYun
**创建文件:**
- `.github/workflows/subset-fonts.yml`
- `requirements.txt`
---
## 📊 技术实现
### JS优化策略
```
core.js (200KB) - 始终加载
├── UIkit
├── 图标字体
├── 图片灯箱
├── 工具函数
├── 搜索功能
├── 浮动工具
├── 进度条
├── PJAX
└── 主题主逻辑
page-only.js (180KB) - 文章详情页
├── Artalk评论
├── 段落评论
└── 打赏功能
deferred.js (25KB) - 延迟加载
├── Toast消息
└── 图片懒加载
infinite-scroll.js (20KB) - 首页(如果启用)
tiaozhuan.js (8KB) - 特定页面
```
---
### 字体优化策略
```
原始字体(1.2MB)
├── 20,000+ 字符
└── 完整中文字符集
子集字体(757KB)
├── 2,485 个字符
├── 常用中文字符
├── 英文字母和数字
├── 常用标点符号
└── 特殊符号
优化效果:-37%
```
---
### 自动化流程
```
用户push内容更新
↓
deploy.yml(部署文章)
↓
subset-fonts.yml(优化字体)
↓
deploy.yml(部署新字体)
↓
✅ 完成!
```
---
## 🎯 项目亮点
### 1. 性能显著提升
- ✅ 资源减少50%
- ✅ 加载速度提升40%
- ✅ Lighthouse 75-80分
- ✅ 用户体验大幅改善
### 2. 完全自动化
- ✅ GitHub Actions自动运行
- ✅ 智能检测变更
- ✅ 无需手动干预
- ✅ 节省时间和精力
### 3. 智能优化
- ✅ 只在需要时优化
- ✅ 避免不必要的部署
- ✅ 节省资源和成本
- ✅ 保持系统高效
### 4. 完整文档
- ✅ 16份详细文档
- ✅ 覆盖所有场景
- ✅ 故障排除指南
- ✅ 最佳实践说明
---
## 📁 文档清单
### 核心文档(3份)
- ✅ 01-项目完成总结.md
- ✅ 02-方案1完成总结.md
- ✅ 03-三步优化完整指南.md
### 优化实施(4份)
- ✅ 04-JS按需加载优化.md
- ✅ 05-PJAX适配说明.md
- ✅ 06-PJAX修复总结.md
- ✅ 07-字体子集化优化.md
### 自动化(3份)
- ✅ 08-GitHub-Actions使用指南.md
- ✅ 09-Actions修复指南.md
- ✅ 10-提交指南.md
### 测试验证(2份)
- ✅ 11-JS优化测试指南.md
- ✅ 12-字体优化测试指南.md
### 详细方案(4份)
- ✅ 13-主题全面优化分析.md
- ✅ 14-JS优化最终方案.md
- ✅ 15-字体优化手动指南.md
- ✅ 16-实施总结报告.md(本文件)
---
## 💡 后续使用
### 日常开发
```bash
# 发布新文章
git add content/posts/new-article.md
git commit -m "feat: new article"
git push origin main
# 等待自动化(3-10分钟)
# - deploy.yml:部署文章
# - subset-fonts.yml:优化字体(如果需要)
# - deploy.yml:部署新字体(如果需要)
```
### 监控系统
```bash
# 查看GitHub Actions
https://github.com/zqlit/blog/actions
# 查看工作流状态
- Deploy to Production(部署)
- Font Subset Optimization(字体优化)
```
### 性能测试
```bash
# 每月测试一次
# 使用Chrome DevTools的Lighthouse
# 或者:https://pagespeed.web.dev/
# 记录:Performance、FCP、LCP、TTI
```
---
## 🎓 学到了什么?
### 技术技能
- ✅ JavaScript代码拆分
- ✅ 字体子集化技术
- ✅ GitHub Actions工作流
- ✅ Hugo静态站点优化
### DevOps实践
- ✅ CI/CD流程设计
- ✅ 自动化部署
- ✅ 工作流协调
- ✅ 性能监控
---
## 🏆 成就解锁
- ⚡ **性能优化大师** - 资源减少50%
- 🤖 **自动化专家** - 完整CI/CD流程
- 🚀 **前端优化师** - Lighthouse 75-80分
- 💡 **DevOps工程师** - GitHub Actions精通
---
## 🎊 项目完成
**恭喜你完成了完整的Hugo博客性能优化和自动化系统!**
- ✅ 性能提升50%
- ✅ 加载速度提升40%
- ✅ Lighthouse 75-80分
- ✅ 完全自动化
- ✅ 生产就绪
**现在可以专注于创作优质内容了!** 🚀
---
**项目完成时间:** 2026-06-03
**总耗时:** 约4.5小时
**优化效果:** 性能提升50%
**自动化程度:** 100%
**维护成本:** 0(完全自动化)
**祝你博客越办越好!** 🎉
---
**实施总结报告完成!** 🎉
**所有16份文档已创建!**
@@ -0,0 +1,405 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# Ying主题 Markdown 表格样式使用指南
**创建日期:** 2026-06-03
**版本:** v2.0(重新设计)
**状态:** ✅ 已实现
---
## 📋 表格样式概述
### 设计理念
**完全符合Ying主题风格:**
- ✅ **圆角12px** - 与blockquote一致
- ✅ **毛玻璃效果** - 与.main容器一致
- ✅ **柔和阴影** - 层次丰富不突兀
- ✅ **透明边框** - rgba颜色更自然
- ✅ **深色模式** - 柔和的rgba过渡
- ✅ **斑马条纹** - 提升可读性
- ✅ **悬停效果** - 交互友好
- ✅ **响应式设计** - 移动端自动横向滚动
- ✅ **多种变体** - 紧凑型、无边框、高亮
### 设计参考
**参考元素:**
- blockquote(圆角、阴影、边框风格)
- .main容器(毛玻璃效果)
- 代码块(背景、边框风格)
---
## 🎨 浅色模式设计
### 配色方案
| 元素 | 颜色 | 说明 |
|------|------|------|
| **表格背景** | `rgba(255, 255, 255, 0.95)` | 毛玻璃效果 |
| **表格边框** | `rgba(0, 0, 0, 0.08)` | 透明柔和 |
| **表格阴影** | `0 8px 24px rgba(0, 0, 0, 0.06)` | 层次丰富 |
| **表头背景** | 渐变 `rgba(0,0,0,0.03)` → `rgba(0,0,0,0.01)` | 微妙渐变 |
| **表头文字** | `rgba(30, 30, 30, 0.92)` | 深灰,可读性强 |
| **表头边框** | `rgba(0, 0, 0, 0.1)` | 底部2px |
| **单元格背景** | 白色 / `rgba(0,0,0,0.015)` | 斑马纹 |
| **单元格文字** | `rgba(30, 30, 30, 0.85)` | 中灰 |
| **单元格边框** | `rgba(0, 0, 0, 0.05)` | 浅灰底边 |
| **悬停背景** | `rgba(0, 0, 0, 0.04)` | 柔和高亮 |
| **链接颜色** | 使用主题链接色 | 与正文一致 |
| **代码背景** | `rgba(0, 0, 0, 0.04)` | 浅灰 |
| **代码文字** | `rgba(30, 30, 30, 0.9)` | 深灰 |
### 设计特点
- ✅ **圆角12px** - 与blockquote完全一致
- ✅ **毛玻璃** - `backdrop-filter: blur(8px)`
- ✅ **透明边框** - 使用rgba而不是实色
- ✅ **柔和阴影** - 避免突兀感
---
## 🌙 深色模式设计
### 配色方案
| 元素 | 颜色 | 说明 |
|------|------|------|
| **表格背景** | `rgba(15, 23, 42, 0.95)` | 深蓝毛玻璃 |
| **表格边框** | `rgba(148, 163, 184, 0.18)` | 透明灰边框 |
| **表格阴影** | `0 10px 28px rgba(0, 0, 0, 0.22)` | 更深的阴影 |
| **表头背景** | 渐变 `rgba(30,41,59,0.92)` → `rgba(15,23,42,0.78)` | 深蓝渐变 |
| **表头文字** | `rgba(226, 232, 240, 0.96)` | 浅灰白 |
| **表头边框** | `rgba(148, 163, 184, 0.2)` | 深灰底边 |
| **单元格背景** | 深蓝 / `rgba(30,41,59,0.5)` | 深色斑马纹 |
| **单元格文字** | `rgba(226, 232, 240, 0.9)` | 浅灰 |
| **单元格边框** | `rgba(148, 163, 184, 0.1)` | 深灰底边 |
| **悬停背景** | `rgba(30, 41, 59, 0.8)` | 柔和高亮 |
| **链接颜色** | 使用主题深色链接色 | 与正文一致 |
| **代码背景** | `rgba(148, 163, 184, 0.15)` | 深灰 |
| **代码文字** | `rgba(226, 232, 240, 0.95)` | 浅灰白 |
### 设计特点
- ✅ **柔和过渡** - 使用rgba透明度
- ✅ **避免纯黑** - 深蓝灰更舒适
- ✅ **层次分明** - 半透明边框和阴影
- ✅ **护眼设计** - 减少对比度
---
## 🎯 与主题一致性
### 对比其他元素
| 元素 | 圆角 | 边框 | 阴影 | 背景 |
|------|------|------|------|------|
| **blockquote** | 12px | rgba透明 | 柔和 | 渐变 |
| **.main容器** | 8px | rgba透明 | 层次丰富 | 毛玻璃 |
| **表格** | **12px** | **rgba透明** | **柔和** | **毛玻璃** ✅ |
| **代码块** | 6px | rgba透明 | 无 | 浅灰 |
**表格风格与blockquote高度一致!** ✅
---
## 📱 响应式设计
### 移动端优化(<768px)
**自动处理:**
- ✅ 表格自动横向滚动
- ✅ 第一列固定(sticky定位)
- ✅ 减小内边距(12px → 10px)
- ✅ 减小字体(0.85em)
- ✅ 圆角调整(8px)
- ✅ 触摸友好
**效果:**
- ✅ 在小屏幕完整查看表格
- ✅ 第一列始终可见
- ✅ 流畅滚动体验
- ✅ 性能优化
---
## 🎨 表格变体
### 1. 紧凑型表格(.compact)
**适用场景:** 数据密集型,需要节省空间
**Markdown语法:**
```markdown
| 列1 | 列2 | 列3 | {.compact}
|-----|-----|-----|---------
| 数据 | 数据 | 数据 |
```
**CSS类:** `table.compact`
**效果:**
- ✅ 更小的内边距(10px vs 14px)
- ✅ 更小的字体(0.9em)
- ✅ 保持主题风格
---
### 2. 无边框表格(.borderless)
**适用场景:** 简洁风格,不需要明显边框
**Markdown语法:**
```markdown
| 列1 | 列2 | 列3 | {.borderless}
|-----|-----|-----|-------------
| 数据 | 数据 | 数据 |
```
**CSS类:** `table.borderless`
**效果:**
- ✅ 无外边框
- ✅ 无阴影
- ✅ 透明背景
- ✅ 仅有底部分隔线
- ✅ 更加简洁
---
### 3. 高亮表格(.highlight)
**适用场景:** 需要突出的重要表格
**Markdown语法:**
```markdown
| 列1 | 列2 | 列3 | {.highlight}
|-----|-----|-----|------------
| 数据 | 数据 | 数据 |
```
**CSS类:** `table.highlight`
**效果:**
- ✅ 左侧4px边框(浅色:黑色60%透明,深色:灰色70%透明)
- ✅ 更明显的表头背景
- ✅ 更突出的表头边框
- ✅ 引起注意
---
## 📝 使用示例
### 示例1:基础表格
```markdown
| 姓名 | 年龄 | 职业 |
|------|------|------|
| 张三 | 25 | 工程师 |
| 李四 | 30 | 设计师 |
| 王五 | 28 | 产品经理 |
```
**效果:**
- ✅ 圆角12px卡片
- ✅ 毛玻璃背景
- ✅ 斑马条纹
- ✅ 悬停高亮
---
### 示例2:包含代码和链接
```markdown
| 工具 | 版本 | 用途 |
|------|------|------|
| Node.js | `18.0+` | JavaScript运行环境 |
| [Hugo](https://gohugo.io) | `0.128.2` | 静态站点生成器 |
| Git | `2.30+` | 版本控制 |
```
**效果:**
- ✅ 代码块样式(圆角6px,浅灰背景)
- ✅ 链接样式(虚线下划线,悬停变实线)
- ✅ 与主题链接风格一致
---
### 示例3:古风官职表格
```markdown
| 品级 | 官职 | 俸禄 | 说明 |
|------|------|------|------|
| 正一品 | 太师 | 2000 | 最高官职 |
| 从一品 | 太尉 | 1400 | 军事长官 |
| 正二品 | 参知政事 | 1050 | 副宰相 |
| 从二品 | 节度使 | 800 | 地方军政长官 |
| 正三品 | 御史中丞 | 600 | 监察官员 |
| 从三品 | 秘书监 | 480 | 文书管理 |
| 正四品 | 谏议大夫 | 380 | 谏官 |
| 从四品 | 侍读学士 | 300 | 皇帝顾问 |
| 正五品 | 给事中 | 240 | 审查奏章 |
| 从五品 | 知州 | 190 | 地方长官 |
| 正六品 | 侍御史 | 150 | 监察官员 |
| 从六品 | 通判 | 115 | 副地方长官 |
| 正七品 | 知县 | 85 | 县级长官 |
| 从七品 | 殿中侍御史 | 60 | 宫廷监察 |
| 正八品 | 大理评事 | 40 | 司法官员 |
| 从八品 | 录事参军 | 25 | 文书官员 |
| 正九品 | 主簿 | 15 | 县级文书 |
| 从九品 | 司户参军 | 5 | 户籍管理 |
| — | 庶民 | 0 | 普通百姓 |
```
**效果:**
- ✅ 20行数据清晰展示
- ✅ 斑马纹便于阅读
- ✅ 深色模式完美适配
- ✅ 与古风主题协调
---
## 💡 使用技巧
### 1. 对齐方式
```markdown
| 左对齐 | 居中对齐 | 右对齐 |
|:-------|:--------:|-------:|
| 数据 | 数据 | 数据 |
```
**效果:**
- ✅ `:---` 左对齐(默认)
- ✅ `:---:` 居中对齐
- ✅ `---:` 右对齐
---
### 2. 表格内换行
```markdown
| 列1 | 列2 |
|-----|-----|
| 第一行<br>第二行 | 数据 |
```
**效果:**
- ✅ 使用 `<br>` 标签换行
- ✅ 在单元格内显示多行
---
### 3. 代码和链接混合
```markdown
| 工具 | 版本 | 链接 |
|------|------|------|
| Hugo | `0.128.2` | [官网](https://gohugo.io) |
```
**效果:**
- ✅ 代码块特殊样式
- ✅ 链接虚线下划线
- ✅ 悬停效果
---
## 🎨 自定义样式
### 修改圆角
```css
.post-content table {
border-radius: 16px; /* 更大的圆角 */
}
```
### 修改毛玻璃强度
```css
.post-content table {
backdrop-filter: blur(12px); /* 更强的模糊 */
}
```
### 修改阴影
```css
.post-content table {
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.08); /* 更大的阴影 */
}
```
### 修改深色模式透明度
```css
[data-theme="dark"] .post-content table {
background: rgba(15, 23, 42, 0.98); /* 更不透明 */
}
```
---
## ✅ 功能清单
### 基础功能
- [x] 表头样式(微妙渐变)
- [x] 斑马条纹
- [x] 悬停效果
- [x] 圆角12px(与blockquote一致)
- [x] 毛玻璃效果
- [x] 深色模式
### 进阶功能
- [x] 响应式设计
- [x] 移动端横向滚动
- [x] 第一列固定
- [x] 代码块样式
- [x] 链接样式
- [x] 图片样式
### 变体样式
- [x] 紧凑型表格(.compact)
- [x] 无边框表格(.borderless)
- [x] 高亮表格(.highlight)
### 主题一致性
- [x] 与blockquote风格一致
- [x] 与.main容器风格一致
- [x] 使用主题CSS变量
- [x] 深色模式配色协调
---
## 🎉 总结
### 设计优势
1. **完全符合主题** - 与blockquote、.main容器风格统一
2. **视觉舒适** - 毛玻璃、柔和阴影、透明边框
3. **深色模式友好** - rgba颜色、柔和过渡
4. **交互体验好** - 悬停效果、平滑动画
5. **响应式完善** - 移动端优化
6. **易于定制** - CSS变量
### 使用建议
1. **基础表格** - 使用默认样式
2. **数据密集** - 使用紧凑型(.compact)
3. **简洁风格** - 使用无边框(.borderless)
4. **重要表格** - 使用高亮(.highlight)
5. **移动端** - 自动响应式,无需特殊处理
---
**表格样式设计完成!完全符合Ying主题风格!** 🎉
**现在可以在Markdown文章中使用表格了!**
@@ -0,0 +1,200 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../../架构总览.md)。
# 📚 性能优化文档索引
**整理日期:** 2026-06-03
**项目:** Hugo博客性能优化
**优化效果:** 性能提升50%,Lighthouse 75-80分
---
## 📁 文档分类
### 🎯 一、项目总结(3份)
| 序号 | 文档名称 | 创建日期 | 说明 |
|------|---------|---------|------|
| 1 | [01-项目完成总结.md](./01-项目完成总结.md) | 2026-06-03 | 整个项目完成情况总结 |
| 2 | [02-方案1完成总结.md](./02-方案1完成总结.md) | 2026-06-03 | JS和字体优化总结 |
| 3 | [03-三步优化完整指南.md](./03-三步优化完整指南.md) | 2026-06-03 | 三步优化的完整指南 |
---
### 🔧 二、优化实施(4份)
| 序号 | 文档名称 | 创建日期 | 说明 |
|------|---------|---------|------|
| 4 | [04-JS按需加载优化.md](./04-JS按需加载优化.md) | 2026-06-03 | JS代码拆分和按需加载 |
| 5 | [05-PJAX适配说明.md](./05-PJAX适配说明.md) | 2026-06-03 | PJAX导航适配 |
| 6 | [06-PJAX修复总结.md](./06-PJAX修复总结.md) | 2026-06-03 | PJAX修复详情 |
| 7 | [07-字体子集化优化.md](./07-字体子集化优化.md) | 2026-06-03 | 字体优化方案和实施 |
---
### 🤖 三、GitHub Actions自动化(3份)
| 序号 | 文档名称 | 创建日期 | 说明 |
|------|---------|---------|------|
| 8 | [08-GitHub-Actions使用指南.md](./08-GitHub-Actions使用指南.md) | 2026-06-03 | Actions详细使用说明 |
| 9 | [09-Actions修复指南.md](./09-Actions修复指南.md) | 2026-06-03 | 常见问题和修复方法 |
| 10 | [10-提交指南.md](./10-提交指南.md) | 2026-06-03 | Git提交最佳实践 |
---
### 🧪 四、测试验证(2份)
| 序号 | 文档名称 | 创建日期 | 说明 |
|------|---------|---------|------|
| 11 | [11-JS优化测试指南.md](./11-JS优化测试指南.md) | 2026-06-03 | JS优化测试方法 |
| 12 | [12-字体优化测试指南.md](./12-字体优化测试指南.md) | 2026-06-03 | 字体优化测试方法 |
---
### 📋 五、详细方案(4份)
| 序号 | 文档名称 | 创建日期 | 说明 |
|------|---------|---------|------|
| 13 | [13-主题全面优化分析.md](./13-主题全面优化分析.md) | 2026-06-03 | Ying主题优化分析 |
| 14 | [14-JS优化最终方案.md](./14-JS优化最终方案.md) | 2026-06-03 | JS优化详细技术方案 |
| 15 | [15-字体优化手动指南.md](./15-字体优化手动指南.md) | 2026-06-03 | 字体优化手动操作 |
| 16 | [16-实施总结报告.md](./16-实施总结报告.md) | 2026-06-03 | 整体实施情况报告 |
---
## 📊 文档统计
### 按类别统计
| 类别 | 数量 | 说明 |
|------|------|------|
| 项目总结 | 3份 | 整体完成情况 |
| 优化实施 | 4份 | 具体优化方法 |
| 自动化 | 3份 | GitHub Actions |
| 测试验证 | 2份 | 测试方法和结果 |
| 详细方案 | 4份 | 技术细节 |
| **总计** | **16份** | 完整文档体系 |
---
## 🎯 快速查找指南
### 场景1:了解项目整体情况
**推荐阅读顺序:**
1. [01-项目完成总结.md](./01-项目完成总结.md) - 快速了解全貌
2. [03-三步优化完整指南.md](./03-三步优化完整指南.md) - 详细优化内容
---
### 场景2:实施JS优化
**推荐阅读顺序:**
1. [04-JS按需加载优化.md](./04-JS按需加载优化.md) - 了解优化方法
2. [05-PJAX适配说明.md](./05-PJAX适配说明.md) - 适配PJAX
3. [11-JS优化测试指南.md](./11-JS优化测试指南.md) - 测试验证
---
### 场景3:实施字体优化
**推荐阅读顺序:**
1. [07-字体子集化优化.md](./07-字体子集化优化.md) - 了解优化方法
2. [15-字体优化手动指南.md](./15-字体优化手动指南.md) - 手动操作
3. [12-字体优化测试指南.md](./12-字体优化测试指南.md) - 测试验证
---
### 场景4:配置GitHub Actions
**推荐阅读顺序:**
1. [08-GitHub-Actions使用指南.md](./08-GitHub-Actions使用指南.md) - 使用方法
2. [09-Actions修复指南.md](./09-Actions修复指南.md) - 故障排除
3. [10-提交指南.md](./10-提交指南.md) - 提交最佳实践
---
### 场景5:遇到问题需要排查
**推荐阅读顺序:**
1. [09-Actions修复指南.md](./09-Actions修复指南.md) - Actions问题
2. [06-PJAX修复总结.md](./06-PJAX修复总结.md) - PJAX问题
3. [11-JS优化测试指南.md](./11-JS优化测试指南.md) - JS问题
4. [12-字体优化测试指南.md](./12-字体优化测试指南.md) - 字体问题
---
## 📈 优化效果总览
### 性能提升数据
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **JS(首页)** | 800KB | 350KB | ⚡ -56% |
| **JS(文章页)** | 800KB | 450KB | ⚡ -44% |
| **字体** | 1.2MB | 757KB | ⚡ -37% |
| **总体资源(首页)** | ~3MB | ~1.5MB | ⚡ -50% |
| **总体资源(文章页)** | ~3MB | ~1.6MB | ⚡ -47% |
| **Lighthouse** | 60 | 75-80 | ⚡ +25-33% |
---
## 🔄 文档维护
### 定期检查(每季度)
- [ ] 检查文档是否仍然准确
- [ ] 更新过时的信息
- [ ] 添加新的优化经验
- [ ] 整理重复内容
### 文档版本控制
所有文档都包含版本信息和创建日期,便于追踪变更。
---
## 💡 使用建议
### 新手入门
1. 先阅读 [01-项目完成总结.md](./01-项目完成总结.md)
2. 了解整体优化效果
3. 根据需要查阅具体文档
### 技术实施
1. 按照对应类别的文档顺序阅读
2. 先理解原理,再动手实施
3. 遇到问题查看故障排除文档
### 日常维护
1. 无需手动维护(完全自动化)
2. 定期查看GitHub Actions运行状态
3. 每月进行一次性能测试
---
## 📞 获取帮助
### 文档未覆盖的问题
1. 查看GitHub Actions日志
2. 检查Hugo官方文档
3. 搜索相关技术问题
### 需要更新文档
1. 编辑对应的Markdown文件
2. 更新版本号和日期
3. 提交到Git仓库
---
**文档整理完成:** 2026-06-03
**总文档数:** 16份
**覆盖范围:** 完整的优化和自动化体系
**维护状态:** 生产就绪
**祝你使用愉快!** 🎉
@@ -0,0 +1,291 @@
> 📦 **本文档已归档**(2026-10-06)。它记录的是**当时的工作过程与结论**,可能已被后续决策推翻。
> **请勿据此判断当前架构** —— 现行架构唯一事实源是 [`架构总览.md`](../../../架构总览.md)。
# 深色模式表格样式修复指南
## 🔍 问题诊断
**症状:** 深色模式表格样式没有生效
**可能原因:**
1. 浏览器缓存
2. Hugo缓存
3. CSS文件未正确更新
4. 查看的位置不正确
---
## 🚀 完整修复步骤
### 步骤1:确认CSS已更新
**我已经确认CSS文件已更新:**
```
文件:themes/Ying/assets/css/main.css
位置:第723-726行
内容:
[data-theme="dark"] .post-content th {
color: rgba(203, 213, 225, 0.85);
border-bottom-color: rgba(148, 163, 184, 0.15);
}
```
✅ **代码已正确修改**
---
### 步骤2:清理所有缓存
**执行以下命令:**
```bash
cd E:\GitHub\blog
# 1. 清理Hugo构建缓存
hugo --cleanDestinationDir
# 2. 删除public目录(如果存在)
rd /s /q public 2>nul
# 3. 删除Hugo缓存
rd /s /q resources 2>nul
# 4. 重新构建
hugo server -D --noHTTPCache
```
---
### 步骤3:浏览器强制刷新
**Chrome/Edge:**
1. 按 `F12` 打开开发者工具
2. 右键点击刷新按钮
3. 选择 **"清空缓存并硬性重新加载"**
**或者:**
- 按 `Ctrl + Shift + R`
- 或 `Ctrl + F5`
**Firefox:**
- 按 `Ctrl + Shift + R`
---
### 步骤4:禁用浏览器缓存(开发时)
**Chrome DevTools设置:**
1. 按 `F12` 打开开发者工具
2. 切换到 **Network** 面板
3. 勾选 **Disable cache**
4. 保持DevTools打开
5. 刷新页面
---
## 🧪 验证方法
### 方法1:检查CSS加载
**Chrome DevTools:**
1. 按 `F12`
2. 切换到 **Elements** 面板
3. 找到 `<link>` 标签加载CSS
4. 点击CSS链接查看内容
5. 搜索 `post-content th`
6. 确认颜色值是 `rgba(203, 213, 225, 0.85)`
### 方法2:检查元素样式
**Chrome DevTools:**
1. 按 `F12`
2. 点击 **选择元素** 工具(左上角箭头)
3. 点击表格的表头
4. 查看 **Styles** 面板
5. 找到 `color` 属性
6. 确认值
### 方法3:查看源代码
**查看CSS文件:**
```bash
# 在命令行查看
type themes\Ying\assets\css\main.css | findstr "post-content th"
```
**应该看到:**
```css
[data-theme="dark"] .post-content th {
color: rgba(203, 213, 225, 0.85);
border-bottom-color: rgba(148, 163, 184, 0.15);
}
```
---
## 🎨 当前的颜色值
### 深色模式表格配色
| 元素 | 颜色 | 说明 |
|------|------|------|
| **表头文字** | `rgba(203, 213, 225, 0.85)` | 柔和灰白 |
| **单元格文字** | `rgba(203, 213, 225, 0.8)` | 稍暗一点 |
| **表头边框** | `rgba(148, 163, 184, 0.15)` | 透明灰 |
| **单元格边框** | `rgba(148, 163, 184, 0.08)` | 更透明 |
| **表头背景** | 渐变深蓝 | `rgba(30,41,59,0.92)` → `rgba(15,23,42,0.78)` |
| **表格背景** | 深蓝毛玻璃 | `rgba(15, 23, 42, 0.95)` |
---
## 🔧 备用方案
### 如果还是没有变化
**方案A:添加更高优先级的样式**
在CSS文件末尾添加:
```css
/* 强制覆盖深色模式表格样式 */
[data-theme="dark"] .post-content table th {
color: rgba(203, 213, 225, 0.85) !important;
border-bottom-color: rgba(148, 163, 184, 0.15) !important;
}
```
**方案B:使用内联样式测试**
在Markdown文章中使用HTML:
```html
<div data-theme="dark">
<table>
<thead>
<tr>
<th style="color: rgba(203, 213, 225, 0.85);">表头</th>
</tr>
</thead>
</table>
</div>
```
---
## 📋 测试表格
### 创建测试文章
**新建文件:** `content/posts/test-table.md`
```markdown
---
title: "表格样式测试"
date: 2026-06-03
---
## 测试表格
| 项目 | 浅色模式 | 深色模式 | 状态 |
|------|---------|---------|------|
| **表头文字** | 深灰 | 柔和灰白 | 测试中 |
| **单元格文字** | 中灰 | 柔和灰白 | 测试中 |
| **边框** | 浅灰 | 透明灰 | 测试中 |
| **背景** | 白色 | 深蓝毛玻璃 | 测试中 |
### 步骤
1. 访问此页面
2. 点击头像切换深色模式
3. 检查表头文字颜色
```
---
## 🎯 检查清单
### 缓存清理
- [ ] Hugo缓存已清理
- [ ] public目录已删除
- [ ] 浏览器缓存已清理
- [ ] 强制刷新已执行
### CSS验证
- [ ] CSS文件已更新(第723-726行)
- [ ] 颜色值正确:`rgba(203, 213, 225, 0.85)`
- [ ] CSS已正确加载到浏览器
### 功能测试
- [ ] 创建了测试表格
- [ ] 切换到深色模式
- [ ] 表头文字不刺眼
- [ ] 整体视觉舒适
---
## 🔄 进一步调整
### 如果颜色还是太亮
**调整选项1(更柔和):**
```css
color: rgba(180, 190, 205, 0.8)
```
**调整选项2(更透明):**
```css
color: rgba(203, 213, 225, 0.7)
```
**调整选项3(更暗):**
```css
color: rgba(160, 175, 195, 0.85)
```
---
## 💡 常见问题
### Q1:为什么浏览器缓存这么顽固?
**A1:** 现代浏览器会积极缓存CSS/JS文件。开发时建议:
- 始终打开DevTools
- 勾选Disable cache
- 使用强制刷新
### Q2:Hugo缓存在哪里?
**A2:** Hugo缓存位置:
- Windows: `%TEMP%\hugo_cache`
- 或项目目录的 `resources` 文件夹
### Q3:如何确认CSS已加载?
**A3:** 在Chrome DevTools中:
- Elements面板 → 搜索CSS选择器
- 或Network面板 → 查看CSS请求
---
## 🎉 完成确认
### 成功标志
- ✅ 浏览器强制刷新后生效
- ✅ 表头文字为柔和灰白色
- ✅ 不刺眼,视觉舒适
- ✅ 深色模式整体协调
### 如果还是不行
**联系我,我会:**
1. 检查CSS文件完整性
2. 提供内联样式方案
3. 或创建独立的测试文件
---
**文档版本:** v1.0
**创建日期:** 2026-06-03
**适用问题:** 深色模式表格样式未生效