HTTP请求之gzip压缩知多少( 三 )


对于静态树来说 , 不需要传递用来生成树的那部分信息 。动态树需要传递这个信息 。而当文件比较小的时候 , 传递生成树的信息得不偿失 , 反而会使压缩文件变大 。也就是说对于文件比较小的时候 , 就可能会出现使用静态Huffman编码比使用动态Huffman编码 , 
生成的块小 。
如何开启gzip竟然gzip这么棒 , 赶紧在我们的项目中用起来吧!
express和koa默认都没有开启gzip压缩 , 所以需要自行引入中间件的形式开启压缩 , 针对text文件进行文本压缩 。
【HTTP请求之gzip压缩知多少】const Koa = require("koa");const path = require("path")var compress = require('koa-compress')const App = new Koa();const static = require('koa-static')app.use(compress({filter: function (content_type) {return /text/g.test(content_type)},threshold: 1,flush: require('zlib').Z_SYNC_FLUSH}))app.use(async(ctx, next) => {//ctx 代表响应 ctx.compress = trus 代表允许压缩// ctx.compress = true// ctx.body = "hello"await next()})app.use(static(path.join( __dirname, 'public'),{gzip:true}))//可以配置一个或多个// app.use(static(__dirname + '/static')))app.listen(3000);需要注意 koa 的中间件使用 和express是不一样的 。
其次 , 通过filter 函数来判断是否要进行gzip压缩 。
除了Nginx或server层做gzip压缩 。
也可以在构建的时候压缩 , 生成相应的gz文件 。
const CompressionWebpackPlugin = require('compression-webpack-plugin');webpackConfig.plugins.push(new CompressionWebpackPlugin({asset: '[path].gz[query]',algorithm: 'gzip',test: new RegExp('\.(js|css)$'),threshold: 10240,minRatio: 0.8}))关于gzip的Q & AQ:gzip是否仅限制于文本文件 , 对于二进制文件呢?音频?图片等资源呢?
A:gzip压缩不仅适用于文本文件 , 其实也可以对图片等二进制文件进行压缩 , 但是不推荐这么做 , 由于gzip的压缩过程首先基于字符串进行LZ77处理 , 接下里再通过huffman编码 , 然而 , 大多数的二进制文件 , 已经有自己的编码和压缩方式了 , 对二进制文件进行在压缩 , 可能导致文件更大 , 同时 , 会增大客户端解压缩的压力 , 带来不必要的CPU损耗 。
一些开发者使用HTTP压缩那些已经本地已经压缩过的文件 , 而这些已经压缩过的文件再次被GZip压缩时 , 是不能提高性能的 , 表现在如下两个方面 。
首先 , HTTP压缩需要成本 。Web服务器获得需要的内容 , 然后压缩它 , 最后将它发送到客户端 。如果内容不能被进一步压缩 , 你只是在浪费CPU做无意义的任务 。
其次 , 采用HTTP压缩已经被过压缩的东西并不能使它更小 。事实上 , 添加标头 , 压缩字典 , 并校验响应体实际上使它变得更大 , 如下图所示:

HTTP请求之gzip压缩知多少

文章插图
 
Q:gzip压缩过得文件 , 可以再进行一次gzip压缩吗?多次呢?
A:可以进行再压缩 , 但是gzip首次压缩过后的文件 , 本身已经是二进制文件 , 对文件进行再压缩只会带来没必要的性能损耗 , 同时可能导致文件增大 。
Q:需要对所有文本内容都进行GZIP压缩吗?
A:答案是否定的 , 可以看到我们的压缩过程中 , 需要执行算法 , 假如传输的字符串仅仅几十个字符 , 那么执行算法是完全没有必要的 , 并且 , 对过短的字符进行压缩 , 可能反而导致传输数据量增大 , 例如可能要传输动态构造的huffman树信息等 。
Q:在哪个阶段对文件进行gzip压缩比较合适?
A:在本地构建部署的时候 , 通过webpack生成最终的gz压缩文件部署上服务器 , 是最高效的 , 假如通过引入中间件 , 在请求到来时再对文本文件进行压缩 , 只会让用户的等待时间更长 , 所以笔者认为 , 在webpack打包构建的时候做这件事是最合理的 。




推荐阅读