【前端】-【性能优化常识】

news2024/11/20 6:12:31

目录

  • 前端性能优化指标
    • 首屏速度、白屏时间
      • 性能优化
        • 收效很大的操作:减少首屏资源体积
        • 收效不大或者特殊情况的优化操作
    • 操作速度、渲染速度
      • 造成操作卡顿和渲染慢的场景
      • 性能优化
    • 数据缓存
  • 补充知识
    • 异步加载
      • 加载方式一:prefetch加载
      • 加载方式二:script加载
      • 两种方式的对比和思考
      • 优化经验

前端性能优化指标

首屏速度、白屏时间

在这里插入图片描述
页面一打开的白屏时间,主要是由资源加载(耗时多)、JS执行造成的,在这段时间里,如果没有做骨架屏的话,页面都是白屏。JS执行完成后,已经知道页面要渲染什么了(此时页面已经能看到一些东西了,但是还不能看到完整的页面),就开始渲染页面,进行数据请求和DOM渲染

性能优化

收效很大的操作:减少首屏资源体积
  • 打包工具的压缩:webpack、vite的压缩,如webpack的tree-shaking

参考资料:webpack+vite前端构建工具全掌握

  • 异步加载:体积较大但又不是马上就需要的功能适合做异步加载,比如图片压缩功能使用了一个很大的第三方库,但该功能只在上传图片且选择选择了压缩时才会被用到,这一场景使用的第三方库很大且该功能和首屏渲染无关,可能用户都不会用这个功能,所以该功能的所有代码可以做异步加载
  • 更新为体积更小的新版本:有些老版本的库不支持tree-shaking,更新为新版本就支持了,比如xlsx0.1.2版本不支持按需引入,体积会很大,而换成最新版本就支持,可以大大减少体积

手段:按需引入配合tree-shaking可以极大的减少代码体积,一一排查项目中老版本的库,把他们升级为可以支持tree-shaking的新版本的库,优化了项目体积,加快首屏渲染

  • 能不用第三方库就不用第三库:如果只用到少量方法,尽量自己写,比如时间格式化的方法自己写可能就1k代码,没必要为了这一个方法引入一个库进来
  • 编写代码尽量减少体积:代码写得简洁

手段:将项目中使用了第三方库的工具方法改成自己写,优化重构代码,使代码精简,因此减少代码体积

  • 去除大的base64体积:打包工具会默认将小图标转成base64,这就相当于图片的体积计入JS或CSS里了,但是如果没有配置好,会将大图片也转成base64,图片(img标签)不会影响首屏的加载,因为图片(img标签)的加载不会阻塞页面的渲染,也就是DOM结构会先出来,再慢慢加载图片,所以,打的图片或者媒体资源都不要转base64。
收效不大或者特殊情况的优化操作
  • 首屏数据尽量并行,如果可行让小数据量接口合并到其他接口:
    (1)非必须不要等上一个接口请求完毕后再发下一个接口,尽量并行调用接口
    (2)如果一个接口只返回一个很小的字符串,如果后端业务允许的话,可以将其合并到其他接口中。接口请求的时间包括数据传输和三次握手的的时间,传输数据多了接口肯定会慢,为了一点点数据还要进行三次握手实属没必要。
  • 页面包含大量dom可以分批随滚动渲染:和虚拟滚动、大数据量加载是一个思想

参考视频:
el-table大数据量渲染
切片思想优化

  • 骨架屏,loading,先让屏幕不白,减少用户焦虑:有时因业务场景要求,实在是无法减少体积,加快速度了,做骨架屏和loading遮罩,让用户先看到一些东西

操作速度、渲染速度

造成操作卡顿和渲染慢的场景

  • 一次性操作大量dom
  • 进行了复杂度很高的运算(常见于循环)
  • vue和react项目中,不必要的渲染太多

性能优化

  1. 一次性操作大量dom:和前面一样,分批渲染,虚拟滚动,切片渲染等
  2. 不进行复杂度很高的运算:循环中的操作尽量精简(其实意义不大)
  3. vue和react的渲染性能优化:
    (1)频繁切换的显隐的内容用v-show也就是display来控制隐藏,只有打开就一次性决定显示与否的用v-if不去创建
    (2)循环,动态切换内容加好key值
    (3)keep-alive缓存
    (4)区分请求粒度,减少请求范围,也能减少更新:修改了数据,要请求接口,只请求所涉及的接口,其他接口不请求

手段:很多增删改查操作后,更新页面时会一股脑的把所有接口请求一遍,对其进行重构

数据缓存

  1. 谨慎缓存接口数据。只有不变数据,定期时效可以缓存在cookies或者localstorage中,比如token,用户名等
  2. 对于接口数据,可以考虑做一个缓存队列存于内存中(全局对象,vuex)。这样能保证刷新就更新数据,也能一定程度上缓存数据

参考资料:axios二次封装

补充知识

异步加载

首屏速度影响最大的决定性因素是资源的加载速度,资源的加载速度=资源大小+网速,资源大小影响的方面有:

  1. 压缩:打包;传输时gzip压缩
  2. 一部分代码分割出来做异步加载,需要的时候再加载
  3. 写代码尽量精简

加载方式一:prefetch加载

page3异步加载的代码会从App.js中拆分出来,单独作为一个js,并为其标记prefetch,而同步加载的代码会放在App.js中,vendor中存放同步加载代码使用到的第三方库
在这里插入图片描述
异步加载就是用import方法引入,about页面做的就是异步加载,home页面做的同步加载
在这里插入图片描述
当有多个prefetch的时候,可以使用webpackPrefetch为每个设置优先级,优先级越高(数字越大)越先加载,其中,webpackPrefetch:true等同于webpackPrefetch:0
在这里插入图片描述

加载方式二:script加载

在这里插入图片描述
vue3已经内置了webpack配置,所以我们需要手动关闭prefetch配置,在vue.config.js中添加以下代码:
在这里插入图片描述

两种方式的对比和思考

  1. script加载:
    (1)做到了充分按需引入,用到的时候再加载,不用则永不加载,充分节省了带宽
    (2)最大的问题在于,切换需要等待,体验不是很流畅
  2. prefetch加载:
    (1)充分利用使用者不占用带宽的浏览时间,切换到异步加载的页面是可能已经加载好了,用户体验更流畅
    (2)一些本次行为不会打开的页面也会加载,一定程度上浪费了带宽
    (3)使用该方式需考虑流量的问题,比如说移动端使用该方式需考虑手机流量

优化经验

  1. 使用按需引入(函数式版本):针对老项目,检查第三方库,有没有可以换成按需引入的库
  2. 在组件mounted阶段再引入库,或者用到这个功能时再引入

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

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

相关文章

如何查询电脑是否被锁定了IP地址?锁定IP会出现什么问题?

前言 电脑刚到手的时候,基本上是通过路由器DHCP进行IP分配的。路由器DHCP分配IP给电脑的好处是网络不会出现IP冲突,网络能正常使用。 有些电脑可能在DHCP自动获取IP时出现错误,所以小伙伴就会通过手动设置IP让电脑可以正常上网。 这样的操…

[CISCN2019 华东北赛区]Web2

[CISCN2019 华东北赛区]Web2 随便注册一个登录,发现 还有反馈页面,一看就知道大概率是xss,应该是为了得到管理员cookie扫描了一下,果然有admin.php后台登录 buu可以连接访问外网了,所以内部的xss平台关闭了&#xff0…

【P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布

[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题目背景 NOIP2014 提高组 D1T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种…

【笔记】OpenHarmony设备开发:搭建开发环境(Ubuntu 20.04,VirtualBox 7.0.14)

参考:搭建开发环境(HarmonyOS Device) Note:Windows系统虚拟机中Ubuntu系统安装完成后,根据指导完成Ubuntu20.04基础环境配置(HarmonyOS Connect 开发工具系列课) 系统要求 Windows系统要求&…

Warning logs 2024-03-23

给旧的笔记本安装ubuntu系统,并实现ssh远程连接 1、下载ubuntu系统 ubuntu下载链接 选择带桌面版本 2、准备U盘 3、使用UltraISO制作启动盘 使用UltraISO,打开刚才下载的ubuntu**.iso文件 4、进入BIOS,选择U盘启动 5、Warning 1 invali…

[Android]创建Google Play内购aab白包

开发时需要调试Google内购,需要先往Google商店传一个白包上去。确定包名,然后进行内购产品创建。 1.创建一个空项目,填写正式名称和正式包名。 如果你只是为一个测试开发账号打白包,然后进行内购测试,这时包名随便写…

深度学习中常用计算距离的几种算法对比与python实现

前言 距离度量在许多机器学习算法中扮演着至关重要的角色,无论是监督学习还是无监督学习。选择适当的距离度量可以显著影响模型的性能。 在高维数据集中,欧几里得距离可能会受到所谓的“维度诅咒”的影响,因为随着维度的增加,数…

如何打包springboot项目并部署服务器

创建一个springboot项目&#xff0c;先写一个接口&#xff0c;我这里是dabaimao/jiekou,启动访问 在pom中加上maven插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin<…

Qt 图形视图 /图形视图框架坐标系统的设计理念和使用方法

文章目录 概述Qt 坐标系统图形视图的渲染过程Item图形项坐标系Scene场景坐标系View视图坐标系map坐标映射场景坐标转项坐标视图坐标转图形项坐标图形项之间的坐标转换 其他 概述 The Graphics View Coordinate System 图形视图坐标系统是Qt图形视图框架的重要组成部分&#xf…

【win10 win11添加右键】git bash

打开注册表编辑器。 按下Win键 R&#xff0c;然后输入”regedit”并按下回车键来打开注册表编辑器。计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\git_bash\command2. 导航到注册表路径&#xff1a;依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。右键…

Git入门(Git快速下载,安装,配置,远程仓库,本地仓库,IDEA提交代码,VScode提交代码使用方案一体)

Git快速下载 通过阿里镜像可以自由挑选版本并快速下载CNPM Binaries Mirrorhttp://npm.taobao.org/mirrors/git-for-windows/ 这里安装最新版本 下载安装文件 安装完后双击文件即可开始安装git 安装 git的安装傻瓜式Next即可 配置 打开git&#xff1a;桌面空白处右击&#…

FTLK-1.3.9的编译和使用

文章目录 1. FTLK-1.3.9源码下载 1. FTLK-1.3.9源码下载 前往FTLK官网下载FTLK-1.3.9源码 *

ARM IHI0069F GIC architecture specification (4)

1.3 支持的配置和兼容性 在 Armv8-A 中&#xff0c;EL2 和 EL3 是可选的&#xff0c;PE 可以支持一个、两个或都不支持这些异常级别。 然而&#xff1a; • PE 要求EL3 支持安全和非安全状态。 • PE 需要EL2 来支持虚拟化。 • 如果未实施EL3&#xff0c;则只有一个安全状态。…

信号处理--基于DEAP数据集的情绪分类的典型深度学习模型构建

关于 本实验采用DEAP情绪数据集进行数据分类任务。使用了三种典型的深度学习网络&#xff1a;2D 卷积神经网络&#xff1b;1D卷积神经网络GRU&#xff1b; LSTM网络。 工具 数据集 DEAP数据 图片来源&#xff1a; DEAP: A Dataset for Emotion Analysis using Physiological…

【二】TensorFlow神经网络模型构建之卷积函数

卷积函数是构建神经网络的重要支架&#xff0c;是在一批图像上扫描的二维过滤器。 tf.nn.convolution(input,filter,padding,stridesNone,dilation_rateNone,nameNone,data_formatNone)该函数计算N维卷积的和。tf.nn.conv2d(input,filter,padding,strides,use_cudnn_on_gpuNon…

【卫星影像三维重建】有理函数模型库-rpcm

卫星成像模型rpcm库使用 1.介绍1.1 卫星成像模型1.2 rpcm库 2.安装2.1 依赖库2.2 安装 3.用法3.1 投影3.2 定位3.3 影像裁剪crop3.3.1 使用说明3.3.2 具体使用 3.4 footprint3.5 angle影像的成像夹角 4.参考 1.介绍 1.1 卫星成像模型 卫星遥感影像的成像模型是描述影像与地面…

从零开始搭建游戏服务器 第七节 创建GameServer

目录 前言正文创建GameServer模块修改配置创建NettyClient连接到登录服登录服修改创建协议游戏服注册到登录服 总结 前言 上一节我们使用自定义注解反射简化了协议解包和逻辑处理分发流程。 那么到了这里登录服登录服的架构已经搭建的差不多了&#xff0c;一些比较简单的、并发…

pyhive入门介绍和实例分析(探索票价与景点评分之间是否存在相关性)

介绍 PyHive 是一组 Python DB-API 和 SQLAlchemy 接口&#xff0c;可用于 Presto 和 Hive。它为 Python 提供了一个与 Presto 和 Hive 进行交互的平台&#xff0c;使得数据分析师和工程师可以更方便地进行数据处理和分析。 以下是使用 PyHive 进行数据分析时需要注意的几点&…

HWOD:名字的漂亮度

一、题目 描述 给出一个字符串&#xff0c;该字符串仅由小写字母组成&#xff0c;定义这个字符串的漂亮度是其所有字母漂亮度的总和 每个字母都有一个漂亮度&#xff0c;范围在1到26之间。没有任何两个不同字母拥有相同的漂亮度。字母忽略大小写。 给出多个字符串&#xff…

面试篇:HashMap

1.问&#xff1a;了解过红黑树吗&#xff1f;它有什么性质&#xff1f; 答&#xff1a;红黑树是一种自平衡的二叉搜索树&#xff0c;他的查找&#xff0c;添加和删除的时间复杂度都为O(logN)。 他有以下五种性质&#xff1a; 1.红黑树的节点只有红色或者黑色两种颜色 2.红黑树的…