相关文章
- P01: 从实用角度出发的node.js学习教程
- P02:node基本使用
- P03:node内置模块path
- P04:nodeAPI 之 Buffer
- P05:node内置模块 之 events
- P06:node内置模块 fs(1)
- P07:node内置模块 fs(2)
- P08:node实现静态服务器 ~ 创建项目
- P09:node实现静态服务器 ~ hello http
- P10:node实现静态服务器 ~ 静态读取文件或文件夹
- P11:node实现静态服务器 ~ 初步优化体验
- P12:node实现静态服务器 ~ Content-Type优化设置
- P13:node实现静态服务器 ~ Accept-Encoding与Content-Encoding
使用压缩的优点
- 明显降低请求时间
- 由于体积减小,也会降低我们服务器的负载,以及带宽的占用。
- 对于前端页面来说,就是更快的响应以及展示
- 静态资源推荐使用压缩版
Accept-Encoding与Content-Encoding 介绍
前端的性能优化是一个永不停歇的路程,今天介绍性能优化的其中一种方式,通过压缩来节省http请求的流量,实现过程中依赖http中header部分的两个字段,
Accept-Encoding(Request Header)和Content-EnCoding(Response Header)
含义与作用
为什么首先要讲这两个字段的含义呢?因为当你打开一个页面时,请求到了服务端,如果请求上没有这种编码的标识的话,服务端是不知道该不该压缩?使用哪种方式压缩的?
所以Request Header里的Accept-Encoding就是用来告诉服务端客户端是支持哪些编码方式的。
一般的值有gzip/compress/deflate/br等,可以多个,中间用逗号隔开。如:
Accept-Encoding: gzip, deflate, br
当服务端接收到请求,并且从Response Header里拿到编码标识时,就可以选择其中一种方式来进行编码压缩,然后返给客户端。
但是如果Response Header里没有编码标识的话,客户端就不知道服务端是用的哪种方式压缩的,所以需要Content-Encoding(Response Header)来标识服务端压缩时所用的压缩方式。
一句话:
Accept-Encoding(Request Header)用来标识客户端能够理解的内容编码方式。Content-EnCoding(Response Header)用来标识主体进行了何种方式的内容编码转换。
代码修改
配置文件 defaultConfig.js
// 配置需要压缩的文件类型
compress: /\.(html|css|js|md)/
核心代码 ~ header/compress.js
const { createGzip, createDeflate } = require('zlib')
/**
* @param rs 压缩本体
* @param req 浏览器支持的压缩类型
* @param res 通知设置请求头
*/
module.exports = (rs, req, res) => {
// 获取浏览器支持的压缩格式
const acceptEncoding = req.headers['accept-encoding']
// 暂定支持压缩 gzip|deflate 使用node内置的压缩算法 zlib
if (!acceptEncoding || !acceptEncoding.match(/\b(gzip|deflate)\b/)) {
return rs
} else if (acceptEncoding.match(/\bgzip\b/)) {
// 通知浏览器使用何种方式压缩
res.setHeader('Content-Encoding', 'gzip')
// 使用其pipe 方法即可
return rs.pipe(createGzip())
} else if (acceptEncoding.match(/\bdeflate\b/)) {
res.setHeader('Content-Encoding', 'deflate')
return rs.pipe(createDeflate())
}
}
路由文件修改
然并软,要踩坑
这时候发现点击相关项目报如下错误
意思就是说不允许再次设置请求头
修正
现在需要将请求头设置合并为一次
- 处理方法中传入参数,取消此处的请求头设置
- 接收参数,统一设置请求头
效果明显
可以看到,原文件大小
4.8k,请求用时20ms
别压缩后文件
1.7K,请求用时3ms
close