P13:node实现静态服务器 ~ 实现文件压缩

1,072 阅读3分钟

相关文章

使用压缩的优点

  • 明显降低请求时间
  • 由于体积减小,也会降低我们服务器的负载,以及带宽的占用。
  • 对于前端页面来说,就是更快的响应以及展示
  • 静态资源推荐使用压缩版

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