Node.js服务器开启Gzip压缩教程


Posted in Javascript onAugust 11, 2017

Gzip是什么

复制大神们的解释吧:

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的.

Gzip压缩率

举个例子,通过webpack打包后的js文件比较大,虽然我们可以利用chunk功能将文件分开混淆打包,但是总体积还是不小;这时候看看利用gzip压缩的效果:

Node.js服务器开启Gzip压缩教程

启用Gzip前

Node.js服务器开启Gzip压缩教程

启用Gzip后

对比其中三个文件前后压缩大小:

文本类文件:

iview.min.js: 429kb -> 109kb,压缩比74.6% base.min.js: 309kb -> 81.7kb,压缩比73.56% style.min.css: 207kb -> 30.9kb,压缩比85%

图片:

图片1: 63.2kb -> 63.2kb,压缩比0%?

我们看到文本类文件的压缩效果非常显著,但是图片体积没变。看一下文本类的http响应头是有gzip压缩过:

Node.js服务器开启Gzip压缩教程

而图片的没有:

Node.js服务器开启Gzip压缩教程

这是因为一般对于图片(png,jpg等)使用gzip的效果不好甚至恰得其反,所以一般都默认对图片不进行gzip压缩。

node.js启用gzip

下面说一下node的express框架如何使用gzip:

1.安装一个compression依赖:

npm install compression

2.调用:

var compression = require('compression')
var app = express();

//尽量在其他中间件前使用compression
app.use(compression());

基本的使用就是这样就ok了,另外如果想只对某些请求使用此功能,可以使用它的过滤方法:

app.use(compression({filter: shouldCompress}))

function shouldCompress (req, res) {
 if (req.headers['x-no-compression']) {
  // 这里就过滤掉了请求头包含'x-no-compression'
  return false
 }

 return compression.filter(req, res)
}

其他的功能请参考compression的文档。

另外附上nginx的配置

#on为启用,off为关闭
gzip on;

#设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_min_length 1k;

#获取多少内存用于缓存压缩结果,‘4 16k'表示以16k*4为单位获得
gzip_buffers 4 16k;

#gzip压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值
gzip_comp_level 5;

#对特定的MIME类型生效,其中'text/html'被系统强制启用
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;

简单解释下参数

1) gzip

语法:gzip on/off
默认值:off
作用域:http, server, location
说明:开启或者关闭 gzip 模块,这里使用 on 表示启动

2) gzip_min_length

语法:gzip_min_length length
默认值:gzip_min_length 0
作用域:http, server, location
说明:设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。|

3) gzip_buffers

语法: gzip_buffers number size
默认值: gzip_buffers 4 4k/8k
作用域: http, server, location
说明:设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k 代表以 16k 为单位,按照原始数据大小以 16k 为单位的4倍申请内存。

4) gzip_comp_level

语法: gzip_comp_level 1..9
默认值: gzip_comp_level 1
作用域: http, server, location
说明:gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。这里设置为 5。
5) gzip_types

语法: gzip_types mime-type [mime-type ...]
默认值: gzip_types text/html
作用域: http, server, location
说明:匹配MIME类型进行压缩,(无论是否指定)"text/html" 类型总是会被压缩的。这里设置为 text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php。

Javascript 相关文章推荐
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
Jun 11 Javascript
javascript Array.prototype.slice使用说明
Oct 11 Javascript
Jquery焦点与失去焦点示例应用
Jun 10 Javascript
node.js中的fs.futimesSync方法使用说明
Dec 17 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
Mar 02 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
Aug 05 Javascript
javascript中toFixed()四舍五入使用方法详解
Sep 28 Javascript
Angular6 Filter实现页面搜索的示例代码
Dec 02 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
Apr 24 Javascript
解决layui表格内文本超出隐藏的问题
Sep 12 Javascript
对vuex中getters计算过滤操作详解
Nov 06 Javascript
关于AngularJS中几种Providers的区别总结
May 17 Javascript
JS SetInterval 代码实现页面轮询
Aug 11 #Javascript
IScroll5实现下拉刷新上拉加载的功能实例
Aug 11 #Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 #Javascript
原生js 封装get ,post, delete 请求的实例
Aug 11 #Javascript
laydate 显示结束时间不小于开始时间的实例
Aug 11 #Javascript
JS非空验证及邮箱验证的实例
Aug 11 #Javascript
vue如何获取点击事件源的方法
Aug 10 #Javascript
You might like
第五节 克隆 [5]
2006/10/09 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
php实现评论回复删除功能
2017/05/23 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
JavaScript实现图片放大镜效果
2019/06/27 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
python实现巡检系统(solaris)示例
2014/04/02 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
安装PyInstaller失败问题解决
2019/12/14 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
Laravel中Kafka的使用详解
2021/03/24 PHP
职业生涯规划设计步骤
2014/01/12 职场文书
护士辞职信范文
2014/01/19 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
承诺书范文
2014/06/03 职场文书
建筑管理专业求职信
2014/07/28 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
2014年教务工作总结
2014/12/03 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android