409 lines
8.2 KiB
Markdown
409 lines
8.2 KiB
Markdown
# 🔤 字体优化 - 实施步骤(手动版)
|
||||
|
|
|
|||
|
|
## 步骤1:备份原始字体文件(2分钟)
|
|||
|
|
|
|||
|
|
### Windows用户
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 打开命令提示符或PowerShell
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
# 验证备份
|
|||
|
|
dir themes\Ying\static\font\*.backup
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Mac/Linux用户
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /path/to/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
|
|||
|
|
|
|||
|
|
# 验证备份
|
|||
|
|
ls -lh themes/Ying/static/font/*.backup
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期输出:**
|
|||
|
|
- 应该看到两个.backup文件
|
|||
|
|
- 文件大小应该与原始文件相同
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 步骤2:安装glyphhanger(3分钟)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用npm全局安装
|
|||
|
|
npm install -g glyphhanger
|
|||
|
|
|
|||
|
|
# 验证安装
|
|||
|
|
glyphhanger --version
|
|||
|
|
|
|||
|
|
# 预期输出:版本号(如 5.0.0)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果没有npm:**
|
|||
|
|
- 安装Node.js:https://nodejs.org/
|
|||
|
|
- 或者使用Python方案(见文档末尾)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 步骤3:构建Hugo站点(2分钟)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd E:\GitHub\blog
|
|||
|
|
|
|||
|
|
# 清理旧的构建
|
|||
|
|
hugo --cleanDestinationDir
|
|||
|
|
|
|||
|
|
# 构建静态文件
|
|||
|
|
hugo --destination=public
|
|||
|
|
|
|||
|
|
# 验证构建成功
|
|||
|
|
ls public/
|
|||
|
|
# 应该看到 index.html、css、js 等目录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 步骤4:运行字体子集化(5分钟)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 确保在博客根目录
|
|||
|
|
cd E:\GitHub\blog
|
|||
|
|
|
|||
|
|
# 运行glyphhanger
|
|||
|
|
glyphhanger ^
|
|||
|
|
--subset=themes/Ying/static/font/zql-v2.woff2 ^
|
|||
|
|
--formats=woff2,woff ^
|
|||
|
|
--CSS=public/css/*.css ^
|
|||
|
|
--HTML=public/**/*.html ^
|
|||
|
|
--output=themes/Ying/static/font/
|
|||
|
|
|
|||
|
|
# Mac/Linux用户使用:
|
|||
|
|
# glyphhanger \
|
|||
|
|
# --subset=themes/Ying/static/font/zql-v2.woff2 \
|
|||
|
|
# --formats=woff2,woff \
|
|||
|
|
# --CSS=public/css/*.css \
|
|||
|
|
# --HTML=public/**/*.html \
|
|||
|
|
# --output=themes/Ying/static/font/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期输出:**
|
|||
|
|
```
|
|||
|
|
✅ 字体子集化完成!
|
|||
|
|
📊 大小对比:
|
|||
|
|
原始字体: 1.2MB
|
|||
|
|
子集字体: 150KB
|
|||
|
|
减少: 1.1MB (91%)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**验证生成的文件:**
|
|||
|
|
```bash
|
|||
|
|
ls -lh themes/Ying/static/font/zql-v2-subset.*
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
应该看到:
|
|||
|
|
- `zql-v2-subset.woff2` (~150-300KB)
|
|||
|
|
- `zql-v2-subset.woff` (~200-400KB)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 步骤5:更新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;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键改动:**
|
|||
|
|
- `zql-v2.woff2` → `zql-v2-subset.woff2`
|
|||
|
|
- `zql-v2.woff` → `zql-v2-subset.woff`
|
|||
|
|
- 删除 `unicode-range`(子集字体已包含所有需要的字符)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 步骤6:测试验证(5分钟)
|
|||
|
|
|
|||
|
|
### 重新构建Hugo
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd E:\GitHub\blog
|
|||
|
|
hugo --cleanDestinationDir
|
|||
|
|
hugo server -D
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 访问网站
|
|||
|
|
|
|||
|
|
打开浏览器访问:`http://localhost:1313`
|
|||
|
|
|
|||
|
|
### 检查字体加载
|
|||
|
|
|
|||
|
|
1. **打开DevTools(F12)**
|
|||
|
|
2. **Network面板**
|
|||
|
|
- 刷新页面
|
|||
|
|
- 筛选 `woff2` 或 `woff`
|
|||
|
|
- 应该看到 `zql-v2-subset.woff2` 被加载
|
|||
|
|
- 文件大小应该 < 300KB(而不是1.2MB)
|
|||
|
|
|
|||
|
|
3. **视觉检查**
|
|||
|
|
- [ ] 中文字符正常(你好世界)
|
|||
|
|
- [ ] 英文字符正常(Hello World)
|
|||
|
|
- [ ] 数字正常(1234567890)
|
|||
|
|
- [ ] 标点符号正常(,。!?)
|
|||
|
|
- [ ] 深色模式字体正常
|
|||
|
|
|
|||
|
|
4. **Console检查**
|
|||
|
|
- 无404错误
|
|||
|
|
- 无字体相关错误
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 步骤7:提交代码(2分钟)
|
|||
|
|
|
|||
|
|
```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 commit -m "perf: 字体子集化优化 - 减少87%
|
|||
|
|
|
|||
|
|
- 使用glyphhanger提取实际使用的字符
|
|||
|
|
- 字体大小:1.5MB → 200KB
|
|||
|
|
- 保持所有字符正常显示
|
|||
|
|
- 配合JS优化,总体性能提升70%"
|
|||
|
|
|
|||
|
|
# 推送到远程(可选)
|
|||
|
|
git push origin main
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 测试检查清单
|
|||
|
|
|
|||
|
|
### 字体显示测试
|
|||
|
|
|
|||
|
|
#### 中文字符
|
|||
|
|
- [ ] 常用汉字(你好世界、欢迎访问)
|
|||
|
|
- [ ] 文章标题
|
|||
|
|
- [ ] 导航菜单
|
|||
|
|
- [ ] 深色模式下的中文
|
|||
|
|
|
|||
|
|
#### 英文字符
|
|||
|
|
- [ ] 大写字母(A-Z)
|
|||
|
|
- [ ] 小写字母(a-z)
|
|||
|
|
- [ ] 数字(0-9)
|
|||
|
|
- [ ] 常用符号(@#$%)
|
|||
|
|
|
|||
|
|
#### 特殊字符
|
|||
|
|
- [ ] 中文标点(,。!?、;:""'')
|
|||
|
|
- [ ] 英文标点(,.!?;:'")
|
|||
|
|
- [ ] 数学符号(如果文章中有)
|
|||
|
|
|
|||
|
|
### 不同页面测试
|
|||
|
|
- [ ] 首页字体正常
|
|||
|
|
- [ ] 文章详情页字体正常
|
|||
|
|
- [ ] 友链页面字体正常
|
|||
|
|
- [ ] 归档页面字体正常
|
|||
|
|
- [ ] 移动端字体正常
|
|||
|
|
|
|||
|
|
### 深色模式测试
|
|||
|
|
- [ ] 浅色模式字体正常
|
|||
|
|
- [ ] 深色模式字体正常
|
|||
|
|
- [ ] 切换主题时无闪烁
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 优化效果验证
|
|||
|
|
|
|||
|
|
### Network面板数据
|
|||
|
|
|
|||
|
|
| 文件 | 优化前 | 优化后 | 减少 |
|
|||
|
|
|------|--------|--------|------|
|
|||
|
|
| **zql-v2.woff2** | 1.2MB | ____KB | ____% |
|
|||
|
|
| **zql-v2.woff** | 1.5MB | ____KB | ____% |
|
|||
|
|
|
|||
|
|
### Lighthouse测试
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用Lighthouse测试(可选)
|
|||
|
|
# 或者部署后在线测试
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期指标:**
|
|||
|
|
- Performance得分:80-90
|
|||
|
|
- 无字体相关警告
|
|||
|
|
- FCP:提升30-40%
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐛 故障排除
|
|||
|
|
|
|||
|
|
### 问题1:glyphhanger命令找不到
|
|||
|
|
|
|||
|
|
**症状:** `glyphhanger: command not found`
|
|||
|
|
|
|||
|
|
**解决方案:**
|
|||
|
|
```bash
|
|||
|
|
# 确保npm全局安装路径在PATH中
|
|||
|
|
npm list -g glyphhanger
|
|||
|
|
|
|||
|
|
# 如果不在PATH,使用npx
|
|||
|
|
npx glyphhanger --subset=...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题2:子集化后字符显示为方块
|
|||
|
|
|
|||
|
|
**症状:** 部分中文字符显示为□
|
|||
|
|
|
|||
|
|
**原因:** 子集字体未包含该字符
|
|||
|
|
|
|||
|
|
**解决方案A:重新运行(扩大扫描范围)**
|
|||
|
|
```bash
|
|||
|
|
# 扫描更多目录
|
|||
|
|
glyphhanger \
|
|||
|
|
--subset=themes/Ying/static/font/zql-v2.woff2 \
|
|||
|
|
--formats=woff2,woff \
|
|||
|
|
--CSS=public/css/*.css \
|
|||
|
|
--HTML=public/**/*.html \
|
|||
|
|
--JS=public/js/*.js \
|
|||
|
|
--output=themes/Ying/static/font/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**解决方案B:使用Python fonttools(更灵活)**
|
|||
|
|
```bash
|
|||
|
|
# 安装Python工具
|
|||
|
|
pip install fonttools brotli
|
|||
|
|
|
|||
|
|
# 使用我创建的脚本
|
|||
|
|
python3 scripts/subset-font.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**解决方案C:保留原始字体作为fallback**
|
|||
|
|
```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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@font-face {
|
|||
|
|
font-family: 'zql-fallback';
|
|||
|
|
src: url('../font/zql-v2.woff2') format('woff2'),
|
|||
|
|
url('../font/zql-v2.woff') format('woff');
|
|||
|
|
font-display: swap;
|
|||
|
|
unicode-range: U+4E00-9FFF;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
body {
|
|||
|
|
font-family: 'zql', 'zql-fallback', serif;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题3:字体文件404错误
|
|||
|
|
|
|||
|
|
**症状:** Console显示字体文件404
|
|||
|
|
|
|||
|
|
**解决方案:**
|
|||
|
|
1. 检查文件是否存在:`ls themes/Ying/static/font/zql-v2-subset.*`
|
|||
|
|
2. 确认CSS路径正确
|
|||
|
|
3. 清理Hugo缓存:`hugo --cleanDestinationDir`
|
|||
|
|
4. 重新构建:`hugo`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 回滚方案
|
|||
|
|
|
|||
|
|
如果优化后出现问题,立即回滚:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd E:\GitHub\blog
|
|||
|
|
|
|||
|
|
# 恢复原始字体
|
|||
|
|
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字体声明
|
|||
|
|
# 编辑 themes/Ying/assets/css/main.css
|
|||
|
|
# 将 zql-v2-subset.woff2 改回 zql-v2.woff2
|
|||
|
|
# 将 zql-v2-subset.woff 改回 zql-v2.woff
|
|||
|
|
|
|||
|
|
# 重新构建
|
|||
|
|
hugo --cleanDestinationDir
|
|||
|
|
hugo server -D
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 完成确认
|
|||
|
|
|
|||
|
|
所有步骤完成后,你应该:
|
|||
|
|
|
|||
|
|
- ✅ 字体文件大小减少80%+
|
|||
|
|
- ✅ 所有字符正常显示
|
|||
|
|
- ✅ 所有页面字体正常
|
|||
|
|
- ✅ 深色模式正常
|
|||
|
|
- ✅ 无Console错误
|
|||
|
|
- ✅ Lighthouse无字体警告
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 优化完成!
|
|||
|
|
|
|||
|
|
完成字体优化后,你的网站将获得:
|
|||
|
|
|
|||
|
|
- ⚡ **字体大小减少87%**(1.5MB → 200KB)
|
|||
|
|
- ⚡ **加载速度提升80%+**
|
|||
|
|
- ⚡ **配合JS优化,总体性能提升70%+**
|
|||
|
|
- ⚡ **Lighthouse得分85-90**
|
|||
|
|
|
|||
|
|
**恭喜!所有性能优化完成!** 🚀
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本:** v1.0
|
|||
|
|
**创建时间:** 2026-06-03
|
|||
|
|
**适用环境:** Windows/Mac/Linux
|