快速响应:提升前端页面加载速度技巧的必知策略方案
在本文中,我们将深入探讨导致页面加载缓慢的常见原因,并分享一系列切实可行的优化策略,无论你是刚入门的新手,还是经验丰富的开发者,这些技巧都将帮助你提升网页性能,让你的用户体验畅快无阻。
相信作为前端开发者的我们,无论是在平时工作还是日常学习当中,一旦项目的逻辑较为复杂或者项目代码繁多的时候就可能会遇到页面加载很慢或者在进行页面某个交互的时候,这一个交互可能就需要页面等待很久才会完成,这个时候就需要我们前端开发来进行优化它(管他个鸟,程序能跑就行,优化是不可能滴😁),那么作为前端开发我们该如何对其进行优化?这是博主今天要讲的知识!
目录
🧐时间构成
🤓性能分析
😎解决思路
🧐时间构成
在对前端进行性能优化找到最实用的排查方案前,我们应先了解一个页面的产生加载所需要的时间包括我们进行的一些操作所花费的时间,无非主要是以下三部分组成,当然还有一些细微的时间花费比如说:TCP连接时间、DNS解析时间等,这些就不需要再提了,主要还是以下三部分:
👉页面加载时间组成:
1)资源加载(占据主要时间)
2)代码执行(可能会延长时间,取决于代码本身)
3)页面绘制(通常占据较少时间)
那当我们发现一个页面加载或者操作的时候很慢,我们就需要排查其是因为资源加载缓慢、还是代码执行缓慢、还是页面绘制缓慢。以后遇到的网站加载缓慢只要排查过这三点并发现和处理导致网站缓慢的原因,基本上就会对我们网站的一个运行效率进行一定程度上的优化。
🤓性能分析
这里我们以腾讯视频为例来讲解一下如何发现导致网站缓慢加载的原因,因为腾讯视频也是采用了常见的vue框架进行开发,也是比较贴近我们大家大部分的工作,这里我们就以其进行举例吧!
首先我们先F12打开我们的网页控制台,然后进入到我们的性能分析的这个面板,如果你是英文面板的话就是Performance,这里我们就以中文面板举例,点击左上角的录制按钮进行页面录制:
然后刷新页面,等待刷新页面中的符号从叉号又重新变成刷新符号的时候,我们就可以点击控制台的停止按钮,这样就代表着整个页面已经加载完毕了,然后控制台就会分析页面加载的整个报告,
我们从控制台给出的报告就能知道我们网站整个的执行一共再哪些地方花费多少时间:
第一次使用控制台性能分析这个模块的朋友,看到上面控制台的分析报告,内容花里胡哨的可能就会看的比较懵,这个分析报告其实大部分东西我们没必要知道是啥,只需要挑出我们需要知道的重点就可以了,如下所示:
资源加载:打开网络模块,该模块我们可以详细的看到每一条资源所花费的时间,由于腾讯视频当中图片和视频还是挺多的,可以看到网站资源加载的时间还是稍微有点高的,这个可以理解!
代码执行与页面绘制:如果我们发现资源很快就加载完毕但是页面很慢,这个时候我们就需要了解一下是否是JS代码执行的问题导致的!通过下面的摘要模块我们可以看到我们的执行脚本所花费的时间,当然也包括了页面渲染的时间:
除此之外我们也可以勾选性能分析模块中的屏幕截图和内存按钮然后再重新录制,我们勾选上这两个按钮之后就可以看到网站的每一个时间点的屏幕的当前截图以及它的一个内存占用情况。
如下图所示可以看到有一个屏幕截图在这个地方,我们可以清晰地看到每一个时刻当前网站屏幕的单层状态是什么,
然后我们可以鼠标点击选中屏幕截图的一部分,控制台就会给我们展示当前这一部分中所产生的资源、代码以及页面绘制的时间消耗,更加细致的分析某一个时间段内产生时间消耗,如下所示:
如果我们想分析对页面进行某个交互的时候,我们也可以通过性能分析面板进行处理,通过点击屏幕录制,然后进行页面的某项操作,当操作完成之后点击控制台中的停止录制的按钮即可对我们当前进行的页面交互所产生的时间消耗问题进行分析。
如下我们通过录制一下我们从首页切换到动漫频道的操作,来进行分析我们当前所产生的时间消耗,当我们切换到动漫频道的时候,图片资源以及代码执行所花费的时间我们也都能看到:
当然除了控制台的性能分析,我们也可以通过代码来实现以数据化的形式查看页面的各种时间,其方法为:window.performance,即在项目中的index.html写入一段脚本,通过方法对象来查看各种数据,如下我们在控制台输入该函数回车:
从上图我们可以看到该函数打印了相关的数据,例如memory:代表内存;timing:代表各种各样的时间点,这里我们可以在我们项目的index.html中插入一段脚本,如下给后端发送一段请求然后把window.performance作为数据传输给后端,后端拿到数据之后就可以知道各个用户在访问网站的时候所花的一些性能时间,从而知晓我们的项目在用户的电脑上表现如何。
当然我们也可以采用一些性能分析的第三方工具进行操作,举例如下:
1)lighthouse:可视化测评网站性能
2) web-vitals:js库测量
😎解决思路
如果出现资源加载时间较长的情况,作为前端我们该如何处理这个问题呢?这里博主提供一些简单的思路,后期通过更加详细的文件来讲解如何细致的处理:
1)定位资源:如果你通过上面讲解的性能分析查看到了资源加载占据较大时间的情况下,你就需要定位到底是哪一个资源文件过大延迟了加载时间导致网站变得缓慢了,如果存在了一些大文件但不是网站刚开始加载的时候就必须全部需要的,这里我们可以采用异步加载的方式。举例类似图片懒加载。
2)tree-shaking:利用tree-shaking去尽量减少我们的代码体积,需要做到再引入其他第三方库的时候尽量采用按需引入,然后把一些低版本的库升级到按需引入的版本。
3)gzip压缩:一般我们用nginx返回资源的时候会进行自动的压缩
4)构建工具压缩:利用构建工具对代码进行压缩,这个我们在对项目进行打包的时候也是自动进行了。
如果出现代码执行加载时间较长的情况,作为前端我们该如何处理这个问题呢?这里博主提供一些简单的思路,后期通过更加详细的文件来讲解如何细致的处理:
一般情况下js代码执行是很难导致执行时间过长的,出现代码执行较长的情况通常只有使用了大量的循环操作导致我们js代码执行缓慢,这个时候我们往往需要去测量到底是哪段代码导致了代码执行的时间加载较长,从而来进行优化。那么我们如何在js代码中去精确测量到底是哪段代码导致了时间加载过长呢?其执行化的时间是多少?这里我们给出了两种方案,如下:
console.time:浏览器支持性能好但是精度测量较差!示例代码如下所示,两个console函数用于测量两个点之间代码执行时间的浏览器控制台函数:
<script setup lang="ts">
import { onMounted } from 'vue'onMounted(() => {console.time()for (let i = 0; i < 10000; i++) {let div = document.createElement('div')div.innerHTML = `hello ${i}`}console.timeEnd()
})
</script>
如下代码,通过测量代码执行的时间可以看到代码一般都执行在15ms作用,而当我把向div添加元素内容的代码注释掉之后可以看到代码执行的时间则变为2ms左右,由此可以得出当删除逻辑代码中不必要的代码可能会大大提高代码的执行效率:
performance.now:更加精确但是浏览器支持性能可能会出现问题!(一般推荐这个),示例代码如下:
<script setup lang="ts">
import { onMounted } from 'vue'onMounted(() => {let a = performance.now() // 执行到这段代码,此时此刻的时间for (let i = 0; i < 10000; i++) {let div = document.createElement('div')div.innerHTML = `hello ${i}`}let b = performance.now() // 执行到这段代码,此时此刻的时间console.log(b - a) // 计算出这段代码前后执行的时间差值,即执行时间
})
</script>
注意:上面的测量方式,仅仅是测量同步的时间,逻辑代码中的异步操作所产生的时间消耗是不会被算进结果里面的,所以即使你在逻辑代码中设置了一个定时器,得到的计算结果还是同步时间的结果,和你异步设置的多少的时间执行没有任何关系,这里需要注意。
相关文章:

快速响应:提升前端页面加载速度技巧的必知策略方案
在本文中,我们将深入探讨导致页面加载缓慢的常见原因,并分享一系列切实可行的优化策略,无论你是刚入门的新手,还是经验丰富的开发者,这些技巧都将帮助你提升网页性能,让你的用户体验畅快无阻。 相信作为前端…...

VUE-CLI配置全局SCSS变量
一.引入node-sass和sass-loader依赖 npm install --save-dev sass-loader node-sass 二. 在项目根目录中创建一个scss变量文件,比如constant.scss: 三.在vue.config.js文件中引入这个变量文件: // vue.config.js module.exports {css: {l…...

前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel
前言:哈喽,大家好,今天给大家分享今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 …...

浅谈内网攻防之道-内网系统凭证钓鱼
你荒废的今日,正是昨日殒身之人祈求的明日。 1、FakeLogonScreen FakeLogonScreen 是用 C# 编写的应用程序,可以模拟 Windows 的登录屏幕来欺骗用户输入,从而盗取凭证 在目标的 session 会话中,指定该程序: 该工具能…...

fmql之ubuntu联网
需求:fmql搭载linux,并且可以远程访问。 连路由器 板卡通过网线与路由器连接,ip设置成同段,可以ping通: 但是ping不通baidu(如果路由器没有网/流量的话,就无法上网) ZYNQ7020通过网…...

掌握AI创作神器:10分钟搞定ComfyUI和Flux大模型
前言 最近大火的Flux 1.0模型,大家都去体验过没? 此模型是由SD的前员工创立的黑森林实验室推出,一经推出,业界掀起了非常大的反响,相关从业人员都感叹模型可以媲美甚至赶超SD了;现象级的成为了现在很多AI…...

React js Router 路由 2, (把写过的几个 app 组合起来)
完整的项目,我已经上传了,资源链接. 起因, 目的: 每次都是新建一个 react 项目,有点繁琐。 刚刚学了路由,不如写一个 大一点的 app ,把前面写过的几个 app, 都包含进去。 这部分感觉就像是, …...

Linux基础3-基础工具2(vim详解,gcc详解)
上篇文章:Linux基础3-基础工具1(什么是工具,yum,vim基础)-CSDN博客 本章重点: 1. vim详解 2. gcc详解 目录 一. vim详解 1.1 命令模式 1.2 插入模式 1.3 底行模式 二. gcc/g 2.1 程序的翻译过程(c/c代码执行过…...

GEE教程:利用sentinel-2数据进行ndwi和ndci指数的计算和下载
目录 简介 函数 normalizedDifference(bandNames) Arguments: Returns: Image Export.image.toDrive(image, description, folder, fileNamePrefix, dimensions, region, scale, crs, crsTransform, maxPixels, shardSize, fileDimensions, skipEmptyTiles, fileFormat, …...

markdown-it:将Markdown文本转换为HTML格式,展示在页面,怎么自定义里面的a标签设置为在新标签页打开
由markdown-it将文本生成html然后渲染到页面上,但是现在你点击里面生成好的链接只能在本标签页打开,怎么将其设置为在新标签打开呢? 安装markdown-it npm install markdown-it 使用markdown-it const mdi new MarkdownIt({html: true,l…...

linux在工作中常用命令
简介 记录在日常工作中,常用linux命令 查日志篇 1.统计特定内容出现的行数和次数 1.查询特定内容出现的行数 grep -c "关键词" 文件名-c:只显示匹配的行数。 2.查询特定内容出现的次数 grep -o "关键词" 文件名 | wc -l-o:只显示…...

828华为云征文|部署知识库问答系统 MaxKB
828华为云征文|部署知识库问答系统 MaxKB 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 核心竞争力1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 MaxKB3.1 MaxKB 介绍3.2 Docker 环境搭建3.3 MaxKB 部署3.4 Max…...

数据结构之算法复杂度
目录 前言 一、复杂度的概念 二、时间复杂度 三、大O的渐进表示法 四、空间复杂度 五、常见复杂度对比 总结 前言 本文主要讲述数据结构中的算法复杂度 一、复杂度的概念 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏…...

Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...
原文链接:https://tecdat.cn/?p37724 在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估…...

【例题】lanqiao4403 希尔排序模板题
插入排序每次只能将数据移动一位。 已知插入排序代码为: def insert_sort(a):for i in range(1,len(a)):ji-1while j>0 and a[j]>a[i]:a[j1]a[j]j-1a[j1]a[i]return a希尔排序在插入排序的基础上,将数据移动n/2,n/4,…,1位。 for i in range(ga…...

【C/C++】速通涉及string类的经典编程题
【C/C】速通涉及string类的经典编程题 一.字符串最后一个单词的长度代码实现:(含注释) 二.验证回文串解法一:代码实现:(含注释) 解法二:(推荐)1. 函数isalnum…...

MySQL:库表的基本操作
库操作 查看 查看存在哪些数据库: show databases;查看自己当前处于哪一个数据库: select database(); 由于我不处于任何一个数据库中,此处值为NULL 查看当前有哪些用户连接到了MySQL: show processlist; 创建 创建一个数据库 语…...

JS领域的AI工程利器分享
JavaScript,这个在网页开发中广为人知的脚本语言,正逐渐在AI工程领域展现出其独特的魅力。对于那些希望将大语言模型(LLM)融入项目的开发者来说,以下五个JavaScript工具将是关键资源。 1. TensorFlow.js TensorFlow.…...

2024/9/20 使用QT实现扫雷游戏
有三种难度初级6x6 中级10x10 高级16x16 完成游戏 游戏失败后,无法再次完成游戏,只能重新开始一局 对Qpushbutton进行重写 mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H #include <QObject> #include <QWidget> #include <QPus…...

09.20 C++对C的扩充以及C++中的封装、SeqList
SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h>using namespace std;//typedef int datatype; //类型重命名 using datatype int;//封装一个顺序表 class Seq…...

Git提交类型
说明:Git提交类型指的是代码commit时,写在comment前面的标志,表示此次commit的提交类型,如下: Git提交类型 常见的Git提交类型有: feat:新特性、新功能或优化; fix:修复…...

C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
全网唯一递归法: vector<vector<int>> generate(int numRows) {vector<int> v;vector<vector<int>>vn;if (numRows 1){v.push_back(1);vn.push_back(v);v.clear();return vn;//递归记得return}if (numRows 2){v.push_back(1);vn.p…...

Redis作为单线程模型,为什么效率高、速度快呢?
前言: 效率高、速度快是相较于数据库来说的(MySQL、Orcale、SQL server) 文章目录 一、单线程模式的工作流程二、为什么快? 一、单线程模式的工作流程 这里我们所说的单线程是指:Redis只使用一个线程,来处…...

人工智能——猴子摘香蕉问题
一、实验目的 求解猴子摘香蕉问题,根据猴子不同的位置,求解猴子的移动范围,求解对应的过程,针对不同的目标状态进行求解。 二、实验内容 根据场景有猴子、箱子、香蕉,香蕉挂天花板上。定义多种谓词描述位置、状态等…...

对ViT 中Patch Embedding理解
借鉴了这个博主的ViT Patch Embedding理解-CSDN博客,再加了一些理解。 就通过代码来理解吧 假设输入图像的维度为HxWxC,分别表示高,宽和通道数。 PatchEmbed 的类,它继承了 nn.Module,实现了将输入的2维图像&#…...

Redis基本命令详解
1. 基本命令 命令不区分大小写,而key是区分大小写的 # select 数据库间的切换 数据库共计16个 127.0.0.1:6379> select 1# dbsize 返回当前数据库的 key 的数量 127.0.0.1:6379[1]> dbsize# keys * 查看数据库所有的key 127.0.0.1:6379[1]> keys *# fl…...

Java之线程篇四
目录 volatile关键字 volatile保证内存可见性 代码示例 代码示例2-(volatile) volatile不保证原子性 synchronized保证内存可见性 wait()和notify() wait()方法 notify() 理解notify()和notifyAll() wait和sleep的对比 volatile关键字 volati…...

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

SpringBoot:关于Redis的配置失效(版本问题)
我们使用redis时发现yaml配置中的redis相关配置不生效,后面发现将配置修改甚至删除所有相关redis的配置,springboot依然能使用redis里面默认的db0并且不报错。上网查阅了一些文章,也都没有解决今天分享下,我的处理方法, SpringBo…...

halcon 快速定义字典
定义一个名为params的字典 Params : dict{} 等价于用 create_dict (Params ) 为字典添加键值对,在halcon中箭只能是字符串,值可以是任何类型的obj或者tuple Params.remove_outer_edges : true Params.max_gap : 150 等价于用 set_dict_object (true,…...