前端优化的一些方向

news2024/11/13 14:44:11

对于浏览器来说,加载网页的过程可以分为两部分,下载文档并响应(5%左右),下载各种组件(95%左右)。
而对比大部分优秀网页来说下载文档(10%~ 20%),下载组件(80%~90%)。
优化就是要减少下载组件这部分。

1.压缩HTTP

     对于请求,试着想一想,传输一个文件夹轻松还是一个压缩包轻松,毫无疑问当然是压缩包,对于请求,我们同样也是如此,我们可以压缩请求,减少网络传输的数据量,这样就会减少请求的时间,提高用户体验。
    HTTP压缩,浏览器可以使用Accept-Encoding头来声明压缩,而服务端可以使用content-Encoding 来确认压缩。

//简单使用vue的请求来演示accept-Encoding
const axios = require('axios');
axios.get('/', {
  baseURL: window.location.origin,
  headers: {
    'Accept-Encoding': 'gzip, deflate'//压缩方式
  }
})
.then(response => {
  const acceptEncoding = response.headers['accept-encoding'];
  console.log(acceptEncoding);
})
.catch(error => {
  console.error(error);
});
//用java来表示context-Ecoding
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class HTTPServer {
    public static void main(String[] args) {
        try {
            // 创建服务器套接字
            ServerSocket serverSocket = new ServerSocket(8080);
            while (true) {
                // 等待客户端连接
                 ``````
                // 创建输出流
                 ``````
                // 构建HTTP响应
                  ``````
                // 获取请求头中的Accept-Encoding字段的值
                String acceptEncoding = clientSocket.getHeaderField("Accept-Encoding");

                // 根据Accept-Encoding字段的值设置Content-Encoding字段的值
                String contentEncoding;
                if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
                    response.append("Content-Encoding: gzip\r\n");
                    contentEncoding = "gzip";
                    // 添加使用gzip压缩的内容
                    // ...
                } else {
                    response.append("Content-Encoding: identity\r\n");
                    contentEncoding = "identity";
                    // 添加未压缩的内容
                    // ...
                }
                // 输出响应内容
               ``````
                // 关闭连接
               ``````
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

同时,web服务器通过gzip对response进行编码,当浏览器接收到response时,对其解码。

gzip压缩:压缩比率3~10倍,通常压缩静态文件。

2.减少HTTP请求

    对于网站来说,大部分时间都花费在响应组件上面,而组件大部分都是图片或者其他文件,要优化的话,减少对这部分的请求是一个好方法。

2.1图片地图

    图片地图就是允许在一个图片上关联多个URL,目标URL的取决于用户点击的位置。而图片地图有两种,服务端图片地图和客户端图片地图。
服务端图片地图就是将所有的点击提交到同一个目标URL中,然后向其传递用户点击的x,y坐标。然后进行操作,这种方式可能很少使用,而经常使用的是客户端图片地图,它可以将用户的点击映射成一个操作,无需向后端应用程序发送请求。映射可以通过HTML的map标签实现,或者使用绝对定位和相对定位实现。

<img usemap="#map1" src="xxx">
<map name="map1">
     <!--shape是区域形状,但好像只有矩形;coords是坐标 -->
    <area shape="rect" coords="0,0,31,31" href="xxxx.html" title="xxx">
    <area shape="rect" coords="0,0,90,30" href="xxxx.html" title="xxx">
    ``````
</map>
2.2内联图片

    这种图片可以不用向后端发送请求,可以减少HTTP请求,它通过data:URL实现,它将图片作为一种内嵌资源。

<img src="data:image/png;base64,base64码">
<style>
  .home{
  //其中png可以更换成其他不同类型,最后的是图片转换成base64的编码。
    background-image:url(data:image/png;base64,base64码)
  }
</style>
2.3合并脚本和样式表

    对于一个前端项目,肯定会有许多的js和css,而我们是否对这些进行内联(嵌在html页面),或者还是放在外部文件中,而外部文件确实可以提高性能,但是太多了会造成,请求的过多。一个js文件就会发送一次请求。根据一些大型网站来说,平均6~ 7个脚本和1~ 2css表,也就是说可以将多个脚本文件合并到一个文件中,多个样式表合成一个文件。

1.手动合并:将所有的脚本和样式表文件的内容复制到一个新的文件中,并确保按照原来的顺序进行合并。这种方法适用于项目规模较小或需要手动维护的情况。
2.构建工具:使用构建工具(如Webpack、Grunt、Gulp等)来自动化合并脚本和样式表文件。这些构建工具通常提供了合并、压缩和优化代码的功能,可以根据配置文件和规则进行合并操作。你可以定义合并文件的顺序,并设置其他的编译和转换规则。
3.服务器端合并:在服务器上使用服务器端脚本(如PHP、Node.js等)将多个脚本和样式表文件合并成一个文件,并将合并后的文件返回给客户端。这种方法可以减少HTTP请求的数量,提高页面加载性能。你可以通过编写服务器端代码,将需要合并的脚本和样式表文件动态地合并在一起。

2.使用内容发布网络

     内容发布网络(CDN):是一组分布在多个不同地理位置的web服务器。用户找最近的位置web服务器或者网络延迟最低的服务器发送请求。

1.优点:
    提高网站性能:CDN将内容缓存在全球各地的边缘服务器上,并将内容部署到离用户最近的服务器上。这可以大大减少用户访问网站时的延迟,提高加载速度和性能。
    提供可扩展性:CDN使用多个服务器节点分担请求负载,提供更好的可扩展性和更高的容量,使网站能够更好地处理大量的并发请求。
    减少网络拥塞:通过将内容缓存在离用户更近的位置,CDN可以减少互联网主干网络上的流量,减轻网络拥塞,并提高整体网络性能。
    提供高可用性和容错能力:CDN会自动将内容从一个服务器节点复制到另一个节点,以提供高可用性和容错能力。如果一个服务器节点不可用,CDN会自动将请求路由到其他可用节点。
    降低成本:通过使用CDN,网站可以减少自己的服务器和网络带宽需求,从而降低成本。
2.缺点:
    成本:使用CDN服务会增加额外的成本,特别是对于小型或低流量的网站来说,可能超出其预算。CDN的具体价格因服务提供商和使用情况而异。
    数据一致性:由于CDN的分布式性质,内容更新可能需要一些时间才能在全球所有节点上生效,这可能导致数据的一致性问题。对于需要实时更新和同步的应用程序来说,这可能是一个挑战。
    安全性:CDN可以缓存和传输网站的内容,但这也意味着它需要访问和处理网站的数据。因此,确保CDN提供商有适当的安全措施来保护数据安全和隐私是重要的。
    控制性:使用CDN服务可能会带来一定的控制权妥协。网站可能无法完全控制缓存策略、内容更新和数据传输方面的细节,因此需要仔细考虑使用CDN时的控制权和灵活性。

3.添加Expries头

    浏览器(和代理)使用缓存来减少HTTP请求的数量,并减少HTTP响应的大小。web服务器使用Expries头来告诉web客户端它可以使用一个组件的当前副本直到指定的时间为止,在HTTP响应中发送。,就算说页面的图片返回这个头,浏览器就在之后就会使用缓存的这张图片而不发送请求了。
    还有一种更加方便的头,Cache-control,它可以解决Expries头需要指定一个确切的日期,这样很不方便。而Cache-control可以使用max-age指令去指定组件缓存多久。秒为单位。

//但是不支持HTTP1.1的浏览器,那就同时使用就行了
Cache-Control:max-age=2222222222
//这个请求和响应都可以使用

在这里插入图片描述
在符合缓存策略时,服务器不会发送新的资源,但不代表客户端与服务端的会话中断。

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

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

相关文章

23_7第一周LeetCode刷题回顾

目录 1. 两数之和2. 两数相加3.无重复字符的最长子串4.寻找两个正序数组的中位数5.最长回文子串6.N 形变换7.整数反转8.字符串转整数&#xff08;atoi&#xff09;9.回文数10. 正则表达式匹配11. 盛最多水的容器12. 整数转罗马数字13. 罗马数字转整数14. 最长公共前缀15.三数之…

MyBatis中的动态SQL(sql标签、where标签、set标签、批量增加与批量删除)

目录 sql标签 ​编辑 where标签 set标签 foreach标签 批量增加 批量删除 将基础SQL语句中重复性高的增加它的复用性&#xff0c;使得sql语句的灵活性更强 sql标签<sql> <sql id"text">select * from user</sql><select id"selectA…

如何在苹果商店发布App?

一、介绍 众所周知&#xff0c;苹果对于自家产品的安全问题十分重视&#xff0c;他们有严格的一套审核标准和流程&#xff0c;当我们想要在苹果商店发布一款App的时候就需要经过重重艰难险阻&#xff0c;克服不少繁杂的问题去完成这项工作。 另外有一点需要注意的是&#xff…

C语言库函数strcpy学习

strcpy是C语言的一个标准库函数&#xff1b; strcpy把含有\0结束符的字符串复制到另一个地址空间&#xff0c;返回值的类型为char*。 原型声明&#xff1a;char *strcpy(char* dest, const char *src); 头文件&#xff1a;#include <string.h> 和 #include <stdio.h&g…

领域驱动设计(三) - 快速开始 - 【3/3】事件风暴

使用DDD的最终目的是深入学习业务如何运作。然后基于学习试验、质疑、再学习和重建模的过程。过程中面临的最大挑战是如何快速学习&#xff0c;并且在保证学习质量的前提下压缩学习时间&#xff08;你的学习是需要公司付工资的&#xff09;。 事件风暴就是一种相对高效的分析工…

【电子学会】2023年05月图形化二级 -- 接水果

接水果 天上掉落各种水果下来&#xff0c;有草莓、苹果、香蕉&#xff0c;快拿大碗去接住水果吧。 1. 准备工作 &#xff08;1&#xff09;导入背景Blue Sky&#xff1b; &#xff08;2&#xff09;删除小猫角色&#xff0c;导入角色Bowl、Apple、Strawberry、Bananas。 2.…

【技能实训】DMS数据挖掘项目-Day03

文章目录 任务5【任务5.1】基础信息实体类【任务5.2.1】继承DataBase类&#xff0c;重构日志类【任务5.2.2】继承DataBase类&#xff0c;重构物流实体类【任务5.2.3】创建物流、日志测试类&#xff0c;测试任务5.2中的程序&#xff0c;演示物流信息、日志信息的采集及打印输出 …

【Redis】Transaction(事务)

&#x1f3af;前言 Redis事务是一个组有多个Redis命令的集合&#xff0c;这些命令可以作为一个原子操作来执行。 Redis事务通常用于以下两种情况&#xff1a; 保证操作的原子性&#xff1a;在多个命令的执行过程中&#xff0c;如果有一个命令执行失败&#xff0c;整个事务都需…

【数据编制架构】数据编织(Data fabric)架构完整指南

本文探讨了 Data Fabric 的内容、原因、方式和人员&#xff0c;包括 Data Fabric 架构、挑战、优势、核心功能、供应商等。 Data Fabric——以数据为中心的企业的“必备” 在过去几年中&#xff0c;“Data Fabric”一词已成为企业数据集成和管理的代名词。分析公司 Gartner 将“…

vtkButtonWidget Window 添加按钮

有时我们需要在 VTK 窗口中增加 按钮&#xff0c;右上角&#xff1b; 实现&#xff0c;通过回调函数&#xff0c;vtkButtonCallback 获取点击&#xff1a; #include <vtkVersion.h> #include <vtkSmartPointer.h>#include <vtkPolyDataMapper.h> #include &…

Java性能权威指南-总结27

Java性能权威指南-总结27 数据库性能的最佳实践Java集合类API同步还是非同步设定集合的大小 集合与内存使用效率 数据库性能的最佳实践 Java集合类API Java的集合类API有很大的选择余地&#xff1b;Java 7至少提供了58个不同的集合类。在编写应用时&#xff0c;选择恰当的集合…

数据结构算法题——数组

leetcode-1.两数之和 leetcode-1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在…

阿里云AliYun物联网平台使用-申请免费试用及完成初始配置

一、项目简介 本专栏文章将围绕阿里云物联网平台&#xff0c;实现其设备向云平台的数据上传&#xff0c;客户端获取云平台数据。设备通过NBIOT技术实现无线采集&#xff0c;定时上传。 二、阿里云平台申请 阿里云物联网平台试用申请地址 进入上述超链接网址&#xff1a; 由于是…

【InnoDB 存储引擎】15.7.1 InnoDB Locking(锁实验,包含了如 记录锁、间隙锁、Next-Key Lock 算法等,重要)

文章目录 1 关于 Record Lock 的实验1.1 实验 1&#xff1a;没有主键时的如何锁定1.2 实验 1&#xff08;续&#xff09;&#xff1a;带着问题继续实验1.3 实验 2&#xff1a;有主键时如何锁定 2 关于 Next-Key Lock 的实验2.1 实验 3&#xff1a;如何确定算法的锁定范围2.2 实…

VS 字体不对齐解决方案

1. 问题描述 输入相同数量但不是同一类型的字符的字符&#xff0c;会出现字符显示不对齐的问题。 在某些需要根据对齐来写的代码的时候&#xff0c;这种情况是相当的折磨。 2. 解决方案 设置等宽字体。 依次点击 VS 上方的 工具 → 选项 → 字体和颜色 → 字体 → 随便选择一款…

基于simulink识别彩色视频序列中的交通警告标志

一、前言 此示例演示如何识别彩色视频序列中的交通警告标志&#xff0c;如“停止”、“请勿进入”和“让行”。 二、模型 下图显示了交通警告标志识别模型&#xff1a; 三、交通警告标志模板 该示例使用两组模板 - 一组用于检测&#xff0c;另一组用于识别。 为了节省计算…

Linux常用命令——ex命令

在线Linux命令查询工具 ex 启动vim编辑器的ex编辑模式 补充说明 在ex模式下启动vim文本编辑器。ex执行效果如同vi -E&#xff0c;适用于法及参数可参照vi指令&#xff0c;如要从Ex模式回到普通模式&#xff0c;则在vim中输入:vi或:visual即可。 语法 ex&#xff08;参数&…

【算法设计与分析】集合相等问题——设计一个拉斯维加斯算法,对于给定的集合S和T,判定其是否相等。

目录 一、问题描述二、问题分析三、运行结果四、源代码 一、问题描述 给定两个集合S和T&#xff0c;试设计一个判定S和T是否相等的蒙特卡洛算法。 数据输入&#xff1a; 由文件input.txt给出输入数据。第1行有1个正整数n&#xff0c;表示集合的大小。接下来的2行&#xff0c;每…

路径规划算法:基于梯度优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于梯度优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于梯度优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法梯度…

关于线程池其他一些知识点的讨论

文章目录 前言一、线程池的几种任务队列1.ArrayBlockingQueue2.LinkedBlockingQueue3.DelayedWorkQueue4.SynchronousQueue 二、如何确定核心线程数&#xff1f;三、线程池的种类有哪些&#xff1f;1.newFixedThreadPool2.newSingleThreadExecutor3.newCacheThreadPool4.newSch…