NodeJs-Zlib

 后端   小卒子   2024-09-11 09:29   191
  nodejs

Node.js 的 zlib 模块提供了对数据进行压缩和解压缩的功能。该模块支持多种压缩格式,包括 Gzip、Deflate、Brotli 等,常用于处理 HTTP 请求和响应的压缩,或者在存储和传输过程中节省带宽和存储空间。

Node.js 的 zlib 模块提供了对数据进行压缩和解压缩的功能。该模块支持多种压缩格式,包括 Gzip、Deflate、Brotli 等,常用于处理 HTTP 请求和响应的压缩,或者在存储和传输过程中节省带宽和存储空间。

以下是 zlib 模块的详细介绍,包括其所有属性、方法以及使用示例。

引入模块

const zlib = require('zlib');

或者使用 ES 模块语法:

import * as zlib from 'zlib';

可用的压缩方法

  • zlib.gzip: Gzip 压缩。
  • zlib.gunzip: Gzip 解压缩。
  • zlib.deflate: Deflate 压缩。
  • zlib.inflate: Deflate 解压缩。
  • zlib.brotliCompress: Brotli 压缩。
  • zlib.brotliDecompress: Brotli 解压缩.

zlib 模块提供的类和方法

1. zlib.gzip

zlib.gzip(buffer[, options], callback)

  • buffer {Buffer | string} 要压缩的数据。
  • options {Object} 可选配置:
    • level {number} 压缩级别,范围从 0 到 9。默认为 zlib.constants.Z_DEFAULT_COMPRESSION
    • memLevel {number} 内存使用级别,范围从 1 到 9。默认为 8
    • windowBits {number} 窗口大小,范围从 8 到 15。默认为 15
  • callback {Function} 回调函数,接受两个参数:errresulterr 是错误信息,result 是压缩后的数据。

示例

const zlib = require('zlib');

zlib.gzip('Hello World', (err, buffer) => {
  if (err) {
    console.error('Error during gzip:', err);
    return;
  }
  console.log('Gzipped data:', buffer);
});

2. zlib.gunzip

zlib.gunzip(buffer[, options], callback)

  • buffer {Buffer | string} 要解压缩的数据。
  • options {Object} 可选配置,与 zlib.gzip 的选项类似。
  • callback {Function} 回调函数,接受两个参数:errresulterr 是错误信息,result 是解压缩后的数据。

示例

const zlib = require('zlib');

zlib.gunzip(gzippedBuffer, (err, buffer) => {
  if (err) {
    console.error('Error during gunzip:', err);
    return;
  }
  console.log('Gunzip result:', buffer.toString());
});

3. zlib.deflate

zlib.deflate(buffer[, options], callback)

  • buffer {Buffer | string} 要压缩的数据。
  • options {Object} 可选配置,与 zlib.gzip 的选项类似。
  • callback {Function} 回调函数,接受两个参数:errresulterr 是错误信息,result 是压缩后的数据。

示例

const zlib = require('zlib');

zlib.deflate('Hello World', (err, buffer) => {
  if (err) {
    console.error('Error during deflate:', err);
    return;
  }
  console.log('Deflated data:', buffer);
});

4. zlib.inflate

zlib.inflate(buffer[, options], callback)

  • buffer {Buffer | string} 要解压缩的数据。
  • options {Object} 可选配置,与 zlib.deflate 的选项类似。
  • callback {Function} 回调函数,接受两个参数:errresulterr 是错误信息,result 是解压缩后的数据。

示例

const zlib = require('zlib');

zlib.inflate(deflatedBuffer, (err, buffer) => {
  if (err) {
    console.error('Error during inflate:', err);
    return;
  }
  console.log('Inflated result:', buffer.toString());
});

5. zlib.brotliCompress

zlib.brotliCompress(buffer[, options], callback)

  • buffer {Buffer | string} 要压缩的数据。
  • options {Object} 可选配置:
    • params {Object} Brotli 压缩参数,如 quality, lgwin 等。
  • callback {Function} 回调函数,接受两个参数:errresulterr 是错误信息,result 是压缩后的数据。

示例

const zlib = require('zlib');

zlib.brotliCompress('Hello World', (err, buffer) => {
  if (err) {
    console.error('Error during brotliCompress:', err);
    return;
  }
  console.log('Brotli compressed data:', buffer);
});

6. zlib.brotliDecompress

zlib.brotliDecompress(buffer[, options], callback)

  • buffer {Buffer | string} 要解压缩的数据。
  • options {Object} 可选配置,与 zlib.brotliCompress 的选项类似。
  • callback {Function} 回调函数,接受两个参数:errresulterr 是错误信息,result 是解压缩后的数据。

示例

const zlib = require('zlib');

zlib.brotliDecompress(brotliCompressedBuffer, (err, buffer) => {
  if (err) {
    console.error('Error during brotliDecompress:', err);
    return;
  }
  console.log('Brotli decompressed result:', buffer.toString());
});

流式压缩和解压缩

zlib 模块还支持流式操作,可以用于处理较大的数据流。以下是一些常用的流式方法。

1. zlib.createGzip

zlib.createGzip([options])

  • options {Object} 可选配置,支持与 zlib.gzip 相同的选项。

示例

const fs = require('fs');
const zlib = require('zlib');

// 创建一个 gzip 压缩流
const gzip = zlib.createGzip();

// 创建一个读流
const input = fs.createReadStream('input.txt');

// 创建一个写流
const output = fs.createWriteStream('input.txt.gz');

// 将数据流通过 gzip 压缩流
input.pipe(gzip).pipe(output);

2. zlib.createGunzip

zlib.createGunzip([options])

  • options {Object} 可选配置,支持与 zlib.gunzip 相同的选项。

示例

const fs = require('fs');
const zlib = require('zlib');

// 创建一个 gunzip 解压缩流
const gunzip = zlib.createGunzip();

// 创建一个读流
const input = fs.createReadStream('input.txt.gz');

// 创建一个写流
const output = fs.createWriteStream('input.txt');

// 将数据流通过 gunzip 解压缩流
input.pipe(gunzip).pipe(output);

3. zlib.createDeflate

zlib.createDeflate([options])

  • options {Object} 可选配置,支持与 zlib.deflate 相同的选项。

示例

const fs = require('fs');
const zlib = require('zlib');

// 创建一个 deflate 压缩流
const deflate = zlib.createDeflate();

// 创建一个读流
const input = fs.createReadStream('input.txt');

// 创建一个写流
const output = fs.createWriteStream('input.txt.deflate');

// 将数据流通过 deflate 压缩流
input.pipe(deflate).pipe(output);

4. zlib.createInflate

zlib.createInflate([options])

  • options {Object} 可选配置,支持与 zlib.inflate 相同的选项。

示例

const fs = require('fs');
const zlib = require('zlib');

// 创建一个 inflate 解压缩流
const inflate = zlib.createInflate();

// 创建一个读流
const input = fs.createReadStream('input.txt.deflate');

// 创建一个写流
const output = fs.createWriteStream('input.txt');

// 将数据流通过 inflate 解压缩流
input.pipe(inflate).pipe(output);

5. zlib.createBrotliCompress

**zlib.createBrotliCompress([options])

**

  • options {Object} 可选配置,支持与 zlib.brotliCompress 相同的选项。

示例

const fs = require('fs');
const zlib = require('zlib');

// 创建一个 Brotli 压缩流
const brotliCompress = zlib.createBrotliCompress();

// 创建一个读流
const input = fs.createReadStream('input.txt');

// 创建一个写流
const output = fs.createWriteStream('input.txt.br');

// 将数据流通过 Brotli 压缩流
input.pipe(brotliCompress).pipe(output);

6. zlib.createBrotliDecompress

zlib.createBrotliDecompress([options])

  • options {Object} 可选配置,支持与 zlib.brotliDecompress 相同的选项.

示例

const fs = require('fs');
const zlib = require('zlib');

// 创建一个 Brotli 解压缩流
const brotliDecompress = zlib.createBrotliDecompress();

// 创建一个读流
const input = fs.createReadStream('input.txt.br');

// 创建一个写流
const output = fs.createWriteStream('input.txt');

// 将数据流通过 Brotli 解压缩流
input.pipe(brotliDecompress).pipe(output);

常量

  • zlib.constants: 包含一些常用的常量。

    • Z_BEST_COMPRESSION {number} 最大压缩级别。
    • Z_BEST_SPEED {number} 最快压缩速度。
    • Z_DEFAULT_COMPRESSION {number} 默认压缩级别。
    • Z_DEFAULT_STRATEGY {number} 默认策略。
    • Z_NO_FLUSH {number} 不立即刷新。

总结

Node.js 的 zlib 模块为数据压缩和解压缩提供了全面的支持,包括对 Gzip、Deflate 和 Brotli 格式的操作。它支持同步和异步 API,可以在需要高效处理数据流时使用。通过流式操作,可以方便地处理大规模的数据,从而提高应用程序的性能。