前端性能优化介绍与常见方法(二)

news2024/11/15 18:02:08

这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~

主页: oliver尹的主页

格言: 跌倒了爬起来就好~

目录

一、前言

二、本文内容概述

三、性能优化

3.1 加载性能优化

3.2 构建优化

3.2.1 javascript压缩

3.2.2 CSS压缩

3.3 渲染优化

3.3.1 减少回流

3.3.2 减少布局次数

3.3.3 防抖与节流

3.4 缓存性能优化

3.4.1 浏览器缓存

五、小结


一、前言

最近我司的小伙伴在项目上遇到一些问题,是关于性能上的,因此我们探讨了一些关于前端性能优化方法,再加上自己的一些日常学习笔记,重新整理后有了本文~

耐心看完,你也许有所收获~

二、本文内容概述

本文先是具体分享了一些日常开发中可能遇到的性能优化点或者说是方法,难度:中级

三、性能优化

3.1 加载性能优化

加载性能优化中最常见的,就是 首屏加载时间的优化,如果是Vue/React的项目这种单页面项目,那站点在首次加载的时候会更加的慢,原因是首次加载的时候会将整个前端项目一下子发送到浏览器...

过长的等待时间,会让用户的耐心消耗殆尽,可能在等待的过程中就直接离开站点了,因此首屏的优化往往就特别重要!

以B站为例,如下图,我们可以看到,当打开B站的首页的时候,请求了83项,共计2.1M的资源大小

但是随着屏幕的滚动,加载的资源会越来越多,如下

这种就是 懒加载 的技术,

说穿了就是只显示可视区域的内容,超出可视区域的内容在未被显示的时候处于没有加载的状态,至于为什么会有偏移量,原因是因为如果正好在页面中出现才进行加载那么会有点晚,用户不能在第一时间看到要看的内容,因此做了一个提前量,一旦元素到达偏移量区域,那么我们就认为用户马上就要看到,应该要主动加载了~

实现的方式也并不复杂,已图片资源为例,将图片地址默认放在自定义属性上,只有当图片进入到偏移量区域时,才将图片上的data-src中的值主动赋值给src;

// 代码层面
<img data-src="图片地址" src="" />

另外,针对Vue/React这种单页应用,我们可以如下进行操作

<!DOCTYPE html>
<html lang="en" id="htmlRoot">
  <head>
    <title><%= title %></title>
    <link rel="icon" href="/favicon.ico" />
  </head>
  <body>
    <div id="app">
    	// lodaing动画效果
      <div class="app-loading">
        <div class="app-loading-wrap">
          <img src="/resource/img/logo.png" class="app-loading-logo" alt="Logo" />
          <div class="app-loading-dots">
            <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
          </div>
          <div class="app-loading-title"><%= title %></div>
        </div>
      </div>
    </div>
  </body>
</html>

在顶层元素中加上loading的动画效果,我们要知道,Vue/React当资源加载完毕时会主动的去覆盖顶层元素中的内容,我们通过利用这个特性达到了在资源没有加载完毕的时候依然有loading的动画,让用户稍等片刻~

3.2 构建优化

在这之前,我们先问个问题:通过构建上的优化为什么可以提高性能?

我们知道建立请求后开始请求资源的这个过程,如何快速的将所有资源都请求到是个值得关注的过程,那么如果快速的将所有资源都请求到呢?其实就是两点:

  • 第一个就是:资源压缩,将资源的体积变小,那么传输的时间就自然变少了;
  • 第二个就是:资源合并,将多个资源合并在一起,一次请求就相当于请求到了多个资源,这种自然也可以减少传输时间;

为了达成这两点,就是构建优化,以webpack为例(虽然现在vite等新起的构建工具越来越流行,但webpack其庞大的使用量依然是主流....)

3.2.1 javascript压缩

在webpack上大致有这么几种配置可以达到压缩的效果:

(PS:当使用terser-webpack-plugin进行压缩的时候,这个插件会默认进行多线程压缩,提高压缩速度)

3.2.2 CSS压缩

这里有一个注意点,不要使用style-loader把css直接嵌入到html里面,而是应该独立成css文件,这点很重要,原因也很简单,css的资源是无法并行被加载的,因此会降低渲染的性能;

因此,我们可以使用插件:min-css-extract-plugin 这个插件进行CSS代码的抽取和独立,配置后大致是这样的:

const CSSMinimizerPlugin = require("css-minminzer-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports={
	// 其他配置
	optimization:{
		minimize:true,
		minimizer:[new CSSMinimizerPlugin()]
	},
	plugins:[new MiniCssExtractPlugin()]
}

3.3 渲染优化

前两个优化主要的部分在http请求部分,这一部分则是在资源请求到后,在浏览器渲染进程里渲染成DOM的过程,这个过程大致有以下具体细节:

通过这个大致的流程我们发现,其实界面的渲染是一件挺麻烦的事,最好就是不要动这些已经渲染完成的DOM节点,但事实上,不动是不可能的,用户的日常工作不就是去和界面做交互,一旦交互开始,DOM节点就自然而然会发生各种改变....

3.3.1 减少回流

对于界面的改变,我们可以分成两类:重绘 回流,关于这两点我相信小伙伴们肯定很熟悉了,就不多介绍了,相比重绘,回流的影响更大,它是影响了页面上的众多节点的几何属性,因此整个页面需要全部重新走一遍上面的流程,对性能的影响可想而知;

因此,关于这一部分的优化目的其实只有一个:重绘更加消耗性能,尽量减少回流操作;大致有以下属性的修改会影响到回流:

  • 几何属性的改变,如:width,height,padding,margin,left,right等;
  • DOM树发生变化,如新增,修改,删除dom节点;
  • 获取特定属性值,比如offsetTop,scrollTop等;

3.3.2 减少布局次数

值得注意的是,对于下面这种写法我们要禁止

const dom = document.querySelector(".dom");

dom.style.width="100px";
dom.style.height="100px";
dom.style.border="1px solid #000000";

这种写法它修改了三次DOM的几何属性,因此界面会重新布局3次....这种事不可取的,合理的方式是给dom添加一个class

const dom = document.querySelector(".dom");
dom.classList.add('new-style');

.new-style{
  width:100px;
  height:100px;
  border:1px solid #000000
}

这种添加class的方式它 只会重新布局1次

3.3.3 防抖与节流

还有针对一些事件,比如

类似这种事件要加上防抖与节流,如果频繁的触发这些事件是必会导致页面的抖动与卡顿,因此无比要加,这里多嘴一句关于防抖与节流,防抖与节流本质上并不是减少事件的触发,而是减少回调函数触发的执行次数,它们的使用场景也有点不一样:

  • 节流:节流的含义就是以一个固定的间隔去执行一次函数,比如,1秒内按下了10次键盘,但我们通过节流限定了1秒只请求1次,这样便可以大幅减少请求次数;
  • 防抖:防抖的含义是短时间内高频次触发最终会被合并成1次,比如搜索的时候我们快速打了10个字,只有打完后的1秒内没有新文字输入,它才会去请求,一旦在1秒内有新文字输入它则会清空请求事件,不再触发;

防抖与节流的代码网上很多,包括lodash也有现成封装完成的,不再介绍了~

3.4 缓存性能优化

首先是针对 重复请求 的处理,要对已经获取的资源进行重复利用,因为重复的请求会消耗网络带宽,从而影响到用户体验;

3.4.1 浏览器缓存

浏览器缓存分为 强制缓存协商缓存

  • 强制缓存:请求的时候进行缓存字段检查,如果没有过期,直接从浏览器本地缓存中返回资源
  • 协商缓存:在浏览器使用本地缓存之前,向服务器发送请求判断一下本地缓存是否过期

通常情况下我们一般会以这种流程来做缓存的优先级

五、小结

本文具体介绍了一下性能优化的各个点

  • 加载上的优化,目的是通过减少http请求,懒加载技术,来减少首屏的加载时间;
  • 构建上的优化,目的是减少资源体积和数量,合理利用主流的构建工具,如webpack等来合并资源,压缩资源;
  • 缓存优化,目的是避免重复请求,但对于缓存的策略需要仔细斟酌,毕竟有利有弊;
  • 渲染优化,目的是降低高性能的操作,比如减少重绘和回流,合理的代码,以及及时释放资源;

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

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

相关文章

条件竞争漏洞Double Fetch

前言 Double Fetch(双取)是一种条件竞争的漏洞&#xff0c;相关的论文发表在USENIX&#xff0c;论文链接&#xff1a;https://www.usenix.org/system/files/conference/usenixsecurity17/sec17-wang.pdf Double Fetch Double Fetch是内核的一种漏洞类型&#xff0c;发生在内…

开发一个RISC-V上的操作系统(六)—— 中断(interrupt)和异常(exception)

目录 往期文章传送门 一、控制流 &#xff08;Control Flow&#xff09;和 Trap 二、Exceptions, Traps, and Interrupts Contained Trap Requested Trap Invisible Trap Fatal Trap 异常和中断的异同 三、RISC-V的异常处理 mtvec&#xff08;Machine Trap-Vector Ba…

【福利】免费白嫖Notability订阅版,无需越狱,支持无限笔记!

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 视频教程&#xff1a;【福利】免费白嫖Notability订阅版&#xff0c;无需越狱&#xff0c;支持无限笔记&#xff01;_哔哩哔哩_bilibili 下载爱思助手 连接iPad 搜索并安装12.1.8版本的notability iPad上打开软件…

redis初级redis入门redis数据类型redis常用命令redis持久化机制

Redis 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作RedisRedis持久化机制 1. Redis入门 1.1 Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 **官网&#xff1a;**https://redis.io **中文网&…

SpringBoot多环境切换及JSR303数据校验

多环境切换 profile是Spring对不同环境提供不同配置功能的支持&#xff0c;可以通过激活不同的环境版本&#xff0c;实现快速切换环境&#xff1b; 多配置文件 我们在主配置文件编写的时候&#xff0c;文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版…

高速公路巡检新手段——道路智能巡检系统

高速公路作为我国公路建设的一项重要成果&#xff0c;其建设和运营对于促进我国经济发展、改善交通运输条件和提高人民生活水平具有重要的意义。 高速公路巡检是确保公路安全的重要措施之一。每年数以万计的车辆在高速公路上穿行&#xff0c;因此高速公路的安全性显得尤为重要。…

【Hbuilder+夜神模拟器】连接过程中遇到的坑

1、安装 HBuilder X 官网戳这里 选择适合你的版本 双击直接运行 夜神模拟器官网戳这里 选择适合你的版本 双击直接运行 2、Hbuilder中配置 打开工具—设置—运行配置 adb路径可以点击右侧的浏览找到bin文件夹下的nox_adb.exe&#xff0c;Android模拟器端口默认是62001&…

释放OMO(线下线上融合)的力量:打造最强私域运营

在零售领域&#xff0c;新技术的出现促进了创新业务战略的发展&#xff0c;其中一种策略是OMO&#xff0c;即线下合并线上&#xff0c;它结合了线上和线下零售的优势&#xff0c;为客户提供无缝的购物体验。由于企业即时消息在在线客户沟通中发挥着重要作用&#xff0c;OMO 随着…

如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器

文章目录 前言一、认识注解&#xff1a;RestControllerAdvice和ExceptionHandler二、使用步骤1、封装统一返回结果类2、自定义异常类封装3、定义全局异常处理类4、测试 总结 前言 全局异常处理器是一种 &#x1f31f;✨机制&#xff0c;用于处理应用程序中发生的异常&#xff…

使用mybatis-plus的updateById方法更新一个numeric(1)类型字段,sql成功执行,但是updates为0,更新失败的解决办法

使用mybatis-plus的updateById方法更新一个numeric(1)类型字段&#xff0c;sql成功执行&#xff0c;但是updates为0&#xff0c;更新失败的解决办法&#xff1a; 背景&#xff1a;我有一张表&#xff0c;有个启用禁用功能&#xff0c;没有放在编辑页面一起编辑保存&#xff0c;…

使用sysbench对mysql数据库进行基准测试

目录 一、 安装sysbench 二、准备测试表及数据 三、开始测试 1、测试综合TPS 2、只读性能 oltp_read_only 3、删除性能 oltp_delete 4、更新索引字段性能 oltp_update_index 5、更新非索引字段性能 oltp_update_non_index 6、插入性能 oltp_insert 7、写入性能 ol…

SpringBoot Web开发静态资源处理

Web开发探究 简介 其实SpringBoot的东西用起来非常简单&#xff0c;因为SpringBoot最大的特点就是自动装配 使用SpringBoot的步骤&#xff1a; 1、创建一个SpringBoot应用&#xff0c;选择我们需要的模块&#xff0c;SpringBoot就会默认将我们的需要的模块自动配置好 2、手动…

湘大oj1138爱你一生一世题解:最大公约数 逆向思维 int整除会向下取整

一、链接 爱你一生一世 二、题目 题目描述 在2013年1月4日&#xff0c;这个“爱你一生一世”的特别日子&#xff0c;男生都想向自己的喜欢的女生表达爱意。 你准备在该死的C语言考试后&#xff0c;去向她&#xff08;或者他&#xff1f;&#xff09;告白。告白怎么能缺了礼…

八大排序

目录 选择排序-直接插入排序 插入排序-希尔排序 选择排序-简单选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序 归并排序 基数排序 选择排序-直接插入排序 基本思想: 如果碰见一个和插入元素相等的&#xff0c;那么插入元素把想插入的元素放在相等元素…

如何高效地阅读 Python 代码?

原文首发于&#xff1a;如何高效地阅读 Python 代码&#xff1f; | 今是昨非 | 技术.生活.阅读.思考 副标题&#xff1a;一个重要但很少被讨论的技能 从网上看到这篇英文文章&#xff0c;感觉还不错&#xff0c;翻译了一下。Claude2 也有参与翻译&#x1f61d; AI摘要 这篇文…

Linux基础与拓展

文章目录 虚拟机网络连接方式VIMvi和vim常用的三种模式各种模式的相互切换快捷键 用户管理权限 基本介绍&#xff1a;添加用户指定/修改密码删除用户切换用户用户组 路径命令学习mkdir命令介绍语法注意 touch 创建文件介绍语法 cat 查看文件内容介绍语法 more 查看文件内容介绍…

vue3报错

这是因为eslint对代码的要求严格导致的&#xff0c;可以在package.json里面删掉"eslint:recommended"&#xff0c;然后重启就可以正常运行了

软件编程专业:探索计算机世界的奥秘

软件编程专业&#xff1a;探索计算机世界的奥秘 随着科技的飞速发展&#xff0c;计算机已经渗透到我们生活的方方面面。我们每天都在使用各种应用程序&#xff0c;比如社交媒体、游戏和电子邮件等&#xff0c;而这些应用程序背后的魔法都是由软件编程专业的人创造的。那么&…

Android 面试重点之Framework (Handler篇)

近期在网上看到不少Android 开发分享的面试经验&#xff0c;我发现基本每个面经中多多少少都有Framework 底层原理的影子。它也是Android 开发中最重要的一个部分&#xff0c;面试官一般会通过 Framework底层中的一些逻辑原理由浅入深进行提问&#xff0c;来评估应聘者的真实水…

idea - 刷新 Git 分支数据 / 命令刷新 Git 分支数据

一、idea - 刷新 Git 分支数据 idea 找到 fetch 选项&#xff0c;重新获取分支数据 二、命令刷新 Git 分支数据 git fetch参考链接 1. 远程Gitlab新建的分支在IDEA里不显示