web前端性能优化【多年工作经验总结,一举拿下】

浏览器方面:

减少HTTP请求

HTTP 请求是指客户端(例如浏览器)向服务器发出的请求消息,用于获取特定资源或执行特定操作

为什么能够优化性能?

减少网络延迟:每次发起HTTP请求都需要经过网络传输,而网络传输存在一定的延迟。当页面中存在大量的HTTP请求时,这些请求之间会产生较多的延迟,导致页面加载速度变慢。

减少服务器负载:每个HTTP请求都需要服务器处理和响应,服务器的处理能力是有限的。当页面中存在大量的HTTP请求时,服务器可能会面临较大的负载压力。

节省带宽消耗:每个HTTP请求都需要占用一定的带宽资源。


带宽是什么?

带宽指的是网络传输数据的能力,表示单位时间内从一个点到另一个点所能传输的数据量


使用HTTP2.0

HTTP/2.0(简称HTTP2)是HTTP协议的一种更新版本,它改进了旧版本的HTTP协议,提供了更快的页面加载速度和更高的效率

为什么能够优化性能?

多路复用:HTTP/2使用二进制分帧机制,允许多个请求同时在同一个连接上进行,避免了过多的连接建立和消耗,提高了请求的效率。

头部压缩:HTTP/2使用HPACK算法对请求和响应头部进行压缩,减少了数据传输的大小,降低了带宽消耗

HTTPS 不等于 HTTP2.0

HTTPS 是一种通过加密和认证来保护网络通信安全的协议,而 HTTP/2 是一种基于 HTTP 协议之上的新版本

如果想要使用 HTTP/2,必须使用 HTTPS 来保证数据传输的安全性;而HTTPS使用的是HTTP/2协议或更早版本的HTTP协议都是可能的

浏览器缓存策略

浏览器缓存一般分为两类:强缓存(也称本地缓存)和协商缓存(也称弱缓存)

强制缓存

使用 Expires 字段:设置一个未来的过期时间

使用 Cache-Control 字段:设置缓存的最大有效时间

// 设置 Expires 字段,缓存过期时间为 1 小时
response.setHeader('Expires', new Date(Date.now() + 3600000).toUTCString());

// 设置 Cache-Control 字段,缓存最大有效时间为 1 小时
response.setHeader('Cache-Control', 'max-age=3600');

缓存过期时间和最大有效时间 有什么区别 

当缓存过期时间和最大有效时间同时存在时,浏览器会优先使用最大有效时间(Cache-Control)来判断缓存是否有效。如果 max-age 指定的时间已过或者没有设置该字段,浏览器才会检查 Expires 字段

ajax示例: 

// 发起 AJAX GET 请求,并设置强制浏览器缓存
$.ajax({url: 'https://api.example.com/data',type: 'GET',cache: true, // 开启缓存headers: {'Expires': new Date(Date.now() + 3600000).toUTCString(),'Cache-Control': 'max-age=3600'},success: function(responseData) {// 请求成功,处理响应数据console.log(responseData);},error: function(xhr, status, error) {// 请求失败,处理错误信息console.error('Request failed. Status:', status, 'Error:', error);}
});
协商缓存

使用 Last-Modified 字段:服务器返回资源的最后修改时间,例如 Last-Modified: Wed, 20 Nov 2023 08:00:00 GMT。浏览器会在后续请求中发送 If-Modified-Since 字段,表示资源的上次修改时间,服务器可以根据这个值判断是否返回新的资源

使用 ETag 字段:服务器返回资源的唯一标识符,例如 ETag: "abc123"。浏览器会在后续请求中发送 If-None-Match 字段,表示资源的标识符,服务器可以根据这个值判断是否返回新的资源

ajax示例: 

$.ajax({url: 'https://api.example.com/data',type: 'GET',cache: true, // 开启缓存headers: {'If-Modified-Since': lastModified, // lastModified 为资源的最后修改时间'If-None-Match': etag // etag 为资源的唯一标识符},success: function(responseData, textStatus, xhr) {// 请求成功,处理响应数据console.log(responseData);},error: function(xhr, status, error) {if (xhr.status === 304) {// 缓存命中,直接使用缓存console.log('Cache hit.');return;}// 请求失败,处理错误信息console.error('Request failed. Status:', status, 'Error:', error);}
});

Last-Modified 和 ETag 都是在发送请求时自动获取的 

白屏时间做加载动画

资源

静态资源cdn

一种通过分布在全球不同地点的服务器来加速静态资源传输的网络服务。CDN 旨在提高静态资源(如图片、CSS、JavaScript 文件等)的加载速度和用户体验

当使用 CDN 时,静态资源会被缓存到位于全球各地的服务器节点上。当用户请求访问网站时,CDN 会根据用户的地理位置,自动选择距离用户最近的服务器节点来提供静态资源,从而减小网络延迟和提高访问速度

例如:阿里云CDN、腾讯云CDN、Fastly、Cloudflare... ...

静态资源单独域名

静态资源单独域名是指将网站中的静态资源,例如图片、样式表、JavaScript等,放在一个独立的域名下。这个独立的域名通常是通过CDN服务提供商获得的,例如阿里云CDN、腾讯云CDN、百度云加速等。

为什么有效?

静态资源单独域名可以有效地减少DNS解析和请求次数,从而加速页面加载速度。同时,将静态资源与动态内容分开存放,还可以降低源服务器负载压力,提高网站的可用性和稳定性。

gzip压缩

Gzip压缩是一种常用的数据压缩算法,用于减小文件的大小以节省网络带宽和提高传输效率;它使用了Lempel-Ziv编码算法和哈夫曼编码算法,能够在不丢失数据的前提下大幅度减小文件的大小

express代码实现 gzip压缩

const express = require('express');
const compression = require('compression');const app = express();// 使用compression中间件启用Gzip压缩
app.use(compression());// 定义路由
app.get('/', (req, res) => {// 发送响应数据const responseData = 'Hello World!';res.send(responseData);
});// 启动服务器
const port = 3000;
app.listen(port, () => {console.log(`Server is listening on port ${port}`);
});

服务端渲染(SSR)

是一种将网页内容在服务器端生成并直接发送给浏览器的技术。与传统的客户端渲染(Client-Side Rendering,CSR)相比,SSR 在服务器端处理页面的渲染,然后将最终的 HTML 内容发送给客户端,客户端只需负责显示接收到的页面

图片

字体图标代替图片图标

推荐:iconfont-阿里巴巴矢量图标库

建议font-class 格式,方便简单

精灵图 

一些带有企业特色的小图标,如淘宝购物车,笑脸娃娃,可以使用精灵图,让一张图上带有多个小图,然后使用css背景定位来显示出合适的位子,能大大减少请求

图片懒加载

图片可设置一张加载图代替,当页面在可视区域内时在替换为正真的图片

如果有首屏很大的高清图,可先渲染清晰度低的缩略图,在首页基本构建完成下一次事件循环再去替换为高清图

图片预加载

可以在window.onload之后请求一些其他地方需要的图片资源
比如我们有一个活动页使用了高清图,我们可以在它的入口前的首页就加载它,当我们进去页面时,浏览器就会从缓存里读取这张图片

代码

减少重绘回流

重绘指的是当某个元素的样式发生变化,但它的布局没有改变,浏览器会重新绘制这个元素,并更新到页面上。例如,当修改元素的颜色、背景图像、阴影等样式属性时,就会触发重绘操作。

回流(也称为重排)指的是当某个元素的尺寸、位置或布局发生变化时,浏览器需要重新计算页面中所有元素的大小和位置,然后更新到页面上。例如,当增加、删除或隐藏元素时,或者当修改元素的宽度、高度、边距、定位等样式属性时,就会触发回流操作。

代码展示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>重绘和回流示例</title><style>.box {width: 100px;height: 100px;background-color: red;position: relative;}</style>
</head>
<body><div class="box"></div><button onclick="changeColor()">改变颜色</button><button onclick="changeSize()">改变尺寸</button><script>function changeColor() {const box = document.querySelector('.box');box.style.backgroundColor = 'blue'; // 触发重绘}function changeSize() {const box = document.querySelector('.box');box.style.width = '200px';box.style.height = '200px'; // 触发回流}</script>
</body>
</html>

节流、防抖

   节流函数:确保在指定的时间间隔内只触发一次函数调用

   防抖函数:不管如何触发,只在最后一次触发后才执行

// 节流函数
function throttle(func, delay) {let timeoutId;return function (...args) {if (!timeoutId) {timeoutId = setTimeout(() => {func.apply(this, args);timeoutId = null;}, delay);}};
}// 防抖函数
function debounce(func, delay) {let timeoutId;return function (...args) {clearTimeout(timeoutId);timeoutId = setTimeout(() => {func.apply(this, args);}, delay);};
}

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

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

相关文章

openlayers 入门教程(五):sources 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

利用云手机技术,开拓海外社交市场

近年来&#xff0c;随着科技的不断进步&#xff0c;云手机技术逐渐在海外社交营销领域崭露头角。其灵活性、成本效益和全球性特征使其成为海外社交营销的利器。那么&#xff0c;究竟云手机在海外社交营销中扮演了怎样的角色呢&#xff1f; 首先&#xff0c;云手机技术能够消除地…

UE4 根据任意多个点,生成最近的线条

1.计算所有线条的组合 2.Clear0宏&#xff1a;清除掉数组Distance0的值。注意这里是设置成最大值&#xff0c;而不是使用Clear&#xff01; 3.清除掉数组中的最小值&#xff0c;避免重复生成相同长度的线条。注意这里是设置成最大值&#xff0c;而不是使用Clear&#xff01; …

接口关联和requests库

一、接口关联 postman的接口 postman的接口关联配置&#xff1a;js代码&#xff0c;重点在于思路。 // 定义jsonData这个变量 接受登录接口的返回结果 var jsonData JSON.parse(responseBody); // 从返回结果里提取token/id值&#xff0c;并赋值给token/id变量值作为环境变…

如何添加随机种子保证代码每次复现的一致性?

如何添加随机种子保证代码每次复现的一致性&#xff1f; 在main()程序中首先设定随机种子&#xff1a; def set_seed(seed42):os.environ[PYTHONHASHSEED] str(seed)random.seed(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.backends…

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎&#xff0c;是一种与 Hadoop 相似的开源集群计算环境&#xff0c;但是两者之间还存在一些不同之处&#xff0c;这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…

Java毕业设计 基于SSM网上二手书店系统

Java毕业设计 基于SSM网上二手书店系统 SSM jsp 网上二手书店系统 功能介绍 用户&#xff1a;首页 图片轮播 图书查询 图书分类显示 友情链接 登录 注册 图书信息 图片详情 评价信息 加入购物车 资讯信息 资讯详情 个人中心 个人信息 修改密码 意见信息 图书收藏 已经付款 邮…

数据仓库的魅力及其在企业中的应用实践

数据仓库&#xff0c;这一创新性的概念来自于比尔恩门&#xff0c;从1980年代末提出以来&#xff0c;便凭借其独特的架构设计和强大的数据处理能力&#xff0c;在全球商业领域中掀起了一场革命。它不仅是解决企业海量数据存储和查询需求的关键技术&#xff0c;更是推动企业实现…

rel=“dns-prefetch“和rel=“preconnect“ 结合使用,以及link属性的详细介绍

使用 dns-prefetch DNS-prefetch 尝试在请求资源之前解析域名。这可能是后面要加载的文件&#xff0c;也可能是用户尝试打开的链接目标。 为什么要使用 dns-prefetch&#xff1f; 当浏览器从&#xff08;第三方&#xff09;服务器请求资源时&#xff0c;必须先将该跨源域名解…

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…

李宏毅深度强化学习导论——策略梯度

引言 这是李宏毅老师深度强化学习视频的学习笔记&#xff0c;主要介绍策略梯度的概念&#xff0c;在上篇文章的末尾从交叉熵开始引入策略梯度。 如何控制你的智能体 上篇文章末尾我们提到了两个问题&#xff1a; 如何定义这些分数 A A A&#xff0c;即定义奖励机制&#xff…

11.数据库技术(上)

函数依赖、规范化这类难的知识点&#xff0c;考的少&#xff1b; 基本概念、sql语句、关系代数运算、关系代数运算与sql语句的转换&#xff0c;考的多&#xff1b; 主要议题&#xff1a;

redis实际应用场景及并发问题的解决

业务场景 接下来要模拟的业务场景: 每当被普通攻击的时候&#xff0c;有千分之三的概率掉落金币&#xff0c;每回合最多爆出两个金币。 1.每个回合只有15秒。 2.每次普通攻击的时间间隔是0.5s 3.这个服务是一个集群&#xff08;这个要求暂时不实现&#xff09; 编写接口&…

如果有意外,这个窗口就会弹出,希望你们能够看到!——夜读(逆天打工人爬取热门微信文章解读)

第一个日二更 引言Python 代码第一篇 定时任务运行结果 第二篇 人民日报 【夜读】最好的教养&#xff0c;是对家人和颜悦色结尾 时间不会无缘无故增加 也不会无缘无故减少 我们唯一能够控制就是 加大时间的密度 引言 为了不让我在大庭广众下大喊我是沙比 我来更新文章啦 这次带…

nysm:一款针对红队审计的隐蔽型后渗透安全测试容器

关于nysm nysm是一款针对红队审计的隐蔽型后渗透安全测试容器&#xff0c;该工具主要针对的是eBPF&#xff0c;能够帮助广大红队研究人员在后渗透测试场景下保持eBPF的隐蔽性。 功能特性 随着基于eBPF的安全工具越来越受社区欢迎&#xff0c;nysm也应运而生。该工具能保持各种…

帮企建站宝响应式建站源码系统 带完整安装代码包以及搭建教程

在当今数字化时代&#xff0c;拥有一个功能强大且用户友好的网站是企业成功的重要基石。为了满足广大企业对于快速搭建高质量网站的需求&#xff0c;罗峰给大家分享一款“帮企建站宝响应式建站源码系统”。这一系统不仅包含了完整的安装代码包&#xff0c;还配备了详尽的搭建教…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅲ)

1.连接查询 连接查询&#xff1a;同时涉及多个表的查询 连接条件或连接谓词&#xff1a;用来连接两个表的条件 一般格式&#xff1a; [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [&l…

QT(6.5) cmake构建C++编程,调用python (已更新:2024.3.23晚)

一、注意事项 explicit c中&#xff0c;一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数)&#xff0c;承担了两个角色&#xff0c;构造器、类型转换操作符&#xff0c; c提供关键字explicit&#xff0c;阻止转换构造函数进行的隐式转换的发生&#…

mysql增量备份与修复

MySQL数据库增量恢复 1.一般恢复 将所有备份的二进制日志内容全部恢复 2.基于位置恢复 数据库在某一时间点可能既有错误的操作也有正确的操作 可以基于精准的位置跳过错误的操作 发生错误节点之前的一个节点&#xff0c;上一次正确操作的位置点停止 3.基于时间点恢复 跳过…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二&#xff1a;布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…