如何用JavaScript进行数据压缩_pako库怎么使用

发布时间 - 2026-01-02 00:00:00    点击率:
因CompressionStream兼容性差且不支持同步操作,pako作为纯JS zlib实现,兼容性好、API稳定,支持deflate/gzip双格式,但需注意区分raw deflate与gzip header。

为什么用 pako 而不是原生 CompressionStream

因为 CompressionStream 在 Safari 和部分旧版 Chrome 中不支持,且无法处理同步压缩/解压(比如在 Web Worker 或 Node.js 服务端预处理时)。pako 是 zlib 的纯 JS 实现,兼容性好、API 稳定,适合需要可靠跨环境压缩的场景。

它默认使用 deflate 算法(和 gzip 底层一致),但不自带 gzip header —— 所以压缩结果不是标准 .gz 文件,除非你手动加 header。

pako.deflatepako.inflate 怎么用

这是最常用的两个函数:一个压缩,一个解压,都只接受 Uint8Array 输入。字符串需先转成 UTF-8 字节数组,不能直接传 string

  • new TextEncoder().encode(str) 将字符串转为字节数组
  • 压缩后得到的仍是 Uint8Array,如需 base64 可用 btoa(String.fromCharCode(...arr))
  • 解压前必须确保输入是有效的 deflate 流 —— 如果是从后端收到的 gzip 数据,得先去掉 header 和 footer,或改用 pako.ungzip
const pako = require('pako'); // Node.js
// 或通过 CDN 加载:

const str = 'hello world'.repeat(100);
const input = new TextEncoder().encode(str);

const compressed = pako.deflate(input); // Uint8Array
const restored = pako.inflate(compressed);

const decoded = new TextDecoder().decode(restored);
console.log(decoded === str); // true

如何压缩成标准 gzip 格式(含 header)

pako.gzippako.ungzip 才生成/识别带 RFC 1952 header 的数据,也就是浏览器 fetch 响应里常见的 Content-Encoding: gzip 格式。

  • pako.deflate 输出的是 raw deflate;pako.gzip 输出才是 gzip
  • Node.js 里如果要写入 .gz 文件,必须用 pako.gzip,否则 gunzip 会报 unknown compression format
  • 注意:gzip 比 deflate 多 18 字节 header/footer,体积略大,但通用性更强
const compressedGz = pako.gzip(input);
// 写入文件或发送到服务端时可直接用
fs.writeFileSync('data.txt.gz', compressedGz);

常见错误:解压失败报 invalid stored block lengths

这基本等于“你拿 deflate 数据去调了 pako.ungzip”,或者反过来:用 pako.inflate 解 gzip 数据。

  • 检查原始数据来源:如果是 fetch 响应且 response.headers.get('content-encoding') === 'gzip',就该用 pako.ungzip
  • 如果后端返回的是 raw deflate(比如某些 WebSocket 协议自定义压缩),才用 pako.inflate
  • console.log(data.slice(0, 4)) 看前 4 字节:gzip 开头是 [0x1f, 0x8b],deflate raw 通常以 [0x78][0x1f] 开头(但不固定),不能单靠这个判断,得看协议约定

最稳妥的方式是和服务端对齐压缩封装方式,别混用 gzipdeflate 接口。


# javascript  # java  # js  # node.js  # node  # 浏览器  # 字节  # websocket  # safari  # 后端 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何为API生成Swagger或OpenAPI文档  如何自定义建站之星网站的导航菜单样式?  详解jQuery停止动画——stop()方法的使用  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  中山网站推广排名,中山信息港登录入口?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  米侠浏览器网页背景异常怎么办 米侠显示修复  香港服务器WordPress建站指南:SEO优化与高效部署策略  Android滚轮选择时间控件使用详解  Python正则表达式进阶教程_复杂匹配与分组替换解析  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  在线制作视频网站免费,都有哪些好的动漫网站?  JavaScript如何实现继承_有哪些常用方法  网站建设整体流程解析,建站其实很容易!  音乐网站服务器如何优化API响应速度?  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel如何实现API资源集合?(Resource Collection教程)  网站页面设计需要考虑到这些问题  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何快速搭建支持数据库操作的智能建站平台?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  html5的keygen标签为什么废弃_替代方案说明【解答】  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  linux写shell需要注意的问题(必看)  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Android使用GridView实现日历的简单功能  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  免费视频制作网站,更新又快又好的免费电影网站?  网站建设保证美观性,需要考虑的几点问题!  昵图网官网入口 昵图网素材平台官方入口  打造顶配客厅影院,这份100寸电视推荐名单请查收  详解MySQL数据库的安装与密码配置  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何配置任务调度?(Cron Job示例)  活动邀请函制作网站有哪些,活动邀请函文案?  nginx修改上传文件大小限制的方法  如何用已有域名快速搭建网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新