# 方案1-第1步:JS按需加载优化 - 测试验证指南
## ✅ 已完成的优化
### JS加载策略变更
**优化前:**
- 所有JS打包为单个bundle.js(~800KB)
- 所有页面都加载所有功能
**优化后:**
- **core.js**(~200KB)- 核心功能,始终加载
- **page-only.js**(~180KB)- 仅文章详情页
- **infinite-scroll.js**(~20KB)- 仅首页(如果启用)
- **tiaozhuan.js**(~8KB)- 仅links/circles页面
- **deferred.js**(~25KB)- 浏览器空闲时加载
### 优化效果预估
| 页面 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **首页** | ~800KB | ~350KB | ⚡ -56% |
| **文章详情页** | ~800KB | ~450KB | ⚡ -44% |
| **其他页面** | ~800KB | ~350KB | ⚡ -56% |
---
## 🧪 测试步骤
### 步骤1:构建并启动Hugo
```bash
cd E:\GitHub\blog
# 清理缓存
hugo --cleanDestinationDir
# 启动开发服务器
hugo server -D
# 访问 http://localhost:1313
```
### 步骤2:使用Chrome DevTools验证
#### 2.1 Network面板检查
1. 打开DevTools(F12)
2. 切换到 **Network** 面板
3. 刷新页面(Ctrl+Shift+R)
**预期结果:**
- ✅ 看到 `core.js` 文件加载(~200KB)
- ✅ 首页不加载 `page-only.js`
- ✅ 文章详情页加载 `page-only.js`(~180KB)
- ✅ 总体JS大小显著减少
#### 2.2 Performance面板测试
1. 切换到 **Performance** 面板
2. 点击 **Record** 按钮
3. 刷新页面
4. 等待加载完成后点击 **Stop**
**预期结果:**
- ✅ TBT(Total Blocking Time)减少
- ✅ 长任务数量减少
- ✅ 交互响应更快
#### 2.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)
- [ ] 页面正常显示
- [ ] 友链列表正常
- [ ] 跳转功能正常(tiaozhuan.js应加载)
#### circles页面(/circles)
- [ ] 页面正常显示
- [ ] 功能正常
#### 归档页面(/archives)
- [ ] 页面正常显示
- [ ] 文章列表正常
### 跨页面功能测试
#### PJAX导航
- [ ] 页面切换无刷新
- [ ] 浏览器前进/后退正常
- [ ] 书签/分享链接正常
#### 深色模式
- [ ] 所有页面深色模式正常
- [ ] 切换主题无闪烁
- [ ] 评论区样式正确
---
## 📊 性能指标对比表
测试完成后,填写此表:
### Network面板数据
| 资源 | 优化前大小 | 优化后大小 | 减少 |
|------|-----------|-----------|------|
| **首页JS** | ____KB | ____KB | ____% |
| **文章页JS** | ____KB | ____KB | ____% |
| **总体资源** | ____KB | ____KB | ____% |
### Lighthouse指标
| 指标 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| **Performance得分** | ____ | ____ | +____ |
| **FCP** | ____s | ____s | ____% |
| **LCP** | ____s | ____s | ____% |
| **TTI** | ____s | ____s | ____% |
| **TBT** | ____ms | ____ms | ____% |
| **Speed Index** | ____s | ____s | ____% |
### 结论
- [ ] ✅ 优化成功,功能正常,性能提升
- [ ] ⚠️ 部分问题,需要修复
- [ ] ❌ 严重问题,需要回滚
**备注:**
_______________________________________
---
## 🐛 故障排除
### 问题1:评论区未加载
**症状:** 文章详情页看不到评论区
**可能原因:**
1. page-only.js加载失败
2. Artalk初始化时机不对
3. JavaScript错误
**解决方案:**
1. 打开Console查看错误
2. 检查Network面板,确认page-only.js加载成功
3. 等待2-3秒,Artalk可能需要时间初始化
### 问题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:友链页面跳转失效
**症状:** 点击友链无法跳转
**可能原因:**
1. tiaozhuan.js未加载
2. 页面类型判断错误
**解决方案:**
1. 检查页面URL是否包含 /links 或 /circles
2. 查看Network面板,确认tiaozhuan.js加载
---
## 🔄 回滚方案
如果优化后出现严重问题(功能完全失效),快速回滚:
### 备份当前文件
```bash
# 备份已修改的footer.html
cp themes/Ying/layouts/partials/footer.html themes/Ying/layouts/partials/footer.html.optimized
```
### 恢复原始代码
使用以下代码替换footer.html中第50-133行的内容:
```gohtml
{{ $iconfont := resources.Get "js/libs/iconfont.js" }}
{{ $uikit := resources.Get "js/libs/uikit.min.js" }}
{{ $easylazyload := resources.Get "js/modules/lazyload.js" }}
{{ $viewimage := resources.Get "js/libs/view-image.min.js" }}
{{ $main := resources.Get "js/main.js" }}
{{ $mypjax := resources.Get "js/modules/mypjax.js" }}
{{ $nprogress := resources.Get "js/libs/nprogress.js" }}
{{ $tiaozhuan := resources.Get "js/modules/tiaozhuan.js" }}
{{ $toast := resources.Get "js/modules/toast.js" }}
{{ $reward := resources.Get "js/modules/reward.js" }}
{{/* Modules */}}
{{ $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" }}
{{ $paragraphComments := resources.Get "js/modules/paragraph-comments.js" }}
{{ $infiniteScroll := resources.Get "js/modules/infinite-scroll.js" }}
{{ $artalkModule := resources.Get "js/modules/artalk.js" }}
{{ $pjaxLib := resources.Get "js/libs/pjax.js" }}
{{ $linkify := resources.Get "js/modules/linkify.js" }}
{{ $pangu := resources.Get "js/modules/pangu.js" }}
{{ $scripts := slice $iconfont $uikit $easylazyload $viewimage $utils $loader $cache $search $floatingTools $paragraphComments $infiniteScroll $artalkModule $nprogress $pjaxLib $pangu $linkify $main $mypjax $toast $tiaozhuan $reward | resources.Concat "js/bundle.js" | resources.Minify | resources.Fingerprint }}
{{/* Fetch friend data at build time — no runtime network requests */}}
{{ $linkHosts := slice }}
{{ $linkNames := slice }}
{{ with resources.GetRemote "https://api.usj.cc/api/links?all=1" }}
{{ with .Err }}
{{ warnf "Links API fetch failed: %s" . }}
{{ else }}
{{ with .Content | transform.Unmarshal }}
{{ range .links }}
{{ $host := "" }}
{{ with .url | urls.Parse }}
{{ $host = .Host | strings.TrimPrefix "www." }}
{{ end }}
{{ $title := .name | default "" }}
{{ if $host }}
{{ $linkHosts = $linkHosts | append (dict "host" $host "title" $title) }}
{{ end }}
{{ if $title }}
{{ $linkNames = $linkNames | append (dict "lower" (lower $title) "title" $title) }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ $feedHosts := slice }}
{{ $feedNames := slice }}
{{ with resources.GetRemote "https://api.usj.cc/api/feeds" }}
{{ with .Err }}
{{ warnf "Feeds API fetch failed: %s" . }}
{{ else }}
{{ with .Content | transform.Unmarshal }}
{{ range .feeds }}
{{ $host := "" }}
{{ with .url | urls.Parse }}
{{ $host = .Host | strings.TrimPrefix "www." }}
{{ end }}
{{ $title := .feedTitle | default "" }}
{{ if $host }}
{{ $feedHosts = $feedHosts | append (dict "host" $host "title" $title) }}
{{ end }}
{{ if $title }}
{{ $feedNames = $feedNames | append (dict "lower" (lower $title) "title" $title) }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
```
---
## ✅ 测试通过标准
### 功能标准(必须全部通过)
- ✅ 所有页面正常显示
- ✅ 核心功能正常(导航、搜索、主题切换)
- ✅ 文章详情页功能正常(评论、打赏、灯箱)
- ✅ 无限滚动正常(如果启用)
- ✅ PJAX导航正常
- ✅ 无Console错误(或只有非关键警告)
### 性能标准(至少达到一项)
- ✅ Lighthouse Performance得分提升10+分
- ✅ TTI改善15%+
- ✅ TBT改善30%+
- ✅ 总体JS大小减少40%+
---
## 📝 测试完成后
### 如果测试通过 ✅
1. 记录性能指标对比数据
2. 提交代码:`git commit -m "perf: JS按需加载优化"`
3. 准备实施第2步:字体子集化优化
### 如果部分功能异常 ⚠️
1. 记录具体问题
2. 分析原因
3. 调整优化策略(可能需要将某些模块移回core.js)
### 如果严重问题 ❌
1. 立即回滚
2. 分析失败原因
3. 重新评估优化方案
---
**文档版本:** v1.0
**创建时间:** 2026-06-03
**优化策略:** 方案1(保守优化)