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);
}
});
- 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
- 18.Z_DEFAULT_COMPRESSION:默认的压缩级别。
- 19.Z_NO_COMPRESSION:无压缩。
- 20.Z_BEST_COMPRESSION:最好的压缩效果。
- 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');
});