黑人的命也是命。
支持平等司法倡议.

compression

NPM Version NPM Downloads Build Status Test Coverage

Node.js 压缩中间件。

支持以下压缩编码

  • deflate
  • gzip

安装

这是一个通过 npm 注册表 可用的 Node.js 模块。安装使用 npm install 命令

$ npm install compression

API

var compression = require('compression')

compression([options])

使用给定的 options 返回压缩中间件。中间件将尝试压缩通过中间件的所有请求的响应主体,基于给定的 options

此中间件永远不会压缩包含带有 no-transform 指令Cache-Control 标头的响应,因为压缩会转换主体。

选项

compression() 在选项对象中接受这些属性。除了下面列出的属性之外,还可以将 zlib 选项传递到选项对象中。

chunkSize

默认值为 zlib.Z_DEFAULT_CHUNK,或 16384

有关用法的详细信息,请参阅 Node.js 文档

filter

一个函数,用于决定是否应将响应视为压缩对象。此函数以 filter(req, res) 的形式调用,并期望返回 true 以将响应视为压缩对象,或返回 false 以不压缩响应。

默认的过滤器函数使用 compressible 模块来确定 res.getHeader('Content-Type') 是否可压缩。

level

要应用于响应的 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')

memLevel

这指定了应为内部压缩状态分配多少内存,它是一个介于 1(最小级别)和 9(最大级别)之间的整数。

默认值为 zlib.Z_DEFAULT_MEMLEVEL,或 8

有关用法的详细信息,请参阅 Node.js 文档

strategy

这用于调整压缩算法。此值仅影响压缩率,不影响压缩输出的正确性,即使它没有被适当地设置。

  • zlib.Z_DEFAULT_STRATEGY 用于正常数据。
  • zlib.Z_FILTERED 用于由过滤器(或预测器)生成的数据。过滤后的数据主要由具有某种随机分布的小值组成。在这种情况下,压缩算法经过调整以更好地压缩它们。效果是强制进行更多哈夫曼编码和更少的字符串匹配;它介于zlib.Z_DEFAULT_STRATEGYzlib.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 响应头。

windowBits

默认值为 zlib.Z_DEFAULT_WINDOWBITS15

有关用法的详细信息,请参阅 Node.js 文档

.filter

默认的 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

此模块向 res.flush() 方法添加了一个方法,以强制将部分压缩的响应刷新到客户端。

示例

express/connect

在将此模块与 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)
  })
})

许可证

麻省理工学院