能够减少文件体积,传输速度更快。gzip
是节省带宽和加快站点速度的有效方法。javascript
服务端发送数据时能够配置 Content-Encoding:gzip
,用户说明数据的压缩方式css
客户端接受到数据后去检查对应字段的信息,就能够根据相应的格式去解码。html
客户端请求时,能够用 Accept-Encoding:gzip
,用户说明接受哪些压缩方法。前端
在 http/1.0
协议中关于服务端发送的数据能够配置一个 Content-Encoding
字段,这个字段用于说明数据的压缩方法vue
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
复制代码
客户端在接受到返回的数据后去检查对应字段的信息,而后根据对应的格式去作相应的解码。客户端在请求时,能够用 Accept-Encoding
字段说明本身接受哪些压缩方法。java
Accept-Encoding: gzip, deflate
复制代码
Webpack
的 gzip
设置这里使用的插件为:CompressionWebpackPlugin
webpack
const CompressionWebpackPlugin = require('compression-webpack-plugin')
module.exports = {
“plugins”:[new CompressionWebpackPlugin]
}
复制代码
具体配置:nginx
const CompressionWebpackPlugin = require('compression-webpack-plugin');
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp('\\.(js|css)$'),
// 只处理大于xx字节 的文件,默认:0
threshold: 10240,
// 示例:一个1024b大小的文件,压缩后大小为768b,minRatio : 0.75
minRatio: 0.8 // 默认: 0.8
// 是否删除源文件,默认: false
deleteOriginalAssets: false
})
)
复制代码
gzip
后的大小从
277KB
到只有
~91.2KB
!
Nginx
的 gzip
设置打开 /etc/nginx/conf.d
编写如下配置。web
server {
gzip on;
gzip_static on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied any;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
# 注:99.99%的浏览器基本上都支持gzip解压了,因此能够不用设这个值,保持系统默认便可。
gzip_http_version 1.1;
...
}
复制代码
gzip on|off
:面试
gzip off
gzip
模块gzip_static on|off
:
nginx
对于静态文件的处理模块gz
文件,这样能够减小每次请求进行gzip
压缩的CPU
资源消耗。nginx
首先检查是否存在请求静态文件的gz
结尾的文件,若是有则直接返回该gz
文件内容。gzip
的浏览器,启用 gzip_static
模块就必须同时保留原始静态文件和gz
文件。这样的话,在有大量静态文件的状况下,将会大大增长磁盘空间。咱们能够利用nginx
的反向代理功能实现只保留gz
文件。gzip_types mime-type[mime-type...]
:
gzip_types text/html
(默认不对js/css文件进行压缩)nginx
做为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必需要返回包含"Via"
的 header
头。gzip_proxied[off|expired|no-cache|no-store]...:
off
- 关闭全部的代理结果数据的压缩no-cache
- 启用压缩,若是header
头中包含"Cache-Control:no-cache"
头信息gzip_vary on|off:
http
头有关系,加个 vary
头,给代理服务器用的,有的浏览器支持压缩,有的不支持,因此避免浪费不支持的也压缩,因此根据客户端的 HTTP
头来判断,是否须要压缩gzip_comp_level:
默认值:1(建议选择为4~6)
gzip
压缩比/压缩级别,压缩级别1-9,级别越高压缩率越大,固然压缩时间也就越长(传输快但比较消耗cpu)。
gzip_buffers:
默认值: gzip_buffers44k/8k
设置系统获取几个单位的缓存用于存储 gzip的压缩结果数据流。
例如 4 4k 表明以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 表明以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
若是没有设置,默认值是申请跟原始数据相同大小的内存空间去存储 gzip压缩结果。
gzip_http_version:
默认值: gzip_http_version1.1
(就是说对 HTTP/1.1协议的请求才会进行 gzip压缩)
注:99.99%的浏览器基本上都支持 gzip
解压了,因此能够不用设这个值,保持系统默认便可。
保存配置后,从新启动 Nginx:
$ sudo service nginx restart
复制代码
能够看 Network
,但这里我更推荐用 curl
:
经过使用 curl测试每一个资源的请求响应,并检查 Content-Encoding
:
显示 Content-Encoding:gzip
,即为配置成功。
不一样之处在于:
Webpack
压缩会在构建运行期间一次压缩文件,而后将这些压缩版本保存到磁盘。
nginx
在请求时压缩文件时,某些包可能内置了缓存,所以性能损失只发生一次(或不常常),但一般不一样之处在于,这将在响应 HTTP请求时发生。
对于实时压缩,让上游代理(例如 Nginx)处理 gzip和缓存一般更高效,由于它们是专门为此而构建的,而且不会遭受服务端程序运行时的开销(许多都是用C语言编写的) 。
使用 Webpack的
好处是, Nginx
每次请求服务端都要压缩好久才回返回信息回来,不只服务器开销会增大不少,请求方也会等的不耐烦。咱们在 Webpack
打包时就直接生成高压缩等级的文件,做为静态资源放在服务器上,这时将 Nginx做为二重保障就会高效不少。
注:具体是在请求时实时压缩,或在构建时去生成压缩文件,就要看项目业务状况。
不是打算教 Webpack
或 Nginx
,只是以为好玩就简单写了一下。
意思就是写得略粗糙,别喷我。。。
好了,又水完一篇,入正题:
huab119
454274033@qq.com