Lighthouse与首屏优化

之前提到首屏优化,想到的就是Vue项目首页打开很慢需要优化。一般都是肉眼看看,对当前的加载速度并没有一个准确的衡量标准,也没有很清晰的解决思路。

前两天我想给自己的网站申请谷歌广告,听说审核对网站的性能要求很高。于是网上搜索后发现了一个网站优化利器--Lighthouse

一:Lighthouse是什么?

Lighthouse 是一个由 Google 开发的开源自动化工具,用于改进网页质量。它提供全面的网页性能、可访问性、最佳实践和 SEO 分析,帮助开发者构建更好的网站体验。

Lighthouse这个工具前端开发者又熟悉又陌生,说她熟悉因为她就在Chrome的F12面板中,跟Network在一块。说她陌生是因为,可能大多程序员没注意到她,也不知道她是干什么用的。

Lighthouse使用起来很简单,F12里找到她,输入需要检测的网站即可。我第一次使用时的得分如下

二:Lighthouse的相关指标

1、主要指标

如上截图中主要4个指标,相关概念如下

性能 (Performance)页面加载速度和用户体验包含FCP, LCP, TTI, TBT, CLS
可访问性 (Accessibility)残障用户友好度屏幕阅读器支持,色彩对比度,ARIA 属性
最佳实践 (Best Practices)现代Web开发标准HTTPS, 安全的API使用,图片优化
SEO (Search Engine Optimization)搜索引擎优化元标签,结构化数据,移动友好性

2、性能(Performance)下的指标

  • FCP (First Contentful Paint)  首个内容绘制时间

 测量页面首个元素呈现的时间,让用户知道网站开始载入了。

  • LCP (Largest Contentful Paint) 最大内容绘制时间

 测量页面主要内容加载完成的时间,让用户知道网站载入完毕,可以交互了。

  • CLS (Cumulative Layout Shift) 累积布局偏移

 测量页面内容意外移动的程度,比如一个按钮在点击时因其他元素加载突然下移了。

3、指标作用

通过这些指标得分,我们可以量化的知道自己网站的性能效果。有一个参考值,便于针对性的优化。

三:优化建议

Lighthouse的每个指标都有对应的优化建议,如下图。如图右上角可以切换各个指标

四:成功实践

我根据Lighthouse的建议,针对性的做了相关的措施。最终成绩如下,我网站效果为CodingLife,忙活了4天结果还算满意~

先说下我服务器的配置,2核2G 3M带宽。为了节省费用,配置堪称寒酸!

1、分割打包 按需加载

首先要在路由配置中,使用按需加载与分包设置

// router.js文件中
routes: [{path: '/',name: 'BlogDetail',component: () => import(/* webpackChunkName: "blogDetail", webpackPrefetch: false */ '@/components/MainPage/BlogDetail');}
]

其次一定要配合webpack配置,否则很可能无法按需加载。即首页渲染时,加载其他页面的js包

// vue.config.js文件
module.exports = {chainWebpack: config => {// 禁用所有 prefetchconfig.plugins.delete('prefetch');}
};

2、压缩资源包体积

将JS资源文件打包为.gz格式,可以高效减少资源包体积。shezhi前端webpack打包时,就做GZip压缩

// vue.config.js文件
module.exports = {configureWebpack:config=>{// GZip压缩const CompressionPlugin = require('compression-webpack-plugin');config.plugins.push(new CompressionPlugin({algorithm:'gzip',test:/\.(js|css|woff|woff2|svg)$/,  // 要压缩的文件threshold:10240, // 压缩超过10k的数据deleteOriginalAssets:false, // 不删除压缩前的文件,如果浏览器不支持Gzip,则会加载源文件minRatio:0.8 // 压缩比大于0.8的文件将不会被压缩}));}
};

Nginx服务器,配合设置

server {gunzip on;       # 如果客户端不支持 gzip,自动解压返回原始文件gzip off;        # 关闭动态压缩(因为已经有预压缩文件)
}

3、减小图片体积

图片使用webp格式,可以大幅减小图片体积。使用webp主要工作在ngnix上,具体操作如下

安装cwebp,处理图片

# 下载最新版源码(当前最新版本1.3.0)
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.3.0.tar.gz# 解压并进入目录
tar -xvzf libwebp-1.3.0.tar.gz
cd libwebp-1.3.0# 配置编译选项(确保启用PNG和JPEG支持)
./configure --enable-libpng --enable-libjpeg# 编译并安装
make
sudo make install# 刷新库缓存
sudo ldconfig# 验证安装
cwebp -version

配置nginx有限返回webp格式图片

http {# 简化的WebP检测map $http_accept $webp_suffix {default   "";"~*webp"  ".webp";  # 添加.webp后缀}# HTTPS 服务器 - 主配置server {listen 443 ssl http2;server_name codinglife.online www.codinglife.online;location /uploads/ {alias /opt/CodingLife/uploads/;autoindex off;# 核心缓存策略(根据文件类型区分)location ~* \.(jpe?g|png|gif|webp|svg|avif)$ {		try_files $uri$webp_suffix $uri =404;add_header Vary Accept;  # 关键:标记内容协商}}}
}

4、减少图片请求数量

我的博客首页是个列表,列表的每条都包含一个缩略图,刚开始设置每页8条数据。8个图片,对于3M的带宽来说,压力太大。

于是我将分页请求中每页条数精细化,根据设备分辨率动态设置。比如移动端每页3条,笔记本电脑每页4条,外接显示器8条。

  calculatePageSize() {if (this.windowWidth < 1366) {this.perPageNum = 3 // 移动端和小屏设备} else if (this.windowWidth >= 1366 && this.windowWidth < 1600) {this.perPageNum = 4 // 14寸笔记本} else if (this.windowWidth >= 1600 && this.windowWidth < 1920) {this.perPageNum = 5 // 15.6寸笔记本} else {this.perPageNum = 8 // 大屏幕}}

5、减少无用Dom

因为Lighthouse还模拟移动设备测试首屏性能,并且模拟条件极为苛刻。具体如下

  • Desktop:默认使用 150ms TCP延迟的"有线"网络 (类似稳定WiFi/光纤)。

  • Mobile:默认使用 300ms TCP延迟 + 1.6Mbps下载/0.75Mbps上传的"慢速4G"网络

我的网站使用媒体查询,自适应移动端和pc端。因为移动端屏幕大小有限,我选择隐藏了很多不必要的模块。但原有的css设置隐藏是奢侈的,依旧消耗性能,我本次将无用的dom需要彻底删掉。

<section v-if="isDeskTop"></section>data: function () {return {isDeskTop: window.innerWidth > 768 // 是否是桌面端}
},

6、剔除无用请求

以前适配移动端时大大咧咧,只想着实现效果就行。很多无用模块都是css配置display:none,js接口正常请求,现在看来是真的浪费。本次我又精细化的过了一遍,移动端时删除不必要的接口请求。

// 移动端时删除不必要的接口请求
if(this.isDeskTop){      //渲染留言个数this.GetLeaveMessageNum();this.GetCommentNum();
}

7、提高传输效率

chrome最多同时发6个请求,如果需要同时发起7个请求,第7个就要等待前6个结束。可SPA同时发起7个请求可太常见了。

于是我将HTTP/1升级到HTTP/2,做到单 TCP 连接上并行传输多个请求/响应。原理如下,告别了network里同时并行一堆请求的历史

原理

network效果 

nginx的配置超级简单,只需要一行:

server {listen 443 ssl http2;
}

五:最终效果

哥们的网站CodingLife,最终效果不管移动端还是PC端都是秒开。摸索了4天,最终看到Lighthouse打分99时,我跟个傻子一样哈哈大小,那是真的开心!

打开F12的network可以看到如下差别,不提速是不可能的啦

  • 请求的JS文件条数明显少了(按需加载,只加载首屏js)
  • JS资源文件最大的也就700k(Gzip压缩)
  • 图片大都100k以内(webp格式图片)
  • 请求的图片条数明显减少(动态设置列表条数)
  • 发起的接口请求明显减少(删除移动端无用请求)
  • 请求缩略图只有一条(启用http/2)

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

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

相关文章

Maven 之 打包项目时没有使用本地仓库依赖问题

背景 pom 中使用了第三方jar包&#xff0c;远程仓库设置的是阿里云&#xff0c;之前运行很好&#xff0c;今天不知道怎么的&#xff0c;打包总是报错&#xff0c;阿里云仓库无法找到依赖包(本来也没有)&#xff0c;按理来说&#xff0c;编译打包时会优先选择本地仓库的包才对&a…

Mysql基础入门\期末速成

DDL 操作数据库语句 创建&删除数据库语句 创建数据库 create database 数据库名称; -- 直接创建 create database if not exists 数据库名称; -- 如果不存在&#xff0c;则创建 create database 数据库名称 default charset utf8mb4; -- 创建编译类型utf8的数据类型 cre…

SCADA|KingSCADA4.0中历史趋势控件与之前版本的差异

哈喽,你好啊,我是雷工! 最近用到KingSCADA4.0信创版本,也算尝鲜使用。 在使用的过程中发现有些功能或多或少存在一些差异, 这里将遇到的一些不同总结一下,便于后期更好的使用。 01 历史趋势控件 在KingSCADA中有一个历史趋势曲线控件KSHTrend。 该控件既可以连接King…

ubuntu 拒绝ssh连接,连不上ssh,无法远程登录: Connection failed.

目录 问题描述视窗 可视化桌面命令行 问题描述 [C:\~]$ Connecting to 192.166.8.85:22... Could not connect to 192.166.8.85 (port 22): Connection failed.Type help to learn how to use Xshell prompt. [C:\~]$ Connecting to 192.166.8.85:22... Could not connect to …

【大模型应用开发】向量数据库向量检索方法存在问题及优化

一、检索结果重复 1. 问题分析 在构建向量数据库时&#xff0c;对文档分割会存在重复块&#xff08;chunk_overlap&#xff1a;指两个块之间共享的字符数量&#xff0c;用于保持上下文的连贯性&#xff0c;避免分割丢失上下文信息&#xff09;&#xff0c;如下图所示&#xf…

MySQL常用函数详解之数值函数

MySQL常用函数详解之数值函数 一、数值函数概述1.1 数值函数的作用1.2 数值函数分类 二、算术运算函数2.1 加法运算&#xff08;&#xff09;2.2 减法运算&#xff08;-&#xff09;2.3 乘法运算&#xff08;*&#xff09;2.4 除法运算&#xff08;/ 或 DIV&#xff09;2.5 取模…

13、Redis进阶二之Redis数据安全性分析

⼀ 、Redis性能压测脚本介绍 Redis的所有数据是保存在内存当中的&#xff0c; 得益于内存⾼效的读写性能&#xff0c; Redis的性能是⾮常强悍的 。但 是&#xff0c;内存的缺点是断电即丢失&#xff0c;所以 &#xff0c;在实际项⽬中&#xff0c; Redis—旦需要保存—些重要的…

【系统分析师】2011年真题:综合知识-答案及详解

文章目录 【第1题】【第2~3题】【第4~5题】【第6题】【第7~8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19~20题】【第21题】【第22题】【第23题】【第24~25题】【第26题】【第27题】【第28题】【第29题】【…

FastAPI-MCP构建自定义MCP工具实操指南

一、简介 • FastAPI-MCP是一个基于python FastAPI框架开发的开源项目&#xff0c;可以自动识别并暴露FastAPI接口为MCP工具 • 拥有FastAPI框架的所有优点&#xff0c;如异步高并发、独立远程部署、OpenAPI文档 • 提供SSE、mcp-remote接入方式&#xff0c;支持设置授权访问…

LLMs之Memory:《LLMs Do Not Have Human-Like Working Memory》翻译与解读

LLMs之Memory&#xff1a;《LLMs Do Not Have Human-Like Working Memory》翻译与解读 导读&#xff1a;该论文通过三个精心设计的实验&#xff0c;证明了当前的大型语言模型&#xff08;LLMs&#xff09;缺乏类似人类的工作记忆。实验结果表明&#xff0c;LLMs无法在没有明确外…

Node.js验证码:从生成到验证的趣味之旅

文章目录 Node.js验证码&#xff1a;从生成到验证的趣味之旅&#x1f4dc; 引言&#xff1a;为什么需要验证码&#xff1f;1. 验证码的基本原理 &#x1f9e0;验证码工作流程示意图 2. 技术栈准备 &#x1f6e0;️3. 验证码生成详解 &#x1f3a8;3.1 生成SVG验证码3.2 转换为P…

芯科科技携最新Matter演示和参考应用精彩亮相Matter开放日和开发者大会

全面展示赋能Matter设备实现跨协议和跨海内外生态的技术能力 作为Matter标准创始厂商之一和其解决方案的领先供应商&#xff0c;Silicon Labs&#xff08;亦称“芯科科技”&#xff09;于6月12至13日参加由连接标准联盟中国成员组&#xff08;CMGC&#xff09;主办的Matter年度…

AndroidStudio下载的SDK没有tool目录,或者想要使用uiautomatorviewer工具

1.如果没有tool目录可以使用下面的地址进行下载 https://dl.google.com/android/repository/tools_r25.2.5-windows.zip 2.并且把下载的文件解压到放在AndroidStudio的目录中 3.如果使用uiautomatorviewer.bat出现下面的错误 Unable to connect to adb.Check if adb is instal…

FastJSON等工具序列化特殊字符时会加转义字符\

在Java中JSON数据格式用String接收时&#xff0c;此时在FastJSON层面看来该JSON只是普通字符串&#xff0c;所以对原字符串序列化会得到转义字符\ 得到转义后字符串&#xff0c;再反序列化转义后字符串会得到原字符串 String json"{\"name\": \"张三\&quo…

数据结构 学习 队列 2025年6月14日 11点22分

循环队列 循环队列是一种线性数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;原则&#xff0c;但与普通队列不同的是&#xff0c;循环队列的最后一个元素连接回第一个元素&#xff0c;形成一个环形结构。这种设计有效解决了普通队列的"假溢出"问题&…

打造丝滑滚动体验:Scroll-driven Animations 正式上线!

&#x1f300; 打造丝滑滚动体验&#xff1a;Scroll-driven Animations 正式上线&#xff01; &#x1f6a8; 告别 JS 手动监听滚动条&#xff0c;CSS 新能力让你用两行代码实现高级滚动动效。 &#x1f50d; 什么是 Scroll-driven Animations&#xff1f; Scroll-driven anim…

知识体系_研究模型_价格敏感度测试模型(PSM)

1 概述 价格敏感度测试模型(Price Sensitivity Measurement,PSM) ,通过调研潜在用户对于不同价格的满意或接受程度,从而制定出合适的产品价格。 价格敏感度PSM模型的分析一般分为以下几个步骤: (1)确定多个价格 (2)通过一定的方式(通常是问卷)收集目标客户对不同价…

C++11函数封装器 std::function

✅ 1. 什么是 std::function std::function 是 C11 引入的标准库工具&#xff0c;是一个通用的函数封装器&#xff0c;可以包装以下任意可调用对象&#xff1a; 普通函数Lambda 表达式函数指针成员函数指针函数对象&#xff08;也叫仿函数&#xff0c;定义了 operator() 的类…

centos系统docker配置`milvus-standalone`教程

本人使用的是京东云服务器docker配置milvus 参考教程&#xff1a;https://blog.csdn.net/withme977/article/details/137270087 需要注意&#xff1a;虚拟机安装pymilvus和docker安装milvus版本需要对应&#xff0c;否则会出现connection失败问题 查看虚拟机pymilvus版本&…