闪电加载:Hexo博客性能优化全攻略

news2024/11/17 3:57:57

巴索罗缪·大熊

前言

这些年积累了很多前端性能优化的知识点和思路,日常工作很少涉及技术层极限优化,近期终于一点点把博客独立搭建并部署了,对之前的一些技术点进行了深度探索,最终结果也达到了预期效果,由于水平有限,写的不好的地方,敬请谅解

服务端优化

Nginx 添加压缩模块设置

gzip

Nginx 的 gzip 模块用于对 HTTP 响应进行 gzip 压缩,以减少传输数据量,提高页面加载速度,表示为 Content-Encoding 参数值为 gzip

使用

server 中添加 gzip 模块设置,如下示例中的内容,直接整个复制就能使用

    server {
        listen       443 ssl;
        server_name  yiwuan.xyz;

        ...

        # gzip
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_proxied any;
        gzip_vary on;
    }
参数详解

gzip on; 启用 gzip 压缩

gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 指定要压缩的 MIME 类型

gzip_proxied any; 启用对代理请求的响应进行压缩

gzip_vary on; 在响应头中添加 “Vary: Accept-Encoding”,以便客户端和代理服务器能够缓存不同的压缩版本

gzip 模块的其他参数可以根据需要进行配置,以优化 Nginx 的 gzip 压缩功能

测试结果

添加 gzip 后的 完成 参数需要 3.03 秒

执行 5 次取平均值,最终结果为 3.02 秒

3.31  
3.24
3.03
2.79
2.77
Brotli

Brotli 是一种现代的压缩算法,通常比 gzip 提供更高的压缩率,表示为 Content-Encoding 参数值为 br

Brotli 需要单独手动安装,下面是操作步骤

安装必要依赖
sudo yum install -y epel-release
sudo yum install -y brotli brotli-devel gcc make pcre-devel zlib-devel openssl-devel git
下载 Nginx 源码和 Brotli 模块
wget http://nginx.org/download/nginx-<version>.tar.gz
tar -zxvf nginx-<version>.tar.gz
cd nginx-<version>

git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init
cd ..

注意

<version> 最好是跟本机安装的 nginx 版本保持一致,执行 nginx -v 查询版本号,然后替换 <version> 后执行上面命令

编译 Brotli 动态模块
./configure --with-compat --add-dynamic-module=./ngx_brotli
make modules
将编译好的模块复制到 Nginx 模块目录
sudo cp objs/ngx_http_brotli_filter_module.so /etc/nginx/modules/
sudo cp objs/ngx_http_brotli_static_module.so /etc/nginx/modules/
在 nginx.conf 文件中配置 Brotli 模块
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

http {
    brotli on;
    brotli_comp_level 11;
    brotli_buffers 16 8k;
    brotli_min_length 20;
    brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    brotli_static on;
    # brotli_vary on;
}

注意!

brotli_vary on; 这个参数是老版才有的参数,我查看了Github上的最新版文档,在新版官方似乎把这个参数去掉了

我在服务器上测试发现,如果安装的最新版模块,添加这个 brotli_vary on; 参数会报错,可能网上有些教程中有这个参数,遇到报错把这个参数去掉试试看

重启 Nginx
systemctl restart nginx
验证模块加载

在浏览器 开发者工具 中测试响应头 Content-EnCoding 值也已变成 br, 并且整体资源加载速度明显提升则说明这个模块正确安装并加载了

参数详解

brotli on; 启用 Brotli 压缩

brotli_comp_level 11; Brotli 压缩级别,范围 1-11,数字越大压缩率越高,但CPU使用率也越高

brotli_buffers 16 8k; 设置 Brotli 压缩缓冲区的数量和大小

brotli_min_length 20; 设置允许压缩的页面最小长度,单位是字节。通常设置较小的值以确保小文件也能被压缩

brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript 指定要压缩的 MIME 类型

brotli_static on; 启动对预压缩文件的支持

测试结果

注意!

load_module 加载配置必须要在 Nginx 配置文件的最顶层使用,否则会出现 load_module 指令过晚的错误

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

开启 brotli 和 gzip 压缩两种配置, 执行 5 次取平均值,最终结果为 3.09 秒

3.92
3.11
2.95
2.63
2.84

只开启 brotli 压缩一种配置, 执行 5 次取平均值,最终结果为 3.15 秒

3.64 
2.65 
3.79 
2.76 
2.89

使用 brotli 和 gzip 压缩,以及两种压缩方式混用的方式,这三种情况结果似乎差距不大,可能和目前博客项目的资源体积不大也有关系

开启HTTP3

安装必要依赖
sudo yum install -y gcc gcc-c++ make zlib-devel pcre-devel openssl-devel
下载源码并编译

下载Nginx源代码

wget http://nginx.org/download/nginx-1.26.0.tar.gz
tar -zxvf nginx-1.26.0.tar.gz
cd nginx-1.26.0

下载quiche,下面命令是在 nginx-1.26.0 目录下执行的

quiche库是 Nginx 支持 HTTP/3 所需的库

git clone --recursive https://github.com/cloudflare/quiche

编译 Nginx

./configure --with-http_v3_module --with-cc-opt='-I../quiche/deps/boringssl/include' --with-ld-opt='-L../quiche/deps/boringssl/build/ssl -L../quiche/deps/boringssl/build/crypto' --with-http_ssl_module --with-http_v2_module --with-http_v3_module
make
sudo make install
不同版本HTTP协议的区别
HTTP/1
  • 使用多个串行的 TCP 连接来处理请求和响应

  • 每个请求都需要建立新的连接,存在头部阻塞(Head-of-Line Blocking)问题

  • 不支持请求和响应的多路复用,导致性能较低

HTTP/2
  • 引入了二进制分帧层,允许多个请求和响应在同一个连接上并行传输

  • 支持请求和响应的多路复用,减少了头部开销和提高了性能

  • 使用头部压缩和优先级控制来提高效率

HTTP/3
  • 基于 UDP 协议,使用 QUIC 传输协议

  • 解决了 TCP 连接的慢启动问题,减少了连接建立时间

  • 支持零RTT连接恢复和数据传输,提高了性能和安全性

  • 具有更好的拥塞控制和流量控制机制,适应了现代网络环境

HTTP/3 在性能上相对于 HTTP/2 和 HTTP/1 有更好的表现,主要体现在连接建立速度、并行传输、头部压缩和拥塞控制等方面。因此,推荐在现代网络环境中使用 HTTP/3 来获得更好的性能和用户体验

注意!

HTPP/3 是实验性的


客户端优化

资源优化

移除引入的第三方文件
typeface-source-code-pro

测试发现这个 https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css css 文件用国内网络正常访问有的访问不了,单文件加载失败需要时间高达20s+,移除这个文件后发现样式变化不大,索性直接删掉

fancybox

图片预览器,并且支持各种小功能,这是它的官网 Fancyapps UI - 强大的 JavaScript UI 组件库

文章插图可以通过右键菜单 在新标签页中打开图像 满足个人需求,这个功能有点鸡肋,主要还引入了一个库,也删掉吧

改一下 landscape 主题下的 _config.yml 中的 fancybox 设置为 false,同时删除 source 目录下的 fancybox 相关文件

图片压缩
首页背景图压缩

具体操作方式为把 png 转为 webp 并压缩,由原来的 296KB 压缩成 138KB

底部 police svg 图标压缩

svg 图标从 21KB 压缩到 19KB,效果不大,这种图标其实也可以直接去掉

主页文章展示方式调整

目前博客站点首页是默认展示 10 篇文章,并且文章是自动全部展示的,由于文章首发是掘金,然后再后期手动同步到博客站点平台,文章中的图片资源是掘金外链形式,虽然图片资源服务器用了HTTP2进行了优化,但是资源分析中发现大量的外链图片资源也占用了相当比例的时间加载,如下

设置成文章只显示摘要的形式,在文章的 md 文件头部添加 excerpt 摘要属性

注意!

这是 landscape 主题,其他主题可能是别的参数名,思路都一样

设置好摘要后的展示效果

文章中的图片资源不额外加载了,文字比例看着有点少,再完善一下摘要内容,接下来把所有文章的摘要属性都加上

先测试一下

本地 Edge 浏览器无痕模式,禁用缓存情况下,首次加载 完成 需要 256ms

继续优化请求资源

分析请求资源大小发现 jquery-3.6.4.min.js 文件占用了单独一个请求,并且请求资源体积最大,分析 jquery 文件的使用场景,结合页面功能和代码引入,只有在 script.js 中用了

分析目前页面上用到的功能,只有 script.js 中只有一个分享按钮代码有用,而且效果还不太好,把整个 js 文件不用的功能代码删掉,后面需要什么功能单独加代码

把分享功能先去掉,这个功能没有配置选项,在 article.ejs 中把 footer 标签注释掉就行了,这时候 jquery 引入代码也注释掉

再测试一下

本地无痕模式,禁用缓存情况下,基本秒开了,完成 用时 100ms 左右

发布到云服务器测试一下

https://yiwuan.xyz 线上地址和本地 localhost 测试效果差不多,多次测试,平均用时 100ms 多一点,视觉效果上也是秒开了

测试环境参数

  • 操作系统: Win11家庭版
  • 处理器:12th Gen Intel® Core™ i5-12400 2.50 GHz
  • 机带RAM: 32.0 GB (31.7 GB 可用)
  • 系统类型:64 位操作系统, 基于 x64 的处理器
  • 浏览器:Microsoft Edge 120.0.2210.7 (正式版本) dev (64 位)
  • Nginx:1.26.0
  • Hexo: 7.1.1

小结一下

好了,目前为止博客性能优化基本就差不多了,由于极限压缩资源,删除代码,导致样式现在太丑了,还有一些小功能的莫名其妙不太好使,例如搜索,后面如果时间允许会把整个页面样式优化和功能完善的操作过程完整记录并分享出来

欢迎讨论交流,技术探索和文章整理不易,如果喜欢可以点赞支持一下 ^_^

微信公众号:草帽Lufei

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1712262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【安装笔记-20240528-Linux-在 Vultr 云服务器上安装 OpenWRT】

安装笔记-系列文章目录 安装笔记-20240528-Linux-在 Vultr 云服务器上安装测试 OpenWRT 文章目录 安装笔记-系列文章目录安装笔记-20240528-Linux-在 Vultr 云服务器上安装测试 OpenWRT 前言一、软件介绍名称&#xff1a;OpenWRT主页官方介绍 二、安装步骤测试版本&#xff1a…

【html+css(大作业)】二级菜单导航栏

目录 实现效果 代码及其解释 html部分 CSS部分 hello&#xff0c;hello好久不见&#xff01; 今天我们来写二级导航栏&#xff0c;所谓二级导航栏&#xff0c;简单来说就是鼠标放上去就有菜单拉出&#xff1a; 实现效果 代码及其解释 html部分 <!DOCTYPE html> &l…

白酒:新兴产区的发展与市场前景展望

云仓酒庄豪迈白酒作为新兴产区的重要代表&#xff0c;其发展与市场前景备受关注。随着消费者对白酒品质和口感的不断追求&#xff0c;新兴产区在继承传统酿造工艺的基础上&#xff0c;不断创新和发展&#xff0c;逐渐在市场上崭露头角。 首先&#xff0c;新兴产区在酿造工艺方面…

[源码+搭建教程]西游伏妖篇手游_GM_单机+和朋友玩

为了学习和研究软件内含的设计思想和原理&#xff0c;本人花心血和汗水带来了搭建教程&#xff01;&#xff01;&#xff01; 教程不适于服架设&#xff0c;严禁服架设&#xff01;&#xff01;&#xff01;请牢记&#xff01;&#xff01;&#xff01; 教程仅限学习使用&…

卧式混料机:混合设备的智慧之选

卧式混料机&#xff0c;顾名思义&#xff0c;是一种采用卧式结构的混合设备。它的设计精巧&#xff0c;结构紧凑&#xff0c;不仅占用空间小&#xff0c;而且操作简便&#xff0c;维护方便。与传统的立式混料机相比&#xff0c;卧式混料机在混合效率、混合均匀度以及物料适应性…

Suno进阶手册 | 创作歌曲玩法全攻略!

Suno进阶手册:创作歌曲玩法全攻略! 前言1. 基础模式2. 高级模式总结前言 前段时间,Suno V3 横空出世,与此前的V2相比,V3生成的作品质量明显提升! 该说不说,对比同类型工具,Suno的体验“遥遥领先”,没有AI生成常有的机械感,歌词押韵,甚至还附带有和声、分段。 虽然…

【一步一步了解Java系列】:类与对象的联系

看到这句话的时候证明&#xff1a;此刻你我都在努力加油陌生人个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭 对…

6.1 Go 数组

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【双层模型】分布式光伏储能系统的优化配置方法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序模型参考《分布式光伏储能系统的优化配置方法》&#xff0c;分为上下层求解方式&#xff0c;上层采用粒子群算法确定储能的选址和容量方案&#xff0c;以全年购电成本、网络损耗、光伏运行成本、储能充放…

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了&#xff0c;下面收集了淘宝/京东/拼多多的618红包二维码&#xff0c;手机扫描或识别即可每天领红包&#xff0c;可参考好物分享中的商品下单&#xff1a; 淘宝618超级红包&#xff1a;即日起至2024.6.10&#xff0c;每天可领一次 京东618无门…

idea项目一直在build

IDEA项目一直在build的原因可能包括构建进程堆大小过小、缓存问题、依赖包下载缓慢或网络问题。12 构建进程堆大小过小&#xff1a;如果IDEA的构建进程堆大小设置得不够大&#xff0c;可能会导致构建过程缓慢或卡顿。解决方法是将构建进程堆大小参数扩大&#xff0c;例如将700…

web前端框架设计第十一课-常用插件

web前端框架设计第十一课-常用插件 一.预习笔记 1.路由的基础使用 2.动态路由 3.嵌套路由 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药&#xff0c;犹豫拖延将不断滋养恐惧

再次疾呼:一稿多投是作者的合法权利!

近日&#xff0c;有作者反应在收到拒稿邮件之后另投他刊&#xff0c;竟然被判定一稿多投。 出版社解释说现在大多数期刊都是使用投稿系统收稿&#xff0c;如果被退稿后马上又投稿其他期刊&#xff0c;由于时间距离太近&#xff0c;仍然会被系统判定为一稿多投的。核心期刊编辑…

pikachu—exec“eval“

这是原画面 然后呢&#xff1f; 我们知道会传入到后台rce_eval.php来处理然后通过 eval()是啥? 在eval括号里面可以执行外来机器的命令 然后我们通过php的一个内置的命令 我们通过phpinfo()&#xff1b; 这是输入后的结果

Figma 文件批量导出到本地的方法

作为新一代UX设计师&#xff0c;我们应该熟练地使用市场上的许多设计软件&#xff0c;并更熟悉它们的软件功能。现在市场上的即时设计&#xff0c;作为一种在线合作设计工具&#xff0c;值得成为许多设计师的常用工具。最近&#xff0c;我了解到即时设计进行了新的功能更新&…

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…

【Unity Shader入门精要 第11章】让画面动起来(二)

1. 顶点动画的原理 顶点动画的原理是&#xff0c;在顶点着色器中按照一定的规则或函数计算得到一段偏移量对顶点进行移动&#xff0c;最后将改变位置后的顶点变换到裁剪空间进行后续的渲染工作。 可见&#xff0c;与纹理动画只是改变从纹理中哪一部分开始显示图案不同&#x…

水质预测模型精度评估实例

研究背景 随着水资源管理需求的日益增长&#xff0c;水质预测模型的精准度成为了评估其有效性的关键因素。本文旨在通过实证研究&#xff0c;探讨自建水质预测模型的实际应用效能&#xff0c;通过与真实监测数据的比对&#xff0c;揭示模型预测精度的真实情况。 数据基础情况…

【任务调度】Apache DolphinScheduler中关于全局参数设置、自定义参数、补数的介绍

Apache DolphinScheduler是一个分布式和可扩展的开源工作流协调平台&#xff0c;具有强大的DAG可视化界面。 今天在海豚调度的一个接口中想入参一个当前时间(要求格式为yyyyMMddhhmmss),找了找发现如下几种方法,给记录一下&#xff1a; 1.全局参数设置 在设置DAG图名称这一位…

CTF实战分享 | RWZIP

前言 首先我们要了解&#xff0c;压缩包本身并不具备隐藏信息的功能&#xff0c;但由于在CTF竞赛中&#xff0c;经常出现压缩包与隐写术结合在一起的题目&#xff0c;所以我们需要掌握在CTF竞赛中有关 ZIP 压缩包题目的常见题型及分析手段。 读者福利 | CSDN大礼包&#xff1a…