一、文件压缩的好处

前端生产环境中将js、css、图片等文件进行压缩的好处显而易见,通过减少数据传输量减小传输时间,节省服务器网络带宽,提高前端性能。

二、http协议如何支持压缩文件的传输

1、浏览器请求数据时,通过Accept-Encoding说明自己可以接受的压缩方法

2、服务端接收到请求后,选取Accept-Encoding中的一种对响应数据进行压缩

3、服务端返回响应数据时,在Content-Encoding字段中说明数据的压缩方式

4、浏览器接收到响应数据后根据Content-Encoding对结果进行解压

注:如果服务器没有对响应数据进行压缩,则不返回Content-Encoding,浏览器也不进行解压

三、什么时候压缩

四、服务器响应请求时压缩(nginx)

服务端先不多说

五、构建时压缩(webpack)

webpack的compression-webpack-plugin插件用于支持构建项目时压缩文件,Vue项目为例,具体配置如下:

1、首先安装插件,命令:npm install --save-dev compression-webpack-plugin

2、在config/index.js文件中打开Gzip开关,配置需要压缩的文件扩展名

由于项目是通过vue-cli搭建的,所以就直接通过webpack来配置了。 修改config目录下的index.js,开启gzip

如果没有默认安装compress-webpack-plugin插件,请先安装。

在build目录下的webpack.prod.conf.js添加代码

 3、webpack.prod.conf.js中设置具体压缩配置项

 

 

if (config.build.productionGzip) {
  var CompressionWebpackPlugin = require('compression-webpack-plugin')

  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp(
        '\\.(' +
        config.build.productionGzipExtensions.join('|') +
        ')$'
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  )
}

 

 4、打包后会同时保留原文件和压缩后的文件,存储等条件允许的情况下,原文件也建议发布到服务器以支持不兼容gzip的浏览器

 

5、服务端nginx启动gzip_static

gzip_static是nginx对于静态文件的处理模块,该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。该模块启用后,nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。

为了要兼容不支持gzip的浏览器,启用gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件(参考文章中提到本文未尝试)。

        nginx需要安装http_gzip_static_module以支持gzip_static,具体方法见《源码安装nginx

由于我用的是nginx,所以我就只讲nginx的配置了。

打开conf/ngxin.conf

http、server、location下加以下代码,详情点击nginx文档

gzip_static on;
gzip_http_version   1.1;
gzip_proxied        expired no-cache no-store private auth;
gzip_disable        "MSIE [1-6]\.";
gzip_vary           on;

最后 nginx -s reload 重启。

 压缩前

压缩后

gzip压缩原理

浏览器请求资源文件时会自动带一个Accept-Encoding的请求头告诉服务器支持的压缩编码类型。

但是不是每个浏览器都支持gzip的,如果知道客户端是否支持gzip呢,请求头中有个Accept-Encoding来标识对压缩的支持。客户端http请求头声明浏览器支持的压缩方式,服务端配置启用压缩,压缩的文件类型,压缩方式。当客户端请求到服务端的时候,服务器解析请求头,如果客户端支持gzip压缩,响应时对请求的资源进行压缩并返回给客户端,浏览器按照自己的方式解析,在http响应头,我们可以看到content-encoding:gzip,这是指服务端使用了gzip的压缩方式。

那么怎么看有没有用gzip压缩的文件呢,打开f12,查看network,点击“use large rows”表情来查看更多信息。包含了压缩以后的大小和源文件的大小。

 

 

 

奇迹般的,主页从187kb压缩到了59kb。

content-encoding是gzip的话就说明返回的是gzip

还有一点 gzip不压缩图片,因为压缩之后会更大- -,所以一般到是压缩css和js

 

 

如何启用gzip

前面说过了,启用gzip需要客户端和服务端的支持,如果客户端支持gzip的解析,那么只要服务端能够返回gzip的文件就可以启用gzip了,现在来说一下几种不同的环境下的服务端如何配置

开启gzip 如果浏览器端不支持解压 页面会怎么样

支持baigzip的浏览器会通过HTTP头告诉服du务器zhi,如Accept-Encoding: gzip。服务器看到这个dao才返回gzip的zhuanshu。这是内HTTP协议的规容定。
如果浏览器不支持,那么服务器返回的数据不会是gzip内容了。

Accept-Encoding 为浏览器支持的的方式

Accept-Encoding: gzip,deflate,sdch

那么问题来了,前端发起请求需要设置 Accept-Encoding:gzip 吗?这样不就是强制了吗?如果客户端不支持怎么办?

关于HTTP 请求头Accept-Encoding 的理解

Accept-Encoding表示Http响应是否进行压缩,一般的浏览器在访问网页时,是默认在请求头中加入
Accept-Encoding: gzip, deflate ,表示这个请求的内容希望被压缩,压缩的目的是为了减少网络流量,
但是这个只是协议,只能是要求而不是强制的,如果服务器不支持压缩或者没有开启压缩,则不能起到作用,
如果服务器也是支持压缩或者开启压缩,则会在响应头中加入Content-Encoding: gzip 头部,

 

posted on 2020-12-04 15:11  京鸿一瞥  阅读(2684)  评论(0)    收藏  举报