热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网站性能优化利器:LightHouse全面检查各项指标,多种优化方案可选

检查网站性能过程全局安装lighthousenpminstall-glighthouse然后输入你的页面lighthousehttps:example.comlighthou

检查网站性能过程

全局安装 lighthouse

npm install -g lighthouse

然后输入你的页面

lighthouse https://example.com

lighthouse 会自动生成 HTML 报告,你也可以使用 JSON 格式。

生成报告如下:
在这里插入图片描述
解读各项指标含义:


  1. FCP (First Contentful Paint):渲染第一个元素(文本、图片、canvas…)的时间点
  2. SI (Speed Index):首屏展现时间
  3. LCP (Largest Contentful Paint):渲染可视区域内最大内容元素的时间点
  4. TTI (Time to Interactive):页面资源加载成功并能响应用户交互的时间点
  5. TBT (Total Blocking Time):FCP到TTI之间,主线程被long task(超过50ms)阻塞的时间之和
  6. CLS (Cumulative Layout Shift):累计布局偏移值

三个维度进行评估:


  • [加载情况] : LCP
  • [交互性] : FID
  • [视觉稳定性] : CLS

改善建议:
在这里插入图片描述


优化方案

主要以性能指标作为维度,主要分为以下几个点:


  • 视觉稳定性 (Cumulative Layout Shift)
  • 加载情况 (Largest Contentful Paint)
  • TTI (Time to Interactive)
  • TBT (Total Blocking Time)
  • FCP (First Contentful Paint)

优化过程

1、自定义字体文件加载期间保持可见状态


斜体样式改善建议里提到使用CSS font-display属性确保自定义字体文件在加载期间可见.


在这里插入图片描述


这是因为网站下载自定义字体文件需要一段时间,而不同浏览器此时的行为是不同的.一些浏览器在加载自定义字体时会隐藏文字,这种称之为FOIT(Flash Of Invisible Text).而一些浏览器会显示降级字体,这种情况称之为FOUT(Flash Of Unstyled Tex).这两种行为会导致"字体闪烁问题",影响视觉稳定性 (CLS).



我的处理方法是直接设置font-display:swap;这个属性能确保字体在加载时间可见.虽然还是会引发FOUT,但是相比FOIT,FOUT对视觉稳定性的影响会小一些.


@font-face {font-family: 'ping-fang';src: url('../font/Hello-World.otf') format('OpenType');/* swap:如果设定的字体还未可用,浏览器将首先使用备用字体显示,当设定的字体加载完成后替换备用字体 */font-display:swap;}

2、避免使用document.write()


使用document.write()会使页面内容的显示延迟数十秒,这对于连接速度较慢的用户而言尤其成问题。因此,Chromedocument.write()在很多情况下都会阻止执行,这意味着不能依赖它。


在这里插入图片描述


我的办法是删除代码中document.write()的所有用法。如果用于注入第三方脚本,请尝试使用异步加载。


3、最小化主线程工作


浏览器的渲染器过程将代码转换为用户可以与之交互的网页。默认情况下,渲染器进程的主线程通常处理大多数代码:它解析HTML并构建DOM,解析CSS并应用指定的样式,并解析,评估并执行Javascript。


在这里插入图片描述
如上图所示,Lighthouse标记了在加载期间使主线程保持忙于4秒钟以上的页面


我们的目标就在如何最大限度地减少主线程的工作,可以从以下几个方面进行优化:

脚本评估

  • 优化第三方Javascript
  • 消除输入处理程序
  • 使用web workers

样式和布局

  • 减少样式计算的范围和复杂性
  • 避免大型,复杂的布局

解析HTML和CSS

  • 提取关键CSS
  • 缩小CSS
  • 推迟非关键CSS

脚本解析和编译

  • 通过代码拆分减少Javascript负载
  • 删除未使用的代码

垃圾收集

  • 使用measureMemory()监视网页的总内存使用情况

4、避免大量的网络负载


大型网络有效负载与较长的加载时间高度相关。它们也使用户花钱;例如,用户可能需要为更多的蜂窝数据付费。因此,减少页面的网络请求的总规模有利于你的用户在网站上的经验和自己的钱包。


在这里插入图片描述

Lighthouse显示页面请求的所有资源的总大小(以kib为单位)。

根据HTTP存档数据,网络有效负载的中位数在1,700到1,900 KiB之间。为了帮助显示最高的有效负载,Lighthouse标记了总网络请求超过5,000 KiB的页面。


降低有效负载大小目的:
使总字节大小<1,600 KiB。此目标基于理论上可以在3G连接上下载的数据量&#xff0c;同时仍实现10秒钟或更短的交互时间。



方法如下&#xff1a;
1、将请求推迟到需要时再发送。有关一种可能的方法&#xff0c;请参阅PRPL模式。
2、优化请求以使其尽可能小。
可能的技术包括&#xff1a;最小化和压缩网络负载、对图像使用WebP而不是JPEG或PNG、将JPEG图像的压缩级别设置为85。
3、缓存请求&#xff0c;以使页面在重复访问时不会重新下载资源。


5、减少Javascript执行时间

当Javascript执行时间超过2秒时&#xff0c;Lighthouse将显示警告。执行时间超过3.5秒时&#xff0c;审核将失败&#xff1a;
在这里插入图片描述


如何加快Javascript执行 &#xff1a;
1、 仅通过实现代码拆分来发送用户所需的代码。
2、缩小并压缩代码。
3、删除未使用的代码。
4、通过使用PRPL模式缓存代码来减少网络旅行。


6、避免链接关键请求


链的长度越大&#xff0c;下载大小越大&#xff0c;对页面加载性能的影响就越大。


Lighthouse报告了具有较高优先级的关键请求&#xff1a;
在这里插入图片描述


如何降低关键的请求链的对性能的影响
1、尽量减少关键资源的数量&#xff1a;消除它们&#xff0c;推迟其下载&#xff0c;将其标记为async&#xff0c;依此类推。
2、优化关键字节的数量以减少下载时间&#xff08;往返次数&#xff09;。
3、优化剩余关键资源的加载顺序&#xff1a;尽早下载所有关键资产&#xff0c;以缩短关键路径的长度。



推荐阅读
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
author-avatar
木宁xuan_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有