Node.js 压缩中间件。
支持以下压缩编码
这是一个通过 npm 注册表 可用的 Node.js 模块。安装使用 npm install
命令
$ npm install compression
var compression = require('compression')
使用给定的 options
返回压缩中间件。中间件将尝试压缩通过中间件的所有请求的响应主体,基于给定的 options
。
此中间件永远不会压缩包含带有 no-transform
指令 的 Cache-Control
标头的响应,因为压缩会转换主体。
compression()
在选项对象中接受这些属性。除了下面列出的属性之外,还可以将 zlib 选项传递到选项对象中。
默认值为 zlib.Z_DEFAULT_CHUNK
,或 16384
。
有关用法的详细信息,请参阅 Node.js 文档。
一个函数,用于决定是否应将响应视为压缩对象。此函数以 filter(req, res)
的形式调用,并期望返回 true
以将响应视为压缩对象,或返回 false
以不压缩响应。
默认的过滤器函数使用 compressible 模块来确定 res.getHeader('Content-Type')
是否可压缩。
要应用于响应的 zlib 压缩级别。级别越高,压缩效果越好,但完成时间越长。级别越低,压缩效果越差,但速度更快。
这是一个介于 0
(无压缩)和 9
(最大压缩)之间的整数。特殊值 -1
可以用于表示“默认压缩级别”,这是速度和压缩之间的默认折衷方案(目前等效于级别 6)。
-1
默认压缩级别(也称为 zlib.Z_DEFAULT_COMPRESSION
)。0
无压缩(也称为 zlib.Z_NO_COMPRESSION
)。1
最快压缩(也称为 zlib.Z_BEST_SPEED
)。2
3
4
5
6
(目前 zlib.Z_DEFAULT_COMPRESSION
指向的值)。7
8
9
最佳压缩(也称为 zlib.Z_BEST_COMPRESSION
)。默认值为 zlib.Z_DEFAULT_COMPRESSION
,或 -1
。
注意 在上面的列表中,zlib
来自 zlib = require('zlib')
。
这指定了应为内部压缩状态分配多少内存,它是一个介于 1
(最小级别)和 9
(最大级别)之间的整数。
默认值为 zlib.Z_DEFAULT_MEMLEVEL
,或 8
。
有关用法的详细信息,请参阅 Node.js 文档。
这用于调整压缩算法。此值仅影响压缩率,不影响压缩输出的正确性,即使它没有被适当地设置。
zlib.Z_DEFAULT_STRATEGY
用于正常数据。zlib.Z_FILTERED
用于由过滤器(或预测器)生成的数据。过滤后的数据主要由具有某种随机分布的小值组成。在这种情况下,压缩算法经过调整以更好地压缩它们。效果是强制进行更多哈夫曼编码和更少的字符串匹配;它介于zlib.Z_DEFAULT_STRATEGY
和 zlib.Z_HUFFMAN_ONLY
之间。zlib.Z_FIXED
用于防止使用动态哈夫曼代码,从而允许为特殊应用程序提供更简单的解码器。zlib.Z_HUFFMAN_ONLY
用于强制仅使用哈夫曼编码(无字符串匹配)。zlib.Z_RLE
用于将匹配距离限制为 1(游程长度编码)。这旨在与 zlib.Z_HUFFMAN_ONLY
几乎一样快,但为 PNG 图像数据提供更好的压缩。注意 在上面的列表中,zlib
来自 zlib = require('zlib')
。
压缩前响应主体大小的字节阈值,用于考虑响应,默认值为 1kb
。这是一个字节数或 bytes 模块接受的任何字符串。
注意 这只是一个建议设置;如果在写入响应头时无法确定响应大小,则假定响应超过阈值。要保证可以确定响应大小,请确保设置 Content-Length
响应头。
默认值为 zlib.Z_DEFAULT_WINDOWBITS
或 15
。
有关用法的详细信息,请参阅 Node.js 文档。
默认的 filter
函数。这用于构建一个自定义过滤器函数,该函数是默认函数的扩展。
var compression = require('compression')
var express = require('express')
var app = express()
app.use(compression({ filter: shouldCompress }))
function shouldCompress (req, res) {
if (req.headers['x-no-compression']) {
// don't compress responses with this request header
return false
}
// fallback to standard filter function
return compression.filter(req, res)
}
此模块向 res.flush()
方法添加了一个方法,以强制将部分压缩的响应刷新到客户端。
在将此模块与 express 或 connect 一起使用时,只需像您喜欢的那样 app.use
该模块即可。通过中间件传递的请求将被压缩。
var compression = require('compression')
var express = require('express')
var app = express()
// compress all responses
app.use(compression())
// add all routes
由于压缩的性质,此模块不能与服务器发送事件开箱即用。要压缩内容,需要缓冲输出窗口以获得良好的压缩。通常在使用服务器发送事件时,需要将某些数据块发送到客户端。
您可以在需要将数据写入客户端时调用 res.flush()
来实现这一点。
var compression = require('compression')
var express = require('express')
var app = express()
// compress responses
app.use(compression())
// server-sent event stream
app.get('/events', function (req, res) {
res.setHeader('Content-Type', 'text/event-stream')
res.setHeader('Cache-Control', 'no-cache')
// send a ping approx every 2 seconds
var timer = setInterval(function () {
res.write('data: ping\n\n')
// !!! this is the important part
res.flush()
}, 2000)
res.on('close', function () {
clearInterval(timer)
})
})