有没有一种方法可以使用浏览器'使用Javascript的本机gzip解压缩

Is there a way to use browser's native gzip decompression using Javascript?

本文关键字:使用 Javascript 解压缩 gzip 本机 浏览器 一种 可以使 方法 有没有      更新时间:2023-09-26

后端服务器使用gzip文件进行响应,但没有CCD_ 1。我无法控制服务器,因此无法处理服务器端的问题。

我现在需要的是使用javascript解压缩gzipped文件客户端。

我发现了这个优秀的图书馆,它可以帮助我做到这一点:http://nodeca.github.io/pako/

但我不想添加额外的库只是为了解压缩文件。我觉得应该有一种方法可以使用浏览器的本机功能来卸载gzip。我说得对吗?如果我错了,有人能解释为什么这个浏览器功能没有作为javascript API公开吗?有没有一种方法可以在不添加额外库的情况下用javascript解压缩文件?

压缩流API是一种新的web标准,目前可在Chromium、Firefox、Safari和Deno中使用。

压缩流API的一些示例用法:

async function decompressBlob(blob) {
  let ds = new DecompressionStream("gzip");
  let decompressedStream = blob.stream().pipeThrough(ds);
  return await new Response(decompressedStream).blob();
}

压缩:

const compressedReadableStream = inputReadableStream.pipeThrough(new CompressionStream('gzip'));

您还可以使用WASM实现。显然,WASM实现的性能可以接近本机实现的90%(大约是JS实现的20倍)。

另请参阅:

  • 压缩流API的WICG标准文档

答案是错误的,应该删除,但由于平台限制,不能删除。忽略这一点,选择另一个答案


我觉得应该有一种方法可以使用浏览器的本机功能来卸载gzip。如果我错了,有人能解释为什么这个浏览器功能没有作为javascript API公开吗

不,不应该有,除非它在w3c标准中,而事实并非如此。唯一说明gzip压缩的标准是HTTP标准。

我真的相信它不会成为标准,因为你可能想要使用成千上万的算法(用于压缩、加密等),而浏览器无法处理所有算法;为一个算法创建接口而不为另一个创建接口也是不公平的。

HTTP协议是一种例外。这里的压缩是为了让数百万人的生活更轻松。HTTP是web性能的瓶颈,所以只要压缩可用,我就无法想象在其他地方需要使用JavaScript压缩的情况。我所知道的唯一情况是压缩localStorage/indexedDB中的项目,但即使在那里gzip也不会工作,因为它不会产生UTF-16输出。

这就是为什么它不在标准中,也就是为什么它很可能不会出现在标准中。

您的特殊情况是服务器端实现错误。在没有适当标头的情况下使用压缩输出真的很臭。要么不要使用压缩,要么做对。

有没有一种方法可以在不添加额外库的情况下用javascript卸载文件的gzip

事实上,除此之外,还有一个可能的解决方案:创建一个浏览器扩展,在服务器响应中注入一个合适的头,您不需要库,但需要将扩展分发给用户。可能会更糟,但仍然可能奏效。