网站速度优化指北
在开始之前,有这么一个网站:https://lynxcatthethird-person.netlify.app/html/loading.html。
这里面引入了五套字体,每套字体 3 个或 9 个字重,共计需要加载 1000~2000 个字体文件。那么,这个网页的速度与性能,会差到什么程度?
由此,我们引出本文的话题:如何优化网站速度?
减少下载资源的数量与大小
此话不必多说,但应如何做到呢?
合并文件
文件的存储与传输都是按照一定的簇(数据包)来执行的。举个例子:有 100 个小文件,大小均为 1KB,簇(数据包)大小为 4KB,则它们的总大小为 400KB,而非 100KB!这无形之中就多了 300KB。而且,更多的文件就意味着更多的连接、请求、下载次数,耗时相当可观。
合并文件的主要方法有:
- 将多个 CSS/JS 合并为一个
可参见网站加载速度优化方案总结 | 山岳库博 - 将 CSS/JS 嵌入至 HTML 中
压缩文件
HTML/JS/Css 文件中的回车、部分空格、注释等仅起提高可读性的作用,却仍占用相当大体积,因此应将其删去。
法一
乐特的 hexo-minify
插件
1 | npm install hexo-minify --save |
在博客目录下 _config.yml
添加如下配置:
1 | ## Hexo-minify Default Config Options |
法二
1 | npm install hexo-html-minifier hexo-clean-css hexo-uglify --save |
在博客目录下 _config.yml
添加如下配置:
1 | uglify: |
减少 CSS/JS 加载数
更多的文件意味着更长的加载用时与渲染用时(RAM 时间与 CPU 时间),因此应慎重引入。
以 Butterfly 主题为例,若您并不必需某些组件(如 abcjs),则应将其关闭。若您并不明确某些功能(如 Layload 与 Service Worker)的利与弊的大小关系,则也不应轻易启用。常见的有:
附加组件
*[附加组件]: abcjs,Mermaid,Katex/MathJax,Aplayer,美化插件(Firework 等)
这些东西并非必需,不应以多多益善为由开启。
1 | aplayerInject: |
(其余略去,请自行判断)
预加载
在双方网速足够快时,开启它作用并似乎不明显。但对于部署于 Github Pages 等国外平台,或带宽较低的情况,建议开启。
1 | instantpage: true |
懒加载
在图床速度足够快、图片足够优秀时,开启它作用并不明显,反而可能阻塞某些资源的加载(让它们卡在 “等待中”)。并且,懒加载会频繁的取消与发起资源的加载,拉长时间。
*[足够优秀]: 指体积与品质符合网页加载需求
1 | lazyload: |
字体
字体文件往往体积巨大,渲染起来又费时费力,不应过多引入。
启用 ServiceWorker
部分服务器是没有缓存功能的,这意味着每次访问都需要从服务器下载资源,既浪费流量,又拉长加载时间,而 ServiceWorker 就解决了这一难题。ServiceWorker 可以对缓存进行合理调度,减少内容的下载量,对于速度提升十分明显。


具体部署过程此处不多讲,请参见《小白也能用的 SW 构建插件》 | 山岳库博。
保证资源加载畅通
在引用资源前,应确保来源稳定可靠。若其速度不稳定或服务时好时坏,可能会导致卡加载动画或卡白屏。
应对资源和服务进行维护、监控或选择可靠的来源,引入前应进行多地 Ping/HTTP 测试,确保多地访问通畅。
若确因资金、政策、网络环境等原因不能保证服务时时可用,可用 CDN 竞速、资源镜像或 IP 属地判断等技术缓解。具体按可以参见《小白也能用的 SW 构建插件》 | 山岳库博。
停用加载动画与入场动画
很多朋友为了网页美观性往往会添加加载动画,但正如前面所说,只要有一条资源有问题,就会阻塞整个加载动画,致使网页迟迟显示不出有效内容。纵使是非全屏式动画(pace_css),也仿佛在提示用户 “嘿!我还没加载完呢!” 十分影响观念,建议关闭。
1 | preloader: |
在渲染负载较重的情况下(如引用了很多字体与大图),入场动画会抢占渲染其它内容所需的 CPU 与 GPU,影响渲染初期的效率,在某些低端设备或 GPU 有问题的设备上可能会引起卡顿,建议关闭。但对于页面较为轻量的情况,开启它反而可以隐藏加载时的闪烁,提高美观性。
1 | enter_transitions: false |
使用合适的 CDN
打个比方,假如您在上海,收快递时,快递从苏州还是美国发过来快?显然是苏州!CDN 也同理。市面上常用的公益 CDN(JSDelivr, UnPKG,CDNJS)等多没有大陆节点,使用此类 CDN, 数据包往往要漂洋过海从美国发过来,速度堪忧。
以 Butterfly 为例,可在配置中将 CDN 来源设为 custom 以使用国内 CDN(如 Staticfile):
1 | CDN: |
若国内源无法包含所有所需文件,还可以给某资源设定单独链接。例如:
1 | CDN: |
若您的站点面向全球用户,则可选择 CDN 竞选、并发请求,IP 筛选等策略。具体按可以参见《小白也能用的 SW 构建插件》 | 山岳库博。
优化图片
图片作为媒体的重头戏,在网页上不可或缺。随着图片体积的增大,图片所带来的负担也不容小觑。优化图片的要做的是减小体积,其方法有:
- 手动降低分辨率、位深、色彩精度之类
- 使用工具进行无损或低损压缩
参见:Butterfly 安裝文檔 (六) 進階教程 | Butterfly - 将 PNG,JPG 等格式转为 WeBP 或 Avif 格式
此类图片发布日期较新,有许多新技术以及新特征(比如在保证质量不太差的前提下,最大程度压缩体积),利于网页使用 - 将 Gif 换用 APNG 或 MP4
Gif 不仅体积巨大,质量差,渲染还十分费力,不如直接用视频