http之压缩

本文介绍了如何在Node.js中使用zlib模块实现HTTP响应的压缩处理,包括gzip和服务端的压缩设置。通过示例代码展示了如何根据客户端支持的压缩方式(如gzip或deflate)动态地对响应内容进行压缩,并设置了正确的Content-Encoding头部。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习HTTP的时候我们会发现所有的HTTP请求和响应头都是独立的知识点,相互之间并没有关联,只有在实际的项目中,我们可能会用到多个响应头的设置。例如缓存,我们通常会使用协议缓存,强缓存,和ETAG,为了减少数据传输报的内同,我们通常会使用压缩来节省流量,这里学习一下node的压缩模块

zlib

要学习压缩,首先要了解两个头, Content-Encoding: gzip 服务端 ,Accept-Encoding: gzip, deflate, br 客户端, 我们根据客户端支持的压缩模式,进行压缩文件,然后返回给客户端,并设置响应头,告诉客户端用那种方式解压文件, 下边是zlib的使用方式

// Content-Encoding: gzip 服务端
// Accept-Encoding: gzip, deflate, br 客户端

let fs = require('fs')
let path = require('path')
let zlib = require('zlib')
/**
 * 压缩指定的文件
 * @param {string} src 资源的路径
 */
function zip (src) {
  let pathInfo = path.parse(src) // 拿到解析后的路径信息
  // {
  //   root: '/',
  //     dir: '/Users/a002/Documents/dream/src/zfnode/cache',
  //       base: '1.txt',
  //         ext: '.txt',
  //           name: '1'
  // }
  // 压缩流, 转化流
  let gzip = zlib.createGzip()
  // 读取文件,压缩文件,保存压缩后的文件
  fs.createReadStream(src)
    .pipe(gzip)
    .pipe(fs.createWriteStream(`${pathInfo.dir}/${pathInfo.name}.gz`))
}

/**
 * 
 * @param {String} src 需要解压的资源的全部路径
 */
function unzip (src) {
  let pathInfo = path.parse(src) // 拿到解析后的路径信息
  // 创建一个转化流
  let gunzip = zlib.createGunzip()
  // 读取资源,进行转化,保存转化后的文件
  fs.createReadStream(src)
    .pipe(gunzip)
    .pipe(fs.createWriteStream(`${pathInfo.dir}/${pathInfo.name}${pathInfo.name}.txt`))
}

// 压缩文件
// zip(path.join(__dirname, './1.txt'))
// 解压文件
unzip(path.join(__dirname, './1.gz'))

这里是一个简单的服务端的用例

// 写一个服务器,客户端访问的时候返回支持的压缩文件
// Content-Encoding: gzip 服务端
// Accept-Encoding: gzip, deflate, br 客户端

let fs = require('fs')
let path = require('path')
let zlib = require('zlib')
let http = require('http')

let server = http.createServer(function(req, res) {
  let p = path.join(__dirname, './1.txt')
  let header = req.headers['accept-encoding']
  res.setHeader('Content-Type', 'text/html;charset=utf8')
  // 判断如果支持,则进行编码处理,不支持,则直接返回
  if (header) {
    // 根据支持的不同的压缩类型,压缩内容,然后返回给客户端,优先使用gzip
    if (header.match(/\bgzip\b/)) {
      let gzip = zlib.createGzip()
      res.setHeader('Content-Encoding', 'gzip')
      fs.createReadStream(p)
      .pipe(gzip)
      .pipe(res)
    } else if(header.match(/\bdeflate\b/)) {

      let deflate = zlib.createDeflate()
      res.setHeader('Content-Encoding', 'deflate')
      fs.createReadStream(p)
        .pipe(deflate)
        .pipe(res)
    } else {
      // 如果没有支持的压缩方式,直接返回资源
      fs.createReadStream(p)
        .pipe(res)
    }
  } else {
     // 如果没有支持的压缩方式,直接返回资源
    fs.createReadStream(p)
      .pipe(res)
  }
})

server.listen(5000)

// server启动成功
server.on('listening', () => {
  console.log('http启动完成')
})

// 关闭HTTP服务器
server.on('close', () => {
  console.log('服务器关闭')
})

总结

以上就是简单的服务端压缩,然后设置响应头,高速浏览器怎么解析,上边展示了使用gzip和deflate两种模式,没有特别高深的东西,就是简单的api调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值