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 相关文章推荐
Javascript 事件流和事件绑定
Jul 16 Javascript
JavaScript分析、压缩工具JavaScript Analyser
Dec 31 Javascript
javascript中this的四种用法
May 11 Javascript
js+cookies实现悬浮购物车的方法
May 25 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
JS删除对象中某一属性案例详解
Sep 08 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
精通php的十大要点(上)
2009/02/04 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php利用事务处理转账问题
2015/04/22 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
动态为事件添加js代码示例
2009/02/15 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
python字符串连接的N种方式总结
2014/09/17 Python
浅析Python多线程下的变量问题
2015/04/28 Python
python通过加号运算符操作列表的方法
2015/07/28 Python
python 网络爬虫初级实现代码
2016/02/27 Python
对Python 内建函数和保留字详解
2018/10/15 Python
详解Django中异步任务之django-celery
2020/11/05 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
带病坚持工作事迹
2014/05/03 职场文书
政府法律服务方案
2014/06/14 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
导游词之无锡唐城
2019/12/12 职场文书