发现问题
在对 Tzu-Wei Space 进行了一些功能迭代后,发现首页的加载速度变得非常糟糕
从输入网址按下回车后,网站首页有大约 7-8s 的时间都处于加载的状态(浏览器 Tab Favicon 外一直在转圈 )😮💨
工具量化
于是使用 Lighthouse 和 @next/bundle-analyzer 给网站把个脉,测评结果也确实和预料当中的一样拉胯 ...
优化前的报告:
着手优化
在报告中,解决 Reduce unused JavaScript 一项预计可以节省 1.57s
为了实现优化,采取了以下方法:
- 对于出现频率极低的
Mathjax,使用预先渲染好的Latex图片进行替代。这样可以避免每次加载页面时都需要解析和渲染Mathjax,从而减少了页面的加载时间和资源消耗 - 使用
next/dynamic动态加载组件的方式,避免了单一的js文件过大。通过按需加载组件,可以将组件的加载延迟到页面需要时再进行,从而提高了页面的加载速度和性能 - 对于体积特别大的第三方库,例如
osmd和mermaid,采用了next/script在页面需要相应功能时进行注入,而不是将它们打包到项目的主要js文件中。这样做的好处是避免了将大型库打包到初始加载的文件中,减小了初始加载的文件大小,提高了页面的加载速度 - 使用
contentlayer替代react-markdown和react-syntax-highlighter,把在客户端中对Markdown的渲染转移到了Node.js环境中。这种转移可以在构建过程中完成,减轻了客户端的工作量,从而提高了页面渲染的速度和性能
优化结果
经历了上述的优化后,成功将 client 打包体积从原来的 4.24MB 减少到 657.29 KB,实现了约 84.50% 的缩减 🚀
此外,还取得了以下优化成果:
LCP:从原来的2.9s降低至1.3sTBT:从原来的480ms降低至0ms,即实现了无阻塞加载Speed Index:从原来的2.4s降低至1.1s,访问者能够更快地看到页面内容的加载
优化后的报告: