## 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)
上一篇 2022年7月15日 下午12:46
下一篇 2022年7月15日 下午1:00


相关推荐

  • 经典卷积神经网络——VGG16

    经典卷积神经网络——VGG16VGG16 前言一 VGG 发展历程二 VGG 网络模型三 VGG16 代码详解 1 VGG 网络架构 2 VGG16 网络验证 2 读取数据 进行数据增强 3 训练模型 测试准确率四 VGG 缺点前言我们都知道 Alexnet 是卷积神经网络的开山之作 但是由于卷积核太大 移动步长大 无填充 所以 14 年提出的 VGG 网络解决了这一问题一 VGG 发展历程 VGG 网络由牛津大学在 2014 年 ImageNet 挑战赛本地和分类追踪分别获得了第一名和第二名 研究卷积网络深度对其影响在大规模图像识别设置中的准确性 主要贡献是全面评估网络

    2026年3月16日
    2
  • 三层架构(我的理解及具体分析)

    三层架构(我的理解及具体分析)

    2021年12月9日
    55
  • 计算机三级-数据库技术

    计算机三级-数据库技术三级数据库技术知识点总结1数据字典是对系统种各类数据描述的集合,包括数据项,数据结构,数据流,数据存储和处理过程五个部分2数据模型的三要素:数据结构、数据操作和完整性约束3数据库系统:一般由数据库、操作系统、数据库管理系统(及其工具)、应用系统、数据库管理人员和用户构成4数据模型:数据模型是数据库系统的数学形式框架,是数据库系统的核心和基础5数据模型的分类:概念模型,也称信息…

    2022年6月18日
    51
  • OpenCV—Python Retinex图像增强算法

    OpenCV—Python Retinex图像增强算法Retinex 图像增强算法一 Retinex 理论二 Retinex 理论的理解三 Retinex 理论应用一 Retinex 理论 Retinex 理论始于 Land 和 McCann 于 20 世纪 60 年代作出的一系列贡献 其基本思想是人感知到某点的颜色和亮度并不仅仅取决于该点进入人眼的绝对光线 还和其周围的颜色和亮度有关 Retinex 这个词是由视网膜 Retina 和大脑皮层 Cortex 两个词组合构成的

    2026年3月18日
    2
  • PHP进阶与redis锁限制并发访问功能示例

    PHP进阶与redis锁限制并发访问功能示例

    2021年10月27日
    43
  • 国产CPU架构、国产Linux操作系统及其国产数据库等关键应用

    国产CPU架构、国产Linux操作系统及其国产数据库等关键应用关于国产CPU架构及Linux变种编译器1、CPU架构3大阵营整合为两大CPU阵营:处理器架构_百度百科CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。市面上的CPU分类主要分有两大阵营,一个是intel、AMD为首的复杂指令集CPU,另一个是以IBM、ARM为首的精简指令集CPU。两个不同品牌的CPU,其产品的架构也不相同,例如,Intel、AMD的CPU是X86架构的,而IBM公司的CPU是PowerPC架构,AR…

    2022年5月13日
    116

发表回复

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

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