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

巴索罗缪·大熊

前言

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

服务端优化

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么从视频中提取音频?这里有三种提取妙招

怎么从视频中提取音频&#xff1f;在数字媒体日益丰富的今天&#xff0c;视频内容成为了信息传播的重要形式。但有时我们可能只需要视频中的音频部分&#xff0c;用于制作播客、音乐剪辑或语音分析等。幸运的是&#xff0c;技术的发展为我们提供了多种从视频中高效提取音频的方…

如何降本增效获得目标客户?AI企业使用联盟营销这个方法就对了!

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 为什么AI企业难以获客呢&#xff1f; 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功…

【问题解决】pycharm中添加python interpreter报错 conda excutable is no found

选择安装目录下的conda.bat文件&#xff0c;然后点击“Load Environments”按钮&#xff0c;然后在列表中选择conda环境即可。

开源表单流程设计器有哪几个突出的优势特点?

当前&#xff0c;传统的表单制作已经无法满足现在企业的发展需求了。想要实现高效率发展&#xff0c;需要引进先进的低代码技术平台、开源表单流程设计器等优秀软件平台助力发展。它们具有可视化操作界面、灵活好操作、易维护、效率高等诸多优势特点&#xff0c;在推动企业实现…

蓝桥杯嵌入式 第六届国赛 更新中……

题目 配置 注意事项 复制LCD的工程&#xff0c;先配置资源 --- 勾选完选项一定要再看一眼&#xff0c;可能选择错误 ADC&#xff1a;配置ADC2_IN15&#xff0c;对应PB15引脚 EEROM&#xff0c;配置PB6和PB7 按键 输入模式PB0、PB1、PB2、PA0 LED 一定要使能PD2 PWM互补输出&…

vue3 + ts 实现IP地址及Mac地址输入框功能

1、组件完成代码 <template><div class"ip-input"><div v-for"(item, index) in ipArr" :key"index" class"ip-input__item-wrap"><input ref"ipInput" v-model"ipArr[index]" type"t…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月29日预测第5弹

今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号&#xff0c;同时&#xff0c;同样准备两套方案&#xff0c;一套是我自己的条件进行缩号&#xff0c;另外一套是8883的大底结合2码不定位奖号预测二次缩水来杀号。好了&#xff0c;直接上结果吧~ 首先&…

【数据结构】

根据先序、中序、后序确定二叉树&#xff1a; #背景&#xff1a;树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序&#xff0c;根据先序和后序不一定可以确定一棵二叉树&#xff0c;给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。 抓住中序特点&#x…

开源工具专题-04 Atlassian Crowd部署备份及迁移

开源工具专题-04 Atlassian Crowd部署备份及迁移 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-05-29csdn 博客名称&#xff1a;五维空间-影子&…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目&#xff0c;使用Postman测试 参考博文&#xff1a; 1、使用…

无人港口/码头兴起,可视化大屏功不可没。

码头/港口可视化大屏可以为管理上带来多方面的价值&#xff0c;包括但不限于&#xff1a; 1. 实时监控&#xff1a; 大屏可以将港口的各种数据、设备状态、船舶位置等信息实时展示&#xff0c;管理人员可以通过大屏随时监控港口的运营情况&#xff0c;及时发现并处理问题。 2…

第13章 常用类

一、包装类 二、String String的常用方法&#xff1a; equals&#xff1a;判断内容是否相等&#xff0c;区分大小写。 String str1 "hello";String str2 "Hello";System.out.println(str1.equals(str2));//false equalsIgnoreCase&#xff1a;判断内容…

清华大学提出IFT对齐算法,打破SFT与RLHF局限性

监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是预训练后提升语言模型能力的两大基础流程&#xff0c;其目标是使模型更贴近人类的偏好和需求。 考虑到监督…

一文看懂标准版和Pro版的区别

在CRMEB的众多产品中&#xff0c;有这样两款产品经常被拿来比较&#xff0c;它们就是CRMEB的标准版和Pro版商城系统&#xff0c;今天&#xff0c;我们就来盘一下这两款系统之间究竟有哪些不同。 1、Pro版系统性能更卓越 CRMEB Pro版采用Tp6 SwooleRedis高性能框架开发&#…

游戏联运平台如何助力游戏行业飞速发展?

随着科技的进步和互联网的普及&#xff0c;游戏行业正以前所未有的速度飞速发展。在这个过程中&#xff0c;游戏联运平台凭借其独特的优势和功能&#xff0c;成为了推动游戏行业腾飞的关键力量。本文将探讨游戏联运平台如何助力游戏行业实现飞速发展。 一、游戏联运平台的定义与…

四川易点慧电商抖音小店信誉之店

在当下这个电商飞速发展的时代&#xff0c;如何在众多网店中挑选出一家既可靠又值得信赖的店铺&#xff0c;成为了消费者们关注的焦点。四川易点慧电子商务有限公司抖音小店以其卓越的品质和诚信的经营&#xff0c;逐渐在抖音平台上崭露头角&#xff0c;成为了众多消费者心中的…

北京大学第一医院与智源研究院共同发布基于可信执行环境的AI医学影像挑战赛

肾动脉狭窄是导致继发性高血压及肾功能不全的常见原因&#xff0c;而目前针对肾动脉狭窄功能学的评估尚处于探索阶段。数据保护和可信计算环境是目前人工智能技术应用于临床研究的一大瓶颈。北京大学第一医院与北京智源人工智能研究院心脏AI 联合研究中心特发布基于可信执行环境…

FreeSwitch视频会议同时支持内网和外网接入

我们在使用freeswitch进行视频会议时&#xff0c;之前所有的用户都是通过外网的方式接入&#xff0c;因为fs给其返回的sdp协议内容里&#xff0c;只需要fs配置的外网IP就可以了&#xff1b;最近由于引入新的业务需要有其他内网的服务器也可以直接接入fs的视频会议房间&#xff…

VirtualBox虚拟机与bhyve虚拟机冲突问题解决@FreeBSD

问题 在安装完bhyve虚拟系统的主机上启动VirtualBox虚拟机的时候&#xff0c;报错&#xff1a;不能为虚拟电脑 debian 打开一个新任务. VirtualBox cant operate in VMX root mode. Please close all other virtualization programs. (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码…

5292A 物联网信号分析仪

5292A 物联网信号分析仪 —— 10MHz&#xff5e;6GHz —— 简述 5292A物联网信号分析仪是一款通用的矢量信号分析仪&#xff0c;频率范围覆盖 10MHz&#xff5e;6GHz&#xff0c;具有良好的频率、功率测量精度和稳定度&#xff1b;支持模拟与数字调制信号、全制式的通信标准…