前端压缩、解压缩之gzip+pako.js

ws推送或这接口返回的数据经过gzip压缩能减少大量的传输数据,减少传输数据消耗

但是需要在收到数据之后解压。

前端解压就可以用到pako了

下载与引入pako
下载:npm install pako

引入:import pako from “pako”

定义解压和压缩的方法

import pako from "pako";
Vue.prototype.$zip = function (str){
     var binaryString = pako.gzip(encodeURIComponent(str), { to: 'string' })
     return btoa(binaryString);
}
 
Vue.prototype.$unzip = function (b64Data) {
  var strData = atob(b64Data);
  // 将二进制字符串转换为字符数数组
  var charData = strData.split("").map(function (x) {
    return x.charCodeAt(0);
  });
  // 把数字数组转换成字节数组
  var binData = new Uint8Array(charData);
  // 解压
  var data = pako.inflate(binData);
  //将解压缩完成的的byteArray转换回ascii字符串:
  var strData = new TextDecoder("utf-8").decode(data);//大数据使用此方法
  //var strData   = String.fromCharCode.apply(null, new Uint16Array(data));//数据不是很多可以使用此方法
  return decodeURIComponent(strData);
};

方法调用:
压缩:this.$zip(“需要压缩的内容”)

解压缩:this.$zip(“需要解压缩的内容”)
注意事项:
1、pako解决中文乱码:

压缩前:

pako.gzip(encodeURIComponent(str), { to: ‘string’ })

解压完成后:

return decodeURIComponent(strData)

2、大数据解压

将解压缩完成的的byteArray转换回ascii字符串,推荐使用new TextDecoder(“utf-8”).decode(data)

也可以封装

export function zipJson (str) {
  var binaryString = pako.gzip(encodeURIComponent(str), { to: 'string' })
  return btoa(binaryString)
}

export function unzipJson (b64Data) {
  var strData = atob(b64Data)
  // Convert binary string to character-number array
  var charData = strData.split('').map(function (x) { return x.charCodeAt(0) })
  // Turn number array into byte-array
  var binData = new Uint8Array(charData)
  // // unzip
  var data = pako.inflate(binData)
  // Convert gunzipped byteArray back to ascii string:
  // strData   = String.fromCharCode.apply(null, new Uint16Array(data));
  var array = new Uint16Array(data)
  var res = ''
  var chunk = 8 * 1024
  var i
  for (i = 0; i < array.length / chunk; i++) {
    res += String.fromCharCode.apply(null, array.slice(i * chunk, (i + 1) * chunk))
  }
  res += String.fromCharCode.apply(null, array.slice(i * chunk))

  strData = res
  return decodeURIComponent(strData)
}

import {isAuth, treeDataTranslate, transOrg, transUser, transDict, datePattern, zipJson, unzipJson} from '@/utils'
// 挂载全局
Vue.prototype.zipJson = zipJson
Vue.prototype.unzipJson = unzipJson
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值