不純喫茶

mojo mojo

改善了博客文章的载入速度

发布于 # Maintenance

这个博客其实是直接套用了一个现成的 Astro 模板。当时只想着把样式和细节调整成自己喜欢的样子,删掉了一些不必要的组件,把自己的文章放上去就算大功告成了,对于底层的逻辑并没有做任何修改。

后来部署到 Vercel 上之后,我确实发现网站有时候打开会比较慢:比如有些 Tab 点了之后半天没反应,需要刷新才行。Vercel 后台 Speed Insights 给出的 Real Experience Score 也比较低(当然,现在这一次改过以后还不算很高🤣)。不过其实我也没太在意,反正就是一个博客「能用就好」,就这么一直放着了。

前几天在 Jules 上开了一个每周定时任务,专门用来改善博客的 Performance。昨天它跑了第一个任务,并给我提了一个 PR

看了一下,主要是替换笨重的日期处理逻辑:把文章排序代码里原本使用的 dayjs 日期处理库,替换成了 JavaScript 原生的 Date.prototype.valueOf() 来进行日期比较。

Jules 这次改的原因是,dayjs 虽然好用,但它是一个比较「重」的对象。如果在排序循环(通常会执行 O(NlogN) 次⬅️别问我我不懂 Big O Notation)里不断去实例化这种重对象,会消耗大量的内存,并且导致系统的垃圾回收(GC)频繁触发,从而造成卡顿。说是测试下来,这个小改动能让数组排序的执行时间加快约 98%!当需要对数百篇 Markdown 格式的文章进行排序时,getPosts() 的返回时间大幅缩短。

当然我没有数百篇文章🤣,只有十几篇,但我合并完之后,现在博客文章的载入速度确实肉眼可见地变快了。

Jules 优化的整个流程也非常顺畅,体验极佳:

  1. Jules 自动修改好代码并发送了一个 PR。
  2. 我收到通知看它搞好了,上去查看 PR 的同时,Vercel 已经自动为这个分支部署了一个 Preview。
  3. 点进 Preview 检查,确认一切正常、没有破坏原有功能,并且加载速度真的变快了之后,就回去直接把 PR 合并掉,然后顺手删掉这个分支。

后续每周的性能优化也让人十分期待。还有很多地方可以改,有些也不是性能啦。比如在点击「上一篇」或「下一篇」加载文章时,整个过程 UI 的表现其实挺 awkward 的。也可以尝试加一下评论组件之类的。