好的互联网产品不仅仅在功能上要高人一筹,在性能层面也需要出类拔萃,否则金玉其外败絮其中,页面是美轮美奂了,结果首屏半天加载不出来,难免让用户乘兴而来,败兴而归。

幸运的是,前端的性能优化有诸多有迹可循的理论和方法,其中相对权威的,无疑是LightHouse。

LightHouse 是一个开源的自动化工具,它作为 Chrome 浏览器的扩展程序运行,提供一套完整的站点评分标准,我们可以依据此标准对站点进行基准测试,从而达到优化的效果。

怎么打开LightHouse?可以在Chrome浏览器开发人员工具中找到LightHouse。

要打开“开发人员工具”,请选择:
“顶部菜单→查看→开发人员→开发人员工具”
或者使用快捷键:

Mac系统上的“⌥+⌘+I”
Win系统上的“F12+Ctrl+Shift+I”。

随后点击生成报告按钮即可:

LightHouse评分大体上有四大指标,分别为:性能、无障碍、最佳做法以及SEO。

性能指标(Performance)

性能指标里又分为六个小指标:

Largest Contentful Paint 【简称LCP: 最大内容渲染】
FCP最大内容渲染时间标记了渲染出最大文本或图片的时间。
Total Blocking Time 【简称TBT: 总阻塞时间】
TBT测量了FCP(首次内容渲染)和TTI(可交互时间)之间的总耗时。TTI可能会被主线程阻塞以至于无法及时响应用户。大于50ms的任务称为长任务,当任意长任务出现时,主线程则称为被阻塞状态。由于浏览器不会打断正在进行中的长任务,所以,如果用户在执行长任务时和页面有交互事件时,浏览器必须等到该长任务完成才能响应。TBT计算的是在FCP到TTI之间所有长任务时间内总和。
First Contentful Paint 【简称FCP: 首次内容渲染】

FCP测量了从页面开始加载到页面任意部分的内容渲染到屏幕上。

Speed Index 【简称SI: 速度指数】
SI速度指数表明了网页内容的可见填充速度。lighthouse首先捕获页面加载的视屏,然后对比帧与帧之间视觉效果变化(通过计算结构相似指数SSMI来比较)。
Time to Interactive 【简称TTI: 可交互时间】
可交互时间是指网页需要多长时间才能提供完整交互功能。TTI测量了从页面开始加载到页面的主要附属资源加载完毕,并且可以足够快速回应用户输入的所用时间。
Cumulative Layout Shift 【简称CLS: 累积布局偏移】
CLS累积布局偏移旨在测量可见元素在视口内的移动情况。CLS值越小越好。

性能优化手段

有哪些手段可以提高这些性能指标?

首先需要优化的是页面“资源”,这里的资源指的是页面中加载的一切元素,包含但不限于:js文件、css文件、图片、视频等。

对于js文件来说,首先要做的是业务分拆,不同页面只加载对应需要的文件,并且做到单页面只加载一个js文件,减少Http请求数,多余的文件要做合并压缩操作,但其实这里有一个基础问题,就是如果js文件本身就很庞大,压缩比例再高,也是杯水车薪,举个例子,一般情况下Jquery官方的压缩版就已经高达80kb左右了,这样的体积很难有再次压缩的优化空间,所以还不如直接摒弃Jquery,换成别的功能上可以替换的库,比如zepto,后者的体积只有26kb,是前者的四分之一。随后进行压缩合并操作,首先安装:

npm install uglify-js -g

以本站为例,业务上用到的js库分别为zepto.min.js、my.js、lazyload.min.js、wordcloud2.min.js iconfont.js,将这五个js文件进行合并压缩:

uglifyjs zepto.min.js my.js lazyload.min.js wordcloud2.min.js iconfont.js -o ./1-min.js

如此,最后得到一个体积为59kb的1-min.js文件,当然这是业务层面的压缩,还可以通过修改服务器进行gzip压缩:

location ~ .*.(jpg|gif|png|bmp|js|css)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp;
}

加载方式上,尽量使用预加载:

<link rel="preload" as="script" href="1-min.js" />

同时,对于一些站外js比如广告,或者一些js特效,我们可以对其进行延时加载的操作,即首屏加载好之后,再加载这些逻辑:

<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
(function() {
var done = false;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.src = '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'; var createScript = setTimeout(
function(){
document.getElementsByTagName('HEAD').item(0).appendChild(script);
WordCloud(canvas, options);
}, 7000
); script.onreadystatechange = script.onload = function(e) {
if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
(adsbygoogle = window.adsbygoogle || []).push({});
}
};
})();
</script>

上面的逻辑就是首屏完成7秒后再加载Google广告和标签云特效。

对于css文件的处理,原理和js文件差不多,宗旨也是分拆,缩小体积,并且压缩:

cssMinifier(['./bootstrap.min.css', '../js/kindeditor/plugins/code/prettify_dark.css', './style.css'], './tidy_min.css');

优化后,得到体积为17kb的tidy_min.css文件。

对于图片文件,不仅是首图,所有图片最好都采用新的图片格式Webp,用以减少其体积,具体操作方法请移步:石火电光追风逐日|前端优化之次时代图片压缩格式WebP的项目级躬身实践(Python3 PIL+Nginx)。对于特定的图片,比如Logo,使用svg格式图片,请移步:Logo小变动,心境大不同,SVG矢量动画格式网站Logo图片制作与实践教程(Python3)

同时,对于图片一律声明宽高属性,并且使用支持lazyload.js组件推迟对屏幕外图片的加载。

使用viewport标签加快移动端的载入速度:

<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="applicable-device" content="pc,mobile"/>

无障碍(Accessibility)

访问无障碍检测所有用户是否都能有效地访问内容并浏览网站,无障碍性的每个指标项测试结果为pass或者fail,与性能指标项的计算方式不同,当页面只是部分通过某项指标时,页面的这项指标将不会得分。例如,如果页面中的一些元素有屏幕阅读器友好的命名,而其他的元素没有,那么这个页面的 screenreader-friendly-names 指标项得分为0。

一般情况下,优化无障碍其实是对于站点标签的优化,比如页面元素是否具备title标签、title元素是否按降序排列、是否声明了页面语言类型、元素是否具备alt标签等等,值得一提的是,页面对比度也是无障碍评分重要的一环,假如背景色是white,那么前景色最好选择高对比度的颜色,比如black。

最佳做法(Best Practice)

最佳做法检测可以改善网页的代码健康状况的一些最佳做法,评分的分值由相关指标的加权平均值计算而来。

最佳做法指标我们可以理解为就是站点安全性的指标,多数情况下,需要保证协议为HTTPS,同时要开启CSP网页安全政策防止XSS攻击。

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

开启方法:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

搜索引擎优化(SEO)

搜索引擎优化检测搜索引擎对网页内容的理解程度是怎样的,评分的分值由相关指标的加权平均值计算而来。

说白了,就是站点页面是否适合搜素引擎蜘蛛的抓取以及收录,以本站为例,搜索引擎需要的标签如下:

<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="applicable-device" content="pc,mobile"/>
<title>当我们进行性能优化,我们在优化什么(LightHouse优化实操)-刘悦</title>
<meta name="description" content="好的互联网产品不仅仅在功能上要高人一筹,在性能层面也需要出类拔萃,否则金玉其外败絮其中,页面是美轮美奂了,结果首屏半天加载不出来,难免让用户乘兴而来,败兴而归。幸运的是,前端的性能优化有诸多有迹可循的理论和方法,其中相对权威的,无疑是LightHouse。LightHouse是一个开源的自动化工具,它作为Chrome浏览器的扩展程序运行,提供一套完整的站点评分标准,我们可以依">
<meta content="刘悦" name="Author">
<link rel="canonical" href="https://v3u.cn/a_id_214"/>
<link rel="miphtml" href="https://v3u.cn/mipa_id_214">
<link rel="stylesheet" href="/v3u/Public/css/tidy_min.css?v=11"/>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
<link rel="icon" href="favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" href="/v3u/Public/css/share.min.css?v=1">
</head>

包括页面标题、描述、作者、页面唯一标识等等元素。

当我们完成上面这些指标的优化之后,就可以,坐下来,欣赏这紫禁烟花一万重了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTt5i7Ym-1654175116161)(https://v3u.cn/v3u/Public/js/editor/attached/20220602200644_24294.gif)]

正是:东风夜放花千树,更吹落,星如雨。

结语

前端的性能分析和优化方式,无论是传统性能还是感官性能完全可以根据LightHouse按图索骥。过程中可以针对某些指标进行一定的取舍,虽然本站在LightHouse的优化实践中取得了一定的效果,但路漫漫其修远兮,吾将上下而求索。

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_214

当我们进行性能优化,我们在优化什么(LightHouse优化实操)的更多相关文章

  1. RFC2544优化步长测试——信而泰网络测试仪实操

    一.测试拓扑 拓扑说明 1.测试仪两个端口和DUT两个端口相连 2.测试仪P1端口发出流量,经过DUT转发后,从B端口发出,进入测试仪P2端口. 二.测试思路 1.在测试仪端口上创建两个Interfa ...

  2. 提高PHP性能的实用方法+40个技巧优化您的PHP代码

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数" ...

  3. Spark性能调优之代码方面的优化

    Spark性能调优之代码方面的优化 1.避免创建重复的RDD     对性能没有问题,但会造成代码混乱   2.尽可能复用同一个RDD,减少产生RDD的个数   3.对多次使用的RDD进行持久化(ca ...

  4. 性能调优之MYSQL高并发优化

    性能调优之MYSQL高并发优化   一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之 ...

  5. HTTPS 性能优化 -- 基于协议和配置的优化

    基于协议和配置的优化 1 前言 上文讲到 HTTPS 对用户访问速度的影响. 本文就为大家介绍 HTTPS 在访问速度,计算性能,安全等方面基于协议和配置的优化. 2 HTTPS 访问速度优化 2.1 ...

  6. [PHP] – 性能优化 – Fcgi进程及PHP解析优化

    https://www.abcdocker.com/abcdocker/808------[PHP] – 性能优化 – Fcgi进程及PHP解析优化

  7. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  8. MySql数据库3【优化2】sql语句的优化

    1.SELECT语句优化 1).利用LIMIT 1取得唯一行[控制结果集的行数] 有时,当你要查询一张表是,你知道自己只需要看一行.你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数, ...

  9. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化

    本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...

随机推荐

  1. 透过实例demo带你认识gRPC

    摘要:gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法.在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用. 本文分享自华为云社区<gRPC介绍以及spri ...

  2. jeecgboot-vue3笔记(八)——treeSelect树形选择组件的使用(一次性加载)

    使用效果 前端代码 定义interface export interface TreeDataItem { value: string; key: string; title?: string; sl ...

  3. HTML5续集

    H5 input新增属性 1.color 拾色器 2.Email 电子邮件 3.tel 电话 4.datetime-local 本地日期和时间 5.range 范围 6.url 路径,地址 7.sea ...

  4. Spring Security OAuth正式终止维护,已从官网下架

    Spring Security团队正式宣布Spring Security OAuth终止维护. 目前官网的主页已经高亮提醒彻底停止维护. 旧的Spring Security OAuth项目终止到2.5 ...

  5. MyBatis - MyBatis的层次结构

    API接口层 规定了一系列接口,能够向外提供接口,对内进行操作. 数据处理层 负责SQL相关处理工作,如:SQL查找.SQL执行.SQL映射等工作. 基础支撑层 提供基础功能支撑,包括连接管理.事务管 ...

  6. Dubbo的基本使用

    Dubbo分为提供者和消费方  并且两者都要注册到ZK上 提供者 注解    @Service   这是dubbo包下的 消费组 注解    @Reference 远程注入 第一步导入依赖 <! ...

  7. OAuth2学习中的一些高频问题的QA

    关于OAuth2相信很多初学者都有一些疑问,胖哥将这些疑问一一收集了起来做成了QA,或许能帮助学习者. OAuth2相关的QA Q:OAuth2 的一些常用场景? A: OAuth2主要用于API授权 ...

  8. 聊聊消息中间件(1),AMQP那些事儿

    开篇 说到消息队列,相信大家并不陌生.大家在日常的工作中其实都有用过.相信大部分的研发在使用消息队列的过程中也仅仅是停留在用上面,里面的知识点掌握得并不是很系统,有部分强大的功能可能由于本身公司的业务 ...

  9. SAP Web Dynpro-使用服务调用

    创建服务调用后,功能模块可用于组件. 现在可以选择一个视图,以便在浏览器中显示数据库表的元素. 如果全局控制器不是组件控制器,则必须为所选视图的控制器输入全局控制器的使用页面. 之后,应该有该节点的映 ...

  10. 编程技巧│提高 Javascript 代码效率的技巧

    目录 一.变量声明 二.三元运算符 三.解构赋值 四.解构交换 五.箭头函数 六.字符串模版 七.多值匹配 八.ES6对象简写 九.字符串转数字 十.次方相乘 十一.数组合并 十二.查找数组最大值最小 ...