前端需要理解的性能优化知识

优化的目的是展示更快、交互响应快、页面无卡顿情况。

1 性能指标

2 分析方法

使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序,Performace观察页面渲染表现及JS执行情况,Lighthouse对网站进行整体评分,找出可优化项。

DOM的解析受JS加载和执行的影响,找到最长请求路径文件的耗时,尽量对JS进行压缩、拆分处理(HTTP2下),能减少 DOMContentLoaded 时间。图片、视频、iFrame等资源,会阻塞 onload 事件的触发,需要优化资源的加载时机,尽快触发onload。

页面LCP触发时间较晚,且出现多次布局偏移,则会影响用户体验,需要尽早渲染内容和减少布局偏移。页面 Long Tasks 较多,则需要对 JS进行合理拆分和加载,减少 Long Tasks 数量,特别是影响 DCL 和 onload 的 Task。

3 优化加载耗时

3.1 JS 资源

JS 资源:根据是否参与首屏渲染将影响 DOM 解析的 JS 资源划分为:关键 JS(采用拆分处理进行优化)和非关键 JS(采用延迟异步加载进行优化)。

使用 webpack-bundle-analyzer(如果是vite项目,推荐使用rollup-plugin-visualizer)进行打包分析关键 JS 文件数量和体积。优化近乎一半的关键  JS 文件体积。

首先配置正确的spliteChunks规则,不能简单的依靠 miniChunks 规则(比如miniChunks等于3,则会将某个页面使用三次的也打进去),对于所有页面都会加载的公共文件vendor.js(第三方),根据业务具体的需求,使用cacheGroups的test方法提取不同页面和组件都有的共同依赖(包括utils/log/api)到vendor中。而剩下的公共依赖新增一个common.js,提高 miniChunks 的阈值比如20,保证打包到common.js的是大多数页面的公共依赖,提供缓存利用率。

然后是按需加载组件,优化前存在require 来加载 svg 图片,会导致 webpack 将 require 文件夹内的内容一并打包,导致页面图标组件冗余,可以通过配置 babel 的依赖加载路径调整 Icon 的引入方式,通过 import { Fire,ToTop } from 'components/Icons' 进行按需引入。

对业务组件进行代码分割(code splitting),考虑对不在首屏的页面组件进行拆分再延迟加载,减少业务代码 JS 大小和执行时长,使用React 官方提供的React.lazy实现。

 还可以用到Tree Shaking(用于描述移除 JavaScript 上下文中的未引用代码(dead-code)的行为。它依赖于 ES2015 中的 import 和 export 语句,用来检测代码模块是否被导出、导入。) 优化,即对于引用到的包/模块/方法等,tree Shaking 检查时会进行删除。可以给引入的包/模块(不是用来做 ponyfill 或 shim 之类) 标记为 sideEffects: false ,只要它没有被引用到,整个模块/包都会被完整的移除,以及包和模块中没有被引用部分也会被删除,只保留用到的。

非关键JS在弱网环境会成为影响 DOM 解析的因素。对于监控上报(灯塔 sdk)等非关键JS资源,选择延迟加载它,或者在其他 JavaScript 之后立即加载,或者直到需要时才加载。

3.2 媒体资源(图片、视频)

首先是使用TinyPng对图片进行多次合理压缩,其次对于首屏没有展示的图片或视频等媒体资源借助lazy load库进行懒加载处理,而且需要注意懒加载不能阻塞业务的正常展示,应该做好超时处理、重试等兜底措施。

其他优化包括将 iframe 的时机放在 onload 之后,并设置setTimeout进行异步加载。将原先的image get方式上报埋点数据采取beacon上报的方式。

4 优化页面渲染

直出页面(SSR)优化,通过日志打点、查看 Nginx Accesslog 日志、网关监控耗时,发现页面TTFB时间过长的根本原因是SSR 服务器程序和NGW 网关部署和反向代理网关 Nginx 集群不在同一区域导致的网络时延。解决方案是让 NGW网关、反向代理网关 Nginx 集群和SSR 服务器服务机房部署在同一区域,即执行对网关 NGW 进行扩容和分布式服务开启就近访问。相较优化前平均耗时140ms左右,优化后控制在40ms以内。

页面首屏的关键CSS进行内联优化,CSS文件的加载不会阻塞页面解析,但会阻塞页面渲染。如果 CSS 文件较大或弱网情况,会影响到页面渲染时间,影响用户体验。利用 ChromeDevTool 的 More Tools 里的 Coverage 工具,录制页面渲染时 CSS 的使用率,发现首屏的使用CSS 只不到20%,利用 webpack 插件 critters 实现(用于内联关键 CSS 并延迟加载其余部分),与加载其余完整 CSS 文件进行分离,避免首屏页面渲染被 CSS 阻塞。

优化页面视觉稳定性(CLS),尽量使首屏页面内容相对固定,页面元素出现无突兀感,避免图标缺失、背景图缺失、字体大小改变或者出现非预期页面元素导致页面抖动,解决方案如下:1. 确定直出页面元素出现位置,根据数据提前做好布局;2. 首屏页面的小图可以通过base64处理,页面解析的时候就会立即展示;3. 减少动态内容对页面布局的影响,使用脱离文档流的方式或定好宽高。

5 骨架屏处理

骨架屏(Skeleton Screen)是指在页面数据加载完成前,先给用户展示出页面的大致结构(灰色占位图),不会造成网页长时间白屏或者闪烁,在拿到接口数据后渲染出实际页面内容然后替换掉,本质上是界面加载过程中的过渡效果。

image切换

原理:使用一张占位骨架图(svg / lottie / gif)来代替 loading 效果,当数据加载完成后对替换掉骨架图。

优缺点:优点是实现简单,开发成本较低。缺点是维护成本较高,对于迭代比较频繁的页面,增大UI设计的工作量。

实现

首先使用 preload 提高图片加载优先级,让骨架图更早的显示,其次需要尽量减少图片的体积以加快加载速度,最后由于浏览器对同一域名的请求有并发限制,骨架屏的图片尽量放在单独的域名上,最后获取数据后隐藏图图片,显示真实 DOM 元素。

 

手动CSS + html

原理:用 css + html 实现一个骨架屏的元素,当数据加载完成后替换掉。代表是react-content-loader(是利用svg实现的)。

优缺点:优点是相对image切换实现灵活,更易维护,由于需要在开发时为每个元素添加背景,开发和维护成本仍然较高。

实现:通过 animation: loading 2s ease infinite;控制背景移动实现从左到右的进度效果或通过 animation: opacity 2s ease infinite;控制透明度实现渐隐渐现的动画效果;获取到数据后,去掉 skeleton 选择器.

自动生成css + html骨架屏实现

原理:借助getBoundingClientRect()方法,获取到元素相对于可视窗口的位置以及宽高。通过简化所有元素,不考虑结构层级、不考虑样式,对所有元素统一用 div 去代替,而且在骨架中只需要渲染最后一个层级,以定位的方式设置每个元素其相对于视窗的位置,形成骨架屏。这样生成的节点是扁平的,体积比较小,同时避免额外的读取样式表,而且不需要通过抽离样式维持骨架屏的外观,使得骨架屏的节点更可控。该方法生成的骨架屏是由纯 DOM 颜色块拼成的。

优缺点:优点是自动化,降低重复编写骨架屏代码的成本,缺点是对于复杂的页面,可能受元素定位的影响较大,自动生成的时候存在不确定性。另外,只能是首次加载,对于加载完成后用户触发的动态数据不支持生成骨架屏。可以结合前面的手动CSS + html配合为动态数据生成。

实现:

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

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

相关文章

基于android的学生公寓后勤系统/学生公寓管理系统APP

摘 要 随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应…

PCB设计常见问题

Fill Mode中存在3个选项 Solid(Copper Regions) Hatched(Tracks/arcs) None(outlines) 区别Solid(Copper Regions)过大电流的能力更强,且对于电路板存在的分布电容的干扰…

第三张鼠标键盘的高效使用

引言: 对于键盘的熟练使用更是一个网络时的基本技能所有要成为一个好的网络工程师我们应该熟练键盘操作已经能熟练的使用一些常用软件。––键盘和鼠标。速速度的唯一途径就是多演戏打字速快对今后的学习是有好处的。 一 鼠标和键盘 键盘和鼠标是两种常用的输入设备。 (一…

鼠标跟随的实现

鼠标跟随主要根据X,Y轴来计算 主要代码函数是 span[0].style.left event.clientX “px”; 计算X轴 span[0].style.top event.clientY “px”; 计算Y轴 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title>&…

虚拟机Ubuntu内鼠标闪烁终极解决方案

话说这个问题很早就遇到了&#xff0c;最近才解决&#xff0c;不免唏嘘。 由于造成鼠标闪烁的原因有很多&#xff0c;鼠标闪烁的特点也有很多&#xff0c;因此网上也充斥着很多解决方案&#xff0c;这里一并做一下梳理&#xff0c;以节约各位看众时间。 1.通用解决方法 这个方…

数据结构--树4.2.1(二叉树)

目录 一、二叉树的存储结构 二、二叉树的遍历 一、二叉树的存储结构 顺序存储结构&#xff1a;二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点&#xff0c;并且结点的存储位置能体现结点之间的逻辑关系。 链式存储结构&#xff1a;二叉树每个结点最多只有两个孩…

手把手带你学python自动化测试(五)——鼠标键盘操作

在浏览器中&#xff0c;通常会用到鼠标来进行操作&#xff0c;比如右键菜单中选择一个操作&#xff0c;在 selenium 中提供了下列鼠标相关操作。 ActionChains 类似提供了以下方法&#xff1a; context_click() 右击 double_click() 双击 drag_and_drop() 拖拽 鼠标右击 …

7,鼠标学习二

《鼠标学习一》描述的是鼠标在客户区情况下&#xff0c; 当鼠标在非客户区的时候呢&#xff1f; 窗口的非客户区包括&#xff1a;标题栏&#xff0c;菜单和窗口滚动条&#xff0c;系统一般不需要用户处理非客户区消息&#xff0c;只要将其发送个DefWindowProc即可&#xff0c…

Scractch3.0_Arduino_ESP32_图形化编程学习_蓝牙鼠标(四)

蓝牙鼠标 目的器材程序联系我们 目的 通过C02实现蓝牙鼠标。 器材 硬件: 齐护机器人C02 购买地址 软件:scratch3.0 下载地址:官网下载 程序 蓝牙鼠标使用使用ESP32自带的BLE蓝牙&#xff0c;不需要再外接模块。可以实现鼠标移动&#xff0c;左右键的点击动作。 联系我们…

程序员高效技巧系列 -- 完全脱离鼠标的终端

本文将介绍如果在tmux窗口管理环境下完全脱离鼠标完成日常工作 文章欢迎转载&#xff0c;但转载时请保留本段文字&#xff0c;并置于文章的顶部 作者&#xff1a;卢钧轶(cenalulu) 本文原文地址&#xff1a;http://cenalulu.github.io/linux/professional-tmux-skills/ 前言 终…

python模拟鼠标控制思路探讨(一)

前言 近期学了用pynput模块来模拟鼠标操作&#xff0c;可知鼠标移动操作分为两种方式&#xff1a; 设置鼠标坐标&#xff1a;mouse.position (x,y)设置鼠标移动量&#xff1a;mouse.move(dx,dy) 在现实的人为操作中&#xff0c;鼠标移动轨迹不可能是直接的两点直线式移动&a…

方案解读:为什么要选择LPC55系列做电竞鼠标键盘

电竞一词越来越热&#xff0c;农药、LOL、吃鸡不但在手游端大热无比&#xff0c;PC端也是热的发紫&#xff0c;电竞奥运会也指日可待。 随之而来的是电竞类的键盘、鼠标以及耳麦的热销。玩家拼手速的时代要求着键盘鼠标USB Report Rate的提高&#xff0c;不然王者般的手速到了U…

7. 鼠标学习一

鼠标消息&#xff1a; 1.windows只把键盘消息发送到当前具有输入焦点的窗口。鼠标消息则不同&#xff0c;当鼠标经过窗口或在窗口内被单击&#xff0c;则即使该窗口是非活动窗口或不带输入焦点&#xff0c;窗口过程还是会收到鼠标消息。 2.windows定义了21种鼠标消息&#xff…

RGB发光LED七彩鼠标垫无线充MCU方案

RGB发光LED七彩鼠标垫无线充MCU方案大家在选择电脑外设的时候往往会注重键盘、鼠标甚至是USB HUB&#xff0c;对于鼠标垫大都本着“随便捡一个都能用”的心态&#xff0c;以我们单位来说&#xff0c;绝大多数同事的鼠标垫都是买电脑时候店家赠送的&#xff0c;上面还印着各种各…

查看windows当前占用的所有端口、根据ipt终止任务进程、OS、operatingSystem

文章目录 查询端口查询指定端口根据进程pid查询进程名称查看所有进程名称根据pid终止任务进程根据进程名称终止任务 查询端口 netstat -ano查询指定端口 netstat -ano | findstr "80"根据进程pid查询进程名称 tasklist | findstr "660"查看所有进程名称 ta…

蓝蓝设计ui设计公司作品案例-中节能现金流抗压测试软件交互及界面设计

中国节能是以节能环保为主业的中央企业。中国节能以生态文明建设为己任&#xff0c;长期致力于让天更蓝、山更绿、水更清&#xff0c;让生活更美好。经过多年发展&#xff0c;中国节能已构建起以节能、环保、清洁能源、健康和节能环保综合服务为主业的41产业格局&#xff0c;成…

教你如何修复硬盘坏道

由于硬盘采用磁介质来存储数据&#xff0c;在经历长时间的使用或者使用不当之后&#xff0c;难免会发生一些 问题&#xff0c;也就是我们通常所说的产生“坏道”&#xff0c;当然这种坏道有可能是软件的错误&#xff0c;也有可能是硬盘本身硬件故障&#xff0c;但是并不是说硬盘…

服务器硬盘坏道修复教程视频,坏道和坏块什么区别?硬盘高级修复教程来了

坏道和坏块什么区别&#xff1f;硬盘高级修复教程来了 2019-04-22 15:12:25 5点赞 27收藏 1评论 硬盘的容量和性能随着技术发展不断进步&#xff0c;但我们依然不可避免的要面对使用寿命。机械硬盘的坏道和固态硬盘的坏块之间有什么区别&#xff1f;出现坏道/坏块该如何修复&am…

硬盘坏道修复方法

常识&#xff1a;硬盘坏道分类 - 不同坏道分仔细 由于硬盘采用磁介质来存储数据&#xff0c;在经历长时间的使用或者使用不当之后&#xff0c;难免会发生一些问题&#xff0c;也就是我们通常所说的产生“坏道”&#xff0c;当然这种坏道有可能是软件的错误&#xff0c;也有可能…

配置Flink

配置flink_1.17.0 1.Flink集群搭建1.1解压安装包1.2修改集群配置1.3分发安装目录1.4启动集群、访问Web UI 2.Standalone运行模式3.YARN运行模式4.K8S运行模式 1.Flink集群搭建 1.1解压安装包 链接: 下载Flink安装包 解压文件 [gpbhadoop102 software]$ tar -zxvf flink-1.1…