nodej --zlib

Node.js 的 zlib 模块提供了对数据进行压缩和解压缩的功能。zlib 基于 zlib 库(C语言实现),支持多种压缩算法,包括 Gzip、Deflate 和 Brotli。这个模块常用于处理文件压缩、数据传输压缩等场景。

1. 引入 zlib 模块

在 Node.js 中,zlib 模块是内置模块,因此不需要额外安装。使用时只需通过 require 引入:

const zlib = require('zlib');

2. 支持的压缩算法

zlib 模块支持以下几种压缩算法:

  • 1.Gzip:广泛使用的压缩格式,通常用于 HTTP 请求和响应中的内容压缩。
  • 2.Deflate:类似于 Gzip,但它不包括 Gzip 文件头。常用于 HTTP 协议中的压缩。
  • 3.Brotli:现代的压缩算法,相比于 Gzip 和 Deflate,Brotli 通常提供更好的压缩比。

3. 常用方法

3.1 压缩数据

可以使用 zlib 模块对数据进行压缩,常见的压缩方法有 gzip、deflate 和 brotliCompress。
使用 gzip 压缩

const zlib = require('zlib');

// 待压缩的数据
const input = 'Hello, world! This is some text that needs compression.';

zlib.gzip(input, (err, buffer) => {
  if (err) {
	console.error('Compression failed:', err);
  } else {
	console.log('Compressed Data:', buffer);
  }
});

image

  • gzip(input, callback):压缩输入数据 input(通常是一个字符串或 Buffer)并返回压缩后的数据。

使用 deflate 压缩

zlib.deflate(input, (err, buffer) => {
  if (err) {
	console.error('Compression failed:', err);
  } else {
	console.log('Compressed Data:', buffer);
  }
});
  • deflate(input, callback):使用 Deflate 算法压缩数据。

使用 brotliCompress 压缩

zlib.brotliCompress(input, (err, buffer) => {
  if (err) {
	console.error('Compression failed:', err);
  } else {
	console.log('Compressed Data:', buffer);
  }
});
  • brotliCompress(input, callback):使用 Brotli 算法进行压缩。

3.2 解压缩数据

解压缩操作类似于压缩,可以使用 gunzip、inflate 和 brotliDecompress 方法。
使用 gunzip 解压缩

const compressedData = Buffer.from('H4sIAAAAAAAE/wA...'); // 示例压缩数据

zlib.gunzip(compressedData, (err, buffer) => {
  if (err) {
	console.error('Decompression failed:', err);
  } else {
	console.log('Decompressed Data:', buffer.toString());
  }
});
  • gunzip(input, callback):解压缩 Gzip 格式的压缩数据。

使用 inflate 解压缩

zlib.inflate(compressedData, (err, buffer) => {
  if (err) {
	console.error('Decompression failed:', err);
  } else {
	console.log('Decompressed Data:', buffer.toString());
  }
});
  • inflate(input, callback):解压缩 Deflate 格式的压缩数据。

使用 brotliDecompress 解压缩

zlib.brotliDecompress(compressedData, (err, buffer) => {
  if (err) {
	console.error('Decompression failed:', err);
  } else {
	console.log('Decompressed Data:', buffer.toString());
  }
});
  • brotliDecompress(input, callback):解压缩 Brotli 格式的压缩数据。

3.3 流式压缩与解压缩

zlib 还支持流式压缩和解压缩,这对于大文件的处理非常有用,避免将整个文件加载到内存中。流式压缩和解压缩通常与 stream 模块一起使用。
流式压缩

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

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

// 创建写入流
const writeStream = fs.createWriteStream('output.gz');

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

// 将读取流传递给 gzip 压缩流,然后输出到写入流
readStream.pipe(gzip).pipe(writeStream);
  • createGzip():创建一个 Gzip 压缩流。
  • pipe():将一个流连接到另一个流,这里将文件内容通过 Gzip 压缩流传递并写入输出文件。

流式解压缩

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

// 创建读取流
const readStream = fs.createReadStream('input.gz');

// 创建写入流
const writeStream = fs.createWriteStream('output.txt');

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

// 将读取流传递给 gunzip 解压缩流,然后输出到写入流
readStream.pipe(gunzip).pipe(writeStream);
  • createGunzip():创建一个 Gzip 解压缩流。

4. 压缩选项和参数

许多压缩和解压缩函数允许你指定额外的选项来控制压缩行为。
压缩级别
压缩操作通常支持指定压缩级别,压缩级别控制了压缩算法的速度和压缩比。zlib 支持的压缩级别通常为 0 到 9,其中 0 为最快但压缩效果最差,9 为最慢但压缩效果最好。默认值通常是 6。

zlib.gzip(input, { level: 9 }, (err, buffer) => {
  if (err) {
	console.error('Compression failed:', err);
  } else {
	console.log('Compressed Data:', buffer);
  }
});
  • level:指定压缩级别。level 值为 0 到 9,6 是默认值。

压缩策略
压缩策略允许控制压缩的方式。常见的策略有:

  • zlib.constants.Z_DEFAULT_COMPRESSION
  • zlib.constants.Z_NO_COMPRESSION
  • zlib.constants.Z_BEST_COMPRESSION
  • zlib.constants.Z_BEST_SPEED
  1. 18.Z_DEFAULT_COMPRESSION:默认的压缩级别。
  2. 19.Z_NO_COMPRESSION:无压缩。
  3. 20.Z_BEST_COMPRESSION:最好的压缩效果。
  4. 21.Z_BEST_SPEED:最快的压缩速度。

5.http请求压缩

Accept-Encoding:告诉服务器客户端支持哪些压缩格式。常见的选项有:
gzip:客户端支持 Gzip 压缩。
deflate:客户端支持 Deflate 压缩。
br:客户端支持 Brotli 压缩。
浏览器通常会自动发送这些请求头,以便服务器知道哪些压缩算法可以使用。

Content-Encoding:告诉客户端响应数据是经过哪种压缩格式压缩的。常见的压缩类型包括:
gzip:Gzip 压缩。
deflate:Deflate 压缩。
br:Brotli 压缩。
Content-Length:是压缩后的数据大小。

客户端如何解压缩响应

一旦客户端收到响应数据,它会检查响应头中的 Content-Encoding,并根据压缩格式选择合适的解压缩方式:

如果响应体是 gzip 压缩的,客户端会自动解压。
如果响应体是 deflate 压缩的,客户端会自动解压。
如果响应体是 br(Brotli)压缩的,浏览器也能解压(需要支持 Brotli)。

Node.js 客户端发送压缩请求

const axios = require('axios');

axios.get('https://example.com/some-resource', {
  headers: {
	'Accept-Encoding': 'gzip, deflate, br', // 请求支持的压缩格式
  }
}).then(response => {
  console.log('Response data:', response.data);
}).catch(error => {
  console.error('Request failed:', error);
});

Node.js 服务器响应压缩数据

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

const server = http.createServer((req, res) => {
  // 如果客户端支持 gzip 压缩,使用 Gzip 压缩响应
  if (req.headers['accept-encoding'] && req.headers['accept-encoding'].includes('gzip')) {
	res.setHeader('Content-Encoding', 'gzip');
	res.setHeader('Content-Type', 'text/plain; charset=UTF-8');

	// 创建一个可写的 Gzip 流
	const gzip = zlib.createGzip();

	res.writeHead(200);

	// 将响应内容压缩并发送给客户端
	res.pipe(gzip).end('Hello, this is a compressed response!');
  } else {
	res.setHeader('Content-Type', 'text/plain; charset=UTF-8');
	res.writeHead(200);
	res.end('Hello, this is a plain response!');
  }
});

server.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});
posted @ 2025-04-07 18:00  蜗牛般庄  阅读(107)  评论(0)    收藏  举报
Title
页脚 HTML 代码