热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用node.js压缩流优化http请求

前端性能优化一直是一个值得讨论的话题,而节省每次HTTP请求的流量,则是优化的一个重要的点,比如javascript文件、图片、样式表等进

前端性能优化一直是一个值得讨论的话题,而节省每次HTTP请求的流量,则是优化的一个重要的点,比如Javascript文件、图片、样式表等进行压缩传输,不仅使访问速度更快,也可以有效的节省站点的流量。

HTTP的请求中带有一个头Content-Encoding来处理压缩。

常见的压缩模式:

  • GZIP
  • Deflate

GZIP

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

Deflate

DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。 它最初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在RFC 1951规范中。

在node.js中使用压缩流

node.js中已经为我们提供了压缩的功能,它的核心功能在zlib包里。

zlib模块提供通过 Gzip 和 Deflate/Inflate 实现的压缩功能。

使用方法

const zlib = require('zlib');
const fs = require('fs');
const path = require('path');let file = path.join(__dirname, './1.txt');
zip(file);function zip(file) {let gzip = zlib.createGzip(); //gzip是一个转换流fs.createReadStream(file).pipe(gzip).pipe(fs.createWriteStream(file + '.gz'));
}

可以看到用法非常简单,使用createGzip可以创建一个gzip压缩流,它是一个Transform转换流。首先使用待压缩的目标文件创建一个可读流,将它pipe到gzip压缩流中,再pipe到一个可写流中,即可完成压缩。运行这段代码可以看到在模块目录下已经多了一个1.txt.gz的压缩包。

unzip(path.join(__dirname, './1.txt.gz'));
function unzip(file) {let gunzip = zlib.createGunzip(file);fs.createReadStream(file).pipe(gunzip).pipe(fs.createWriteStream(path.basename(file, '.gz')));
}

解压缩同样如此,使用解压缩流即可。

使用压缩优化http请求

了解了压缩流的使用,怎么样才能配合http来优化用户的请求呢?

http有一个字段,它描述了浏览器支持哪种压缩格式:

Accept-Encoding: gzip, deflate, br

响应头

Content-Encoding: gzip

处理流程:

  1. 首先查看http请求头Accept-Encoding都支持哪些压缩格式
  2. 根据不同的压缩格式将资源压缩并输出到浏览器
  3. 对不同的压缩格式发送响应头Content-Encoding

实例代码:

const http = require('http');
const url = require('url');
const path = require('path');
const fs = require('fs');
const zlib = require('zlib');let server = http.createServer((req, res) => {let {pathname} = url.parse(req.url, true);if (pathname === '/') {res.end('请访问一个服务器上的文件 如http://localhost:3000/1.txt');}let file = path.join(__dirname, pathname);fs.stat(file, (err, stat) => {if (err) {res.end('访问的文件不存在');} else {let acceptEncoding = req.headers['accept-encoding']; //取得浏览器的accept-encoding头,询问支持哪种压缩if (acceptEncoding.match(/\bgzip\b/)) { //浏览器支持gzip格式res.setHeader('Content-Encoding', 'gzip'); //告知浏览器发送的数据是gzip压缩格式let gzip = zlib.createGzip();fs.createReadStream(file).pipe(gzip).pipe(res); //压缩后输出} else if (acceptEncoding.match(/\bdeflate\b/)) { //浏览器支持deflate格式let deflate = zlib.createDeflate();res.setHeader('Content-Encoding','deflate');fs.createReadStream(file).pipe(deflate).pipe(res); 压缩后输出} else {fs.createReadStream(file).pipe(res);}}});
});server.listen(3000, () => {console.log('服务器已启动在3000端口...')
});

重要代码说明:

let acceptEncoding = req.headers['accept-encoding'];

取得浏览器的请求头,查看支持哪些压缩格式,因为某些老旧浏览器是不支持压缩的,因此要针对不同的压缩格式分别处理。

if (acceptEncoding.match(/\bgzip\b/)) {

使用正则来进行判断,看看是否支持gzip压缩

res.setHeader('Content-Encoding', 'gzip'); //告知浏览器发送的数据是gzip压缩格式

使用setHeader来设置响应头,告知浏览器此数据是经gzip压缩的,这样浏览器才会正确处理,否则浏览器并不识别gzip数据。

deflate格式的逻辑完全一样,这样就可以做到http压缩以节省流量的目的。



推荐阅读
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 深入解析WebP图片格式及其应用
    随着互联网技术的发展,无论是PC端还是移动端,图片数据流量占据了很大比重。尤其在高分辨率屏幕普及的背景下,如何在保证图片质量的同时减少文件大小,成为了亟待解决的问题。本文将详细介绍Google推出的WebP图片格式,探讨其在实际项目中的应用及优化策略。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • Bootstrap 的轮播图(Carousel)组件提供了一种简单而灵活的方法,用于在网站上实现响应式幻灯片效果。此组件不仅支持图片展示,还兼容嵌入式框架、视频等多媒体内容。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
author-avatar
暗恋具体哦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有