宝哥软件园

NodeJS服务器实现gzip压缩的示例代码

编辑:宝哥软件园 来源:互联网 时间:2021-08-29

本文介绍NodeJS服务器实现gzip压缩并分享给大家,如下:

当浏览器向服务器请求静态资源时,服务器压缩静态资源并将其返回给服务器,以减少网络传输过程中消耗的流量和时间。压缩算法包括deflate和gzip,最常用的是gzip压缩。

gzip简介

浏览器和服务器之间通过gzip压缩流的传输过程如下图所示。

当浏览器向服务器请求静态资源时,服务器将静态资源处理后转换为压缩流,大大减小了文件大小,然后将压缩流返回给浏览器,浏览器再通过压缩类型将压缩流解析为静态文件。

zlib模块的使用

1.压缩

在NodeJS中,zlib模块帮助我们实现不同类型的压缩。实际上,压缩的过程就是创建流的过程,创建的压缩流是Transform类型的。读取文件内容后,通过转换流创建一个新类型的文件。

const zlib=require(' zlib ');const fs=require(' fs ');const path=require(' path ');//压缩函数gzip(source) {//处理输入输出的文件路径让source path=path。join (_ _ dirname,source);让gzipPath=` $ { sourcePath } .gz//创建转换流让gzip=zlib . creategzip();//创建一个可读的流让RS=fs . createreadstream(source path);//创建一个可写流,让ws=fs . createwritestream(gzippath);//实现转换rs.pipe(gzip)。管道(ws);} gzip(' index . html ');执行上面的代码,查看index.gz压缩包是否出现在根目标中。

2、减压

压缩的过程是可逆的,可以先压缩再解压。无论是在浏览器还是服务器,我们都会实现下面的解压方法。

const zlib=require(' zlib ');const fs=require(' fs ');const path=require(' path ');//解压函数gunzip(source) {//处理输入输出的文件路径让source path=path . join(_ dirname,source);让filePath=path . join(_ dirname,path.basename(source,')。gz’);//创建转换流让unzip=zlib . creategunzip();//创建可读流let=create readstream(source path);//创建一个可写流让ws=create write stream(file path);//实现转换rs.pipe(解压缩)。管道(ws);} gun zip(' index . html . gz ');删除原index.html,执行解压代码,检查文件根目录是否生成index.html。

服务器的实现

在浏览器和服务器的交互中,浏览器实际上会通过请求头Accept-Encoding告诉服务器当前支持的解压缩的压缩格式,即gzip、deflate、br。多个压缩格式由。服务器收到浏览器请求后,会根据请求头的格式压缩资源,返回压缩后的资源,并通过响应头Content-Encoding告诉浏览器当前的服务器压缩格式。

//引入依赖常量http=require(' http ');const URL=require(' URL ');const path=require(' path ');const fs=require(' fs ');const zlib=require(' zlib ');//创建服务器const server=http。处理路径名时,默认情况下createserver ((req,RES)={//read '/index . html ' let { pathname }=URL . parse(req . URL,true);路径名=路径名!=='/' ?pathname : '/index . html ';//获取读取文件的绝对路径让p=path . join(_ dirname,pathname);//检查路径是否合法。fs.access(p,err={//如果路径非法,如果(err)返回res.end('Not Found '),直接中断连接;//获取浏览器支持的压缩格式let encoding=req . headers[' accept-encoding '];//创建一个可读的流让RS=fs.createreadstream//支持gzip压缩,如果(encoding encoding . match(/ bgzip b/)){ let compress=zlib . creategzip(),则支持deflate压缩;let compressType=' gzip} else if(encoding encoding . match(/ bdeflate b/){ let compress=zlib . createdeflate();让compressType='放气';} else {//否则,直接返回可读流返回RS . pipe(RES);}//返回压缩流并设置响应头RES . setheader(' content-encoding ',compresstype);rs.pipe(压缩)。管道(RES);});});server.listen(3000,()={ console . log(' server start 3000 ');});在上述服务器中,如果没有通过响应头通知浏览器当前资源的压缩格式,浏览器将不知道如何解压缩,默认情况下会作为文件下载,如Chrome,因此在返回压缩流时必须通过Content-Encoding响应头通知浏览器当前的压缩格式。

测试服务器压缩

我们用下面的代码在文件根目录下创建一个index.html文件。

!DOCTYPE html html lang=' en ' head meta charset=' UTF-8 ' meta name=' viewport ' content=' width=device-width,initial-scale=1.0 ' meta http-equiv=' X-UA-Compatible ' content=' ie=edge ' title gzip/title/head body div hello GZIP!/div/body/html启动server.js,然后通过浏览器访问localhost:3000查看页面是否正确返回,并检查开发者工具Network中响应头Content-Encoding的值是否正确。

摘要

服务器压缩实际上是网络传输中客户端和服务器之间的一种优化方法,可以大大降低流量消耗和响应时间。gzip只是最常用的压缩格式之一,即压缩算法。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+