Avatar

CaiCai

INITIALIZING SYSTEM

封面

全站性能优化计划

2026-07-16 17:04:41
# bug修复
✨ 心情:平静
👁 次阅读

🚀 XHBlogs 全站性能优化报告

统一策略:前 N eager · 后 lazy · 滑动窗口预加载 · 并发 3


📷 照片墙

100 相册 × 3 图 = 300 张 · 3列 × 2行 = 一屏 6 个

❌ 改前: 全量预加载——前 6 个 eager 后,slice(6) 把剩余 94 个全丢进队列,282 个 new Image()

✅ 改后: 滑动窗口——只预加载接下来 12 个(36 张),其余 lazy。

| 相册 | 策略 |

|------|------|

| 1 ~ 6 | eager 直接显示 |

| 7 ~ 18 | 预加载 36 张(后台 new Image) |

| 19 ~ 100 | lazy 不到不下 |

参数: eager=6 · preload=12 · 并发=3 · rootMargin=800px · 仅改 1 文件


✈️ 旅行

垂直时间线 · 单列 · 一屏 ≈ 3 个卡片 · 每卡 1 封面

❌ 改前: 27 张封面全 eager · 所有卡片全 DOM 绘制 · 0.5s。

✅ 改后: content-visibility 跳过离屏绘制 + 图片分层。

| | 13 | 46 | 7~27 |

|------|:--:|:--:|:--:|

| 封面图 | eager | 预加载 | lazy |

| DOM | 绘制 | 跳过 | content-visibility:auto |

0.5s → 0.3s

参数: eager=3 · preload=3 · content-visibility:auto · 改 3 文件


🎬 动漫

Grid 网格 + 分页 · 每页 10 张海报 · 5 列布局

❌ 改前: 假翻页——100 个卡片全在 DOM,CSS hidden 隐藏,100 张同时下载。

✅ 改后: 真翻页 slice——只渲染当前页 10 张,effect 预加载下一页。

| 第 1 页 | 其余页 |

|------|------|

| eager 10 张立刻看 | 不渲染 · 点"下一页"秒出 |

参数: 真翻页 slice · 预加载下一页 · 仅改 1 文件


💬 杂谈

grid 网格 3 列 · 100 条 · 每条 1 封面 · 视口仅可见 1 行

❌ 改前: columns 瀑布流 + 100 卡片全量渲染 + PageTransition 卡顿。

✅ 改后: columns → grid + 分批渲染 + 图片预加载。

① 布局: columns 先列后行 → grid 先行后列,新卡片只从底部追加,零闪变。

② 分批渲染:

| 时间 | 卡片 |

|------|------|

| 0s | 1 ~ 3(一行) |

| 600ms | 4 ~ 6 |

| 632ms | 7 ~ 9 |

| ... | 每 32ms +3 张 |

| ~1.3s | 全部 100 到位 |

③ 图片:

| 封面 | 策略 |

|------|------|

| 1 ~ 3 | eager |

| 4 ~ 9 | 预加载 |

| 10 ~ 100 | lazy + Observer |

试错记录: content-visibility(columns 不兼容)→ opacity 隐藏(透明元素穿插列中)→ 全量渲染(动画卡)→ grid + 分批 ✅

参数: INITIAL=3 · BATCH=3 · DELAY=600ms · 双 RAF · 仅改 1 文件


⏳ 创作(时间线)

交替 TimelineNode · 单列 · 一屏 ≈ 3 个卡片

❌ 改前: 100 个 TimelineNode 全量绘制 + 全 eager + whileInView × 100。

✅ 改后: 同旅行页方案。

| | 13 | 46 | 7~100 |

|------|:--:|:--:|:--:|

| 封面图 | eager | 预加载 | lazy |

| DOM | 绘制 | content-visibility 跳过 | content-visibility 跳过 |

参数: eager=3 · preload=3 · content-visibility:auto · rootMargin=800px · 改 2 文件


🧪 灵境

炼金术师档案 + 药瓶书架 · 100 篇文章 ≈ 13 层书架 · 每层 8 药瓶 + SVG 动画

❌ 改前:

  • mounted=false → 加载中 → useEffectsetMounted(true) → 内容延迟 0.5s

  • 13 层书架全量渲染 → PageTransition 期间每帧重绘全部 SVG → 掉帧

✅ 改后:

① 去 mounted: useState(false)useState(true),首帧直接渲染,消灭 0.5s 白屏。

② 书架分批:

| 时间 | 书架 |

|------|------|

| 0s | 1 层 |

| 600ms | 3 层 |

| 700ms | 5 层 |

| 800ms | 7 层 |

| ~1.1s | 13 层全部 |

月份切换 → 自动重置为 1 层 → 重新分批

参数: INITIAL=1 · BATCH=2 · DELAY=600ms · 间隔=100ms · 改 2 文件

✅ 同时修复 DijiangModel(帝江号舰船)相同的 mounted 延迟


📊 总结

| 页面 | 核心策略 | 文件 |

|------|---------|:--:|

| 📷 照片墙 | 滑动窗口预加载 | 1 |

| ✈️ 旅行 | content-visibility + eager/lazy | 3 |

| 🎬 动漫 | 真翻页 | 1 |

| 💬 杂谈 | columns→grid + 分批渲染 | 1 |

| ⏳ 创作 | content-visibility + 预加载 | 2 |

| 🧪 灵境 | 删 mounted + 书架分批 | 2 |