从50分到90分,网站性能优化实践

news2024/11/15 10:01:24

难以置信: 我可是用尊贵的Vue3+Ts开发的呢 (手动狗头).

十分抗拒: 迫于yin威,我给网站做了体检和手术.

体检

市面上的体检套餐有很多种,但其实都是换汤不换药.那药(标准)是什么呢?我们会在下面说明.这里我选择了谷歌亲儿子"灯塔"(LightHouse)进行性能体检.

体检标准


为什么我说大多体检套餐都是换汤不换药呢?我们先从灯塔的计分规则说起:从上面中我们可以看到灯塔v6/v7版是通过几种性能指标及不同权重来进行计分的.这几种指标主要是根据PerformanceTiming和PerformanceEntry API标准进行定义.市面上大多体检套餐也是基于这些指标定制的.接下来我们来了解下这些指标的含义吧.

FCP (First Contentful Paint)

渲染第一个元素(文本、图片、canvas…)的时间点

SI (Speed Index)

首屏展现时间

LCP (Largest Contentful Paint)

渲染可视区域内最大内容元素的时间点

TTI (Time to Interactive)

页面资源加载成功并能响应用户交互的时间点

TBT (Total Blocking Time)

FCP到TTI之间,主线程被long task(超过50ms)阻塞的时间之和

CLS (Cumulative Layout Shift)

累计布局偏移值

FID (First Input Delay)

用户第一次在页面进行交互(点击链接、按钮、自定义js事件),到浏览器实际开始处理这个事件的时间

Core Web Vitals

谈到用户体验与性能指标,顺便提下Core Web Vitals. 2020年5月,Google针对网站使用体验推出了一套核心指标标准(Core Web Vitals).由三项指标构成:为什么不是别的指标呢 ? 因为这套标准主要从以下三个维度进行评估:

  • [加载情况] : LCP

  • [交互性] : FID

  • [视觉稳定性] : CLS

如何检视Core Web Vitals 指标 ?

开发者可利用以下几种工具对Core Web Vitals进行监测: 由于FID需要一个真实用户的交互,所以无法用实验数据测试.为了能在实验数据下测试FID,通常会用TBT (Total Blocking Time).虽然他们测量的内容不同,但改善TBT通常也能改善FID.

体检结果

不检不知道,一检吓一跳.6个"重要器官"凉了一半…是时候对它动个手术了!

指标评分

market-optimize-before.png

改善建议

improve-advice.png

手术

手术方案

既然是性能手术,方案就主要以性能指标作为维度,主要分为以下几个点:

  • 视觉稳定性 (Cumulative Layout Shift)

  • 加载情况 (Largest Contentful Paint)

  • TTI (Time to Interactive)

  • TBT (Total Blocking Time)

  • FCP (First Contentful Paint)

手术过程

视觉稳定性 (Cumulative Layout Shift)

  • 优化未设置尺寸的图片元素

改善建议里提到了一项优先级很高的优化就是为图片元素设置显式的宽度和高度,从而减少布局偏移和改善CLS.

image-size.png

Hello World
  • 自定义字体文件加载期间保持可见状态

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

webfont-load.png

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

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

更好的方案应该是预加载(preload)字体文件.让字体下载有更高概率赶在FCP之前,从而避免FOIT/FOUT.

@font-face {

font-family: ‘Hello-World’;

src: url(‘…/font/Hello-World.otf’) format(‘OpenType’);

/* swap:如果设定的字体还未可用,浏览器将首先使用备用字体显示,当设定的字体加载完成后替换备用字体 */

font-display:swap;

}

  • 避免页面布局发生偏移

cls-ele.png

我们产品中有一个顶部动态插入的元素,这个元素会导致网站整体布局下移.从而造成了较大的布局偏移.跟产品及ui py交易后,我们友好地对这个元素进行了调整.将该元素脱离文档流,采用固定定位的方式进行展示.从而解决该问题.

  • 避免非合成动画

non-composited-animation.png

改善建议中提到应避免使用非合成动画,非合成动画会使得页面变得混乱并增加CLS.关于这个优化建议我觉得应该具体场景具体分析,不应该"因噎废食".毕竟目前能被composited的css属性只有transform & opacity.当然这也在提醒我们平时在做CSS动画时应注意优化 (比如常见的使用transform替代top).

加载情况 (Largest Contentful Paint)

  • 替换最大内容绘制元素

在改善建议中,我发现网站的最大内容绘制元素是谷歌地图中的一个图块元素.这也难怪LCP指标的数据表现不理想了,原因: 链路过长 - 下载谷歌地图Js sdk => 初始化谷歌地图=> 绘制 .

于是,我决定对最大内容绘制元素进行修改,从而提升LCP时间.我喵了一眼Largest Contentful Paint API 关于该元素类型的定义,将"目标"锁定到了一个loading元素 (绘制成本低: 默认渲染,不依赖任何条件和判断).经过我对该元素的尺寸动了手脚后(变大),该元素成功"上位".

文末

如果30岁以前,可以还不知道自己想去做什么的话,那30岁之后,真的觉得时间非常的宝贵,不能再浪费时间在一些碎片化的事情上,比如说看综艺,电视剧。一个人的黄金时间也就二,三十年,不能过得浑浑噩噩。所以花了基本上休息的时间,去不断的完善自己的知识体系,希望可以成为一个领域内的TOP。

同样是干到30岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说30岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

前端面试题汇总

JavaScript

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

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

相关文章

PyTorch中“No module named ‘torch._six‘“的报错场景及处理方法

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 在使用PyTorch时,您可能会遇到"No module named ‘torch._six’"的错误。这通常是因为PyTorch的某些…

[分布式网络通讯框架]----集群与分布式的区别

单机聊天服务器 聊天系统做了模块化设计,每一个模块都包含很多特定的业务 缺点: 单机聊天服务器极大程度的受限于硬件资源,服务器所能承受的用户并发量是有限的,即使我们通过改变最大连接量等参数,但是受到单机本身…

VUE div的右上角的角标/标签

一、效果图 二、代码 <div class"comp-overview"><div class"overview-item" v-for"(item,index) in overviewInfoList" :key"index"><div class"angle_mark"><span>{{item.label}}</span>&…

CRMEB 多商户Java版v1.6公测版发布,付费会员上线,立即体验

新版本来袭&#xff01;CRMEB 多商户Java版v1.6正式发布&#xff01; 在v1.6新版本中&#xff0c;我们带来了付费会员体系&#xff0c;这将让商业模式更加灵活多元&#xff0c;新增加的移动端商家管理&#xff0c;也让运营触手可及&#xff0c;更加便捷&#xff0c;还有商家端员…

Pixel Heroes Fantasy Editor

使用Pixel Heroes: Fantasy Editor创建令人惊叹的像素角色!它是如何工作的?只需在编辑器中构建角色并保存动画精灵表。运行时动态构建角色使用角色构建器脚本!想将角色与不同的游戏引擎一起使用?只需制作PNG精灵表并导入其他软件! 特征: ● 角色编辑器,用于生成64x64帧的…

【SQL Server数据库】简单查询

目录 用SQL语句完成下列查询。使用数据库为SCHOOL数据库 1. 查询学生的姓名、性别、班级名称&#xff0c;并把结果存储在一张新表中。 2. 查询男生的资料。 3. 查询所有计算机系的班级信息。 4&#xff0e;查询艾老师所教的课程号。 5. 查询年龄小于30岁的女同学的学号和姓名。…

基于Java中的SSM框架实现萌宠优购系统项目【项目源码】计算机毕业设计

基于Java中的SSM框架实现萌宠优购系统演示 研究背景 现在人们在生活中、工作中压力与日俱增&#xff0c;而宠物也在人们的生活扮演者越来越重要的角色。然而&#xff0c;对于一些宠物爱好者来说&#xff0c;宠物早已经是他们生活中不可或缺的一部分。因为宠物能与人有心灵的沟…

【开放词汇分割】GroupViT: Semantic Segmentation Emerges from Text Supervision

论文链接&#xff1a;GroupViT: Semantic Segmentation Emerges from Text Supervision 代码链接&#xff1a;https://github.com/NVlabs/GroupViT/tree/main 作者&#xff1a;Jiarui Xu, Shalini De Mello, Sifei Liu, Wonmin Byeon, Thomas Breuel, Jan Kautz, Xiaolong Wa…

Centos 9Ubuntu 22.0.3图形搭建网桥

1、安装bridge-utils软件 [root@devcops612 ~]# yum install bridge-utils.x86_64 2、创建桥接器 [root@devcops612 ~]# cd /etc/NetworkManager/system-connections [root@devcops612 ~]# nmcli connection show #查看网络连接,确认桥接物理接口 [root@devcops612 system…

吴恩达机器学习作业ex4:反向神经网络学习(Python实现)详细注释

文章目录 1.神经网络1.1 可视化数据1.2 模型表示1.3 前馈和成本函数1.4 正则化代价函数 2.反向传播2.1 Sigmoid的导数2.2随机初始化2.3 反向传播2.4梯度检测2.5 正则化神经网络2.6 优化参数 3.可视化隐藏层 1.神经网络 在上一个练习中&#xff0c;您为神经网络实现了前馈传播&…

Steam怎么卸载DLC Steam怎么只卸载DLC不卸载游戏教程

我们玩家在steam中玩游戏&#xff0c;有一个功能特别重要&#xff0c;那就是DLC&#xff0c;其实也就是一款游戏的扩展&#xff0c;很多游戏都有DLC&#xff0c;让游戏玩法特别丰富&#xff0c;比如都市天际线的DLC&#xff0c;给城市中就增加了很多建筑&#xff0c;或者更便捷…

第十二次作业

成功做出insert 点击新增跳转到insert.html 点击增加&#xff0c;跳转回studentinformation2.html 数据表和页面都显示出新增的数据了 成功做出来删除 点击删除按钮 点击确定&#xff0c;丽丽被成功删除&#xff01; 一些代码

【Linux】进程间通信_2

文章目录 七、进程间通信1. 进程间通信分类管道 未完待续 七、进程间通信 1. 进程间通信分类 管道 管道的四种情况&#xff1a; ①管道内部没有数据&#xff0c;并且具有写端的进程没有关闭写端&#xff0c;读端就要阻塞等待&#xff0c;知道管道pipe内部有数据。 ②管道内部…

混合云管道的未来:集成 MinIO、Tailscale 和 GitHub Actions

数据处理是现代软件开发的基本实践。它使团队能够自动收集、处理和存储数据&#xff0c;确保高质量的数据和高效的处理。 在本文中&#xff0c;我们将探讨如何建立一个全面的数据处理管道&#xff0c;重点介绍如何使用 Tailscale GitHub Action 进行安全网络。此设置还将包含 …

MindManager2024思维导图大升级!轻松绘制思维导图

思维导图大升级&#xff01;MindManager2024新体验 最近在用MindManager2024制作思维导图&#xff0c;感觉它是一款非常专业的软件。它的界面设计简洁明了&#xff0c;操作流畅&#xff0c;让我能够轻松地整理思绪、规划计划和记录灵感&#x1f4a1;。 MindManager思维导图工具…

电商平台是申请ICP许可证还是EDI许可证?

随着直播行业大火热&#xff0c;越来越多的企业开始从事电商业务&#xff0c;那么电商平台的&#xff0c;需要办理什么许可证&#xff1f;是ICP许可证还是EDI许可证&#xff1f;今天小编为您详细说明一下。 首先&#xff0c;不管是ICP许可证还是EDI许可证&#xff0c;都属于增…

写一个坏越的个人天地(三)

昨天卡巴卡巴还是投出了学习代码以来的第一份简历,遇到好的岗位还是想争取下的吧,虽然我觉得大概率还是gg了。 昨天完成了首页的上半部分 下半部分我的构思是左右栏,左侧为菜单栏,右侧为业务栏,左侧调整右侧router进行切换内容 可以用来展示js css的小demo 稍微调整下ro…

ONLYOFFICE8.1版本震撼来袭

目录 软件简介 产品概述&#xff1a; 功能特点&#xff1a; 技术原理&#xff1a; 版本与部署&#xff1a; 8.1版本更新 全新的PDF编辑器 1.文本编辑 2.页面处理 &#xff08;添加、旋转、删除&#xff09; 3.插入和调整各种对象&#xff0c;例如表格、形状、文本框、…

Redis之商品缓存

文章目录 什么是缓存添加Redis缓存缓存更新策略缓存穿透缓存空对象布隆过滤器 缓存雪崩给不同的key的TTL添加随机值利用Redis集群提高服务的可用性给缓存业务添加降级限流策略给业务添加多级缓存 缓存击穿互斥锁逻辑过期 缓存工具封装方法1 写入redis方法2 设置逻辑过期方法3 解…

Android集成高德地图SDK(1)

1.新建Android应用&#xff0c;确定应用包名 2.注册高德开放平台&#xff0c;打开控制台页面&#xff0c;应用管理&#xff0c;我的应用&#xff0c;创建新应用 3.添加Key 4.获取SHA1码 找到Android Studio自带的keytool 将其拖到cmd中&#xff0c;输入命令 -v -list -keystor…