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

目录

  • 前端性能优化指标
    • 首屏速度、白屏时间
      • 性能优化
        • 收效很大的操作:减少首屏资源体积
        • 收效不大或者特殊情况的优化操作
    • 操作速度、渲染速度
      • 造成操作卡顿和渲染慢的场景
      • 性能优化
    • 数据缓存
  • 补充知识
    • 异步加载
      • 加载方式一: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阶段再引入库,或者用到这个功能时再引入

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库原理与应用(SQL Server)笔记 前言 数据库基本概念

目录 一、数据(Data)二、数据库(DB)三、数据库管理系统(DBMS)四、数据库系统(DBS)五、数据库系统结构六、独立性原则七、数据模型 一、数据(Data) 数据&…

【Mybatis 基础】增删改查(@Insert, @Delete, @Update, @Select)

Mybatis Insert Delete Update Select Mybatis用法基础操作 - 删除delete 传参SpringbootMybatisCrudApplicationTests 测试类删除预编译SQL 基础操作 - 插入Insert 插入SpringbootMybatisCrudApplicationTests 测试类插入对象主键返回 基础操作 - 更新UPDATE 更新SpringbootMy…

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解,并且每个知识点基本都会有例子演示,详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前,我们要先知道spring框架在开发时,服务器端采用三层架构的方…

【Java】LinkedList vs. ArrayList:Java中的数据结构选择

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

I2C系列(三):软件模拟I2C读写24C02

一.目标 PC 端的串口调试软件通过 RS-485 与单片机通信,控制单片机利用软件模拟 I2C 总线对 EEPROM(24C02) 进行任意读写。 二.硬件简述 2.1 24C02硬件参数 24C02器件地址为0x50,存储容量为256字节,存储单元地址位数…

HarmonyOS网格布局:List组件和Grid组件的使用

简介 在我们常用的手机应用中,经常会见到一些数据列表,如设置页面、通讯录、商品列表等。下图中两个页面都包含列表,“首页”页面中包含两个网格布局,“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的列表…

【双指针】Leetcode 查找总价格为目标值的两个商品

题目解析 LCR 179. 查找总价格为目标值的两个商品 本题很友好&#xff0c;只需要返回任意一个 算法讲解 这道题很显然就是使用对撞双指针&#xff0c;一个从左边&#xff0c;一个从右边&#xff0c;两边进行和target比较来移动 代码编写 class Solution { public:vector<…

docker 搜索镜像命令

docker 搜索镜像命令 命令格式 docker search 关键字 如&#xff1a;docker centos 结果 result :

机器学习基础——模型评估与选择(部分)

目录 一、前言&#xff1a;误差与拟合 &#xff08;一&#xff09;经验误差 &#xff08;二&#xff09;过拟合、欠拟合 二、评估方法 &#xff08;一&#xff09;评估总体的思路 &#xff08;二&#xff09;如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

灵途科技助力家电智能创新

从智能家电到个护健康&#xff0c;科技无时无刻不在刷新我们对智慧生活的认知&#xff0c;我们也从未像今天这样近距离贴近智慧生活的朴素本质——传感技术。灵途科技专注光电感知技术&#xff0c;持续为智能家电客户提供成熟的全方位感知解决方案。步入发展第八年&#xff0c;…

在vscode终端terminal加大栈空间How to increase max stack size in c++ using vscode

参考:https://devpress.csdn.net/cloud/63268204fd0b112779162383.html Answer a question In many dynamic programming and graph problems it is required to do long depth recursion. I am currently using vscode and mingw in windows for my c programs. But in defau…

MySQL Explain 字段详解

Explain 工具介绍 Explain 一般被称为解释器&#xff0c;通过 Explain 工具&#xff0c;我们能分析我们使用的查询语句或是结构的性能瓶颈&#xff0c;它提供 MySQL 如何执行语句的信息。 使用语法&#xff1a; explain [extended|partition] select在 select 关键字前加 ex…

3D软件坐标系速查

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 基本上&#xff0c;游戏引擎和3D软件包最重要的问题是根据软件的坐标轴系统创建资产&#xff0c;正确缩放它们并根据要完成的工作设置枢轴系统。 坐标系正确性的定义可能会根据模型导入的游戏引擎或 3D 软件而变化。…

微服务高级篇(五):可靠消息服务

文章目录 一、消息队列MQ存在的问题&#xff1f;二、如何保证 消息可靠性 &#xff1f;2.1 生产者消息确认【对生产者配置】2.2 消息持久化2.3 消费者消息确认【对消费者配置】2.4 消费失败重试机制2.5 消费者失败消息处理策略2.6 总结 三、处理延迟消息&#xff1f;死信交换机…

HDFSRPC通信框架详解

本文主要对HDFSRPC通信框架解析。包括listener&#xff0c;reader&#xff0c;handler&#xff0c;responser等实现类的源码分析。注意hadoop版本为3.1.1。 写在前面 rpc肯定依赖于socket通信&#xff0c;并且使用的是java NIO。读者最好对nio有一定的了解&#xff0c;文章中…

【Flask】用户身份认证

Flask 用户身份认证 项目代码见&#xff1a;GitHub - euansu123/FlaskMarket 前提条件 # flask-bcrypt 用户密码加密存储 pip install flask_bcrypt -i https://pypi.tuna.tsinghua.edu.cn/simple/ # flask提供的用户登录方法 pip install flask_login -i https://pypi.tuna…

JetBrains全家桶激活,分享 DataGrip 2024 激活的方案

大家好&#xff0c;欢迎来到金榜探云手&#xff01; DataGrip 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工…

git clone没有权限的解决方法

一般情况 git clone时没有权限&#xff0c;一般是因为在代码库平台上没有配置本地电脑的id_rsa.pub 只要配置上&#xff0c;一般就可以正常下载了。 非一般情况 但是也有即使配置了id_rsa.pub后&#xff0c;仍然无法clone代码的情况。如下 原因 这种情况是因为ssh客户端…

阿里云安全产品简介,Web应用防火墙与云防火墙产品各自作用介绍

在阿里云的安全类云产品中&#xff0c;Web应用防火墙与云防火墙是用户比较关注的安全类云产品&#xff0c;二则在作用上并不是完全一样的&#xff0c;Web应用防火墙是一款网站Web应用安全的防护产品&#xff0c;云防火墙是一款公共云环境下的SaaS化防火墙&#xff0c;本文为大家…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现四

【简单介绍】 经过精心设计和深度整合&#xff0c;我们成功推出了这款融合了先进目标检测算法YOLOv8与高效PyQt5界面开发框架的目标检测GUI界面软件。该软件在直观性、易用性和功能性方面均表现出色&#xff0c;为用户提供了高效稳定的操作体验。 在界面设计方面&#xff0c;…