本文介绍 Node.js 中使用 zlib 模块进行 Gzip 压缩与解压的方法。涵盖本地文件压缩解压、服务端基于 accept-encoding 头返回压缩文件,以及字符串同步压缩的实现代码,帮助开发者快速掌握相关功能。
Node.js Gzip 压缩与解压概述
本文通过具体示例,展示如何在 Node.js 环境中实现基础的压缩与解压功能,供读者参考学习。
本地文件压缩与解压实现
文件压缩示例
仅需几行代码,即可完成本地文件的 Gzip 压缩操作。
var fs = require('fs');
var zlib = require('zlib');
var gzip = zlib.createGzip();
var inFile = fs.createReadStream('./extra/fileForCompress.txt');
var out = fs.createWriteStream('./extra/fileForCompress.txt.gz');
inFile.pipe(gzip).pipe(out);
文件解压示例
解压过程同样简洁,本质上是压缩操作的逆向流程。
var fs = require('fs');
var zlib = require('zlib');
var gunzip = zlib.createGunzip();
var inFile = fs.createReadStream('./extra/fileForCompress.txt.gz');
var outFile = fs.createWriteStream('./extra/fileForCompress1.txt');
inFile.pipe(gunzip).pipe(outFile);
HTTP 服务端压缩策略
服务端 Gzip 压缩处理
实现逻辑非常直观:首先检查请求头中是否包含 accept-encoding 字段,且其值为 gzip。
- 若未包含或值不匹配,则直接返回原始未压缩文件。
- 若包含且值为 gzip,则返回经过 Gzip 压缩后的文件内容。
var http = require('http');
var zlib = require('zlib');
var fs = require('fs');
var filepath = './extra/fileForGzip.html';
var server = http.createServer(function(req, res){
var acceptEncoding = req.headers['accept-encoding'];
var gzip;
if(acceptEncoding.indexOf('gzip')!=-1){ // 判断是否需要gzip压缩
gzip = zlib.createGzip();
// 记得响应 Content-Encoding,告诉浏览器:文件被 gzip 压缩过
res.writeHead(200, {
'Content-Encoding': 'gzip'
});
fs.createReadStream(filepath).pipe(gzip).pipe(res);
}else{
fs.createReadStream(filepath).pipe(res);
}
});
server.listen('3000');
字符串压缩与补充说明
服务端字符串 Gzip 压缩
代码与前述示例类似。此处使用**slib.gzipSync(str)**对字符串执行gzip压缩。
var http = require('http');
var zlib = require('zlib');
var responseText = 'hello world';
var server = http.createServer(function(req, res){
var acceptEncoding = req.headers['accept-encoding'];
if(acceptEncoding.indexOf('gzip')!=-1){
res.writeHead(200, {
'content-encoding': 'gzip'
});
res.end( zlib.gzipSync(responseText) );
}else{
res.end(responseText);
}
});
server.listen('3000');
补充说明
Deflate 压缩的使用方式与 Gzip 类似,此处不再赘述。如需了解更详细的用法,建议查阅官方文档。
希望上述内容能对从事 Node.js 程序设计的读者提供帮助。