## HTTP系列之Accept-Encoding和Content-Encoding[通俗易懂]

## HTTP系列之Accept-Encoding和Content-Encoding[通俗易懂]前端的性能优化是一个永不停歇的路程,优化的方式也不一而足,今天重点不在于介绍性能优化,而是介绍性能优化的其中一种方式,通过压缩来节省http请求的流量,实现过程中依赖http中header部分的两个字段,Accept-Encoding和Content-EnCoding(分别来自request的header和response的header)。前两天排查一个问题是注意到项目里ssr时返回的页面竟然没…

大家好,又见面了,我是你们的朋友全栈君。

前端的性能优化是一个永不停歇的路程,优化的方式也不一而足,今天重点不在于介绍性能优化,而是介绍性能优化的其中一种方式,通过压缩来节省http请求的流量,实现过程中依赖http中header部分的两个字段,Accept-Encoding和Content-EnCoding(分别来自request的header和response的header)。

前两天排查一个问题是注意到项目里ssr时返回的页面竟然没有压缩,页面体积大小高达182k,于是着手优化这部分。首先我们先了解下Accept-Encoding和Content-Encoding的作用。

含义与作用

为什么首先要讲这两个字段的含义呢?因为当你打开一个页面时,请求到了服务端,如果请求上没有这种编码的标识的话,服务端是不知道该不该压缩?使用哪种方式压缩的?所以request请求header里的Accept-Encoding就是用来告诉服务端客户端是支持哪些编码方式的,一般的值有gzip/compress/deflate/br等,可以多个,中间用逗号隔开。如:

Accept-Encoding: gzip, deflate, br
复制代码

当服务端接收到请求,并且从header里拿到编码标识时,就可以选择其中一种方式来进行编码压缩,然后返给客户端,但是如果response的header里没有编码标识的话,客户端就不知道服务端是用的哪种方式压缩的,所以需要Content-Encoding来标识服务端压缩时所用的压缩方式。

综上,Accept-Encoding用来标识客户端能够理解的内容编码方式。 Content-Encoding用来标识主体进行了何种方式的内容编码转换。

node中的使用

项目中使用的node实现的ssr,因此重要讨论下在node中实现压缩来完成性能的优化。实现代码简化如下:

const http = require('http');
const zlib = require('zlib');

const server = http.createServer(function(req,res){
	//...其他逻辑
	const acceptEncoding = req.headers['accpent-encoding'];
	if(!!acceptEncoding.match(/\bgzip\b/)){
		zlib.gzip(body,function(err,data){
			if(err){
				//...错误处理逻辑
			}
			res.setHeader('content-encoding','gzip');
			res.setHeader('content-length',body.length);
			res.end(body);
		})
	}
	// ...非gzip处理
});
复制代码

node中压缩是通过zlib来实现的,首先判断accept-Encoding里是否有gzip,有的话通过zlib压缩,并在response的header中标识。很简单吧!

结语

之前看http总是感觉很枯燥,看不下去,但通过与项目中的实践相结合还是蛮有意思的,比如这次虽然是一个比较小的优化点,但是还是有点成就感的。

如果本文对你有些许帮助,就请你点个赞鼓励下!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159679.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bat中使用mshta调用vbs语句获取精准计算的日期

    bat中使用mshta调用vbs语句获取精准计算的日期1.在bat中,获取指定的日期格式是比较麻烦的。因为cmd环境中,日期格式随着系统的时间格式设置而变化,通常系统默认的时间格式是“\’”符号作为连接符。日期通常用在文件名上,比如日志的文件名。那么日期的格式就只能用“-”符号代替,更改系统日期格式会显得容易被外界因素改变,导致不稳定。当然也可以用bat中的set来进行替换,但这样费代码量。2.对于计算日期来说,bat是难以准确做到的,也需要堆积代码量才能完成。特别是到了每个月的一号时,无法确定昨天是否是31号还是30号还是28号。那么bat就只能陷入迷茫

    2025年6月7日
    0
  • 为什么L1正则化导致稀疏解「建议收藏」

    一、从数据先验的角度首先你要知道L1范式和L2范式是怎么来的,然后是为什么要把L1或者L2正则项加到代价函数中去.L1,L2范式来自于对数据的先验知识.如果你认为,你现有的数据来自于高斯分布,那么就应该在代价函数中加入数据先验P(x),一般由于推导和计算方便会加入对数似然,也就是log(P(x)),然后再去优化,这样最终的结果是,由于你的模型参数考虑了数据先验,模型效果当然就更好.哦对了,如果你…

    2022年4月12日
    66
  • [Android] Bitmap内存在各系统版本的演化

    聚焦的问题1、Bitmap的像素数据是存在哪里的?2、Bitmap内存如何释放?需要调用recycle吗?Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);以这样声明一个bitmap为例,有三个位置需要关注,bitmap引用本身所在的位置(栈),引用指向的对象所在的位置(堆),对象中持有的像素数据所在的…

    2022年3月11日
    34
  • 如何将ip划分到vlan_两个vlan有同一mac

    如何将ip划分到vlan_两个vlan有同一macVLANVLAN技术主要就是在二层数据包的包头加上tag标签,表示当前数据包归属的vlan号。VLAN的主要优点:(1)广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。(2)增强局域网的安全性:VLAN间不能直接通信,即一个VLAN内的用户不能和其它VLAN内的用户直接通信,而需要通过路由器或三层交换机等三层设备。(3)灵活构建虚拟工作组:用VLAN可以划分不同的用户…

    2022年8月10日
    4
  • Android,使用Json发送数据中,使用的Java转义字符 KanKan原创

    Android,使用Json发送数据中,使用的Java转义字符 KanKan原创

    2022年1月29日
    45
  • 华为 eNSP 模拟器安装教程(内含下载地址)[通俗易懂]

    华为 eNSP 模拟器安装教程(内含下载地址)[通俗易懂]本文指导大家在Windows操作系统上完成华为eNSP模拟器的安装

    2022年10月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号