有没有办法使用 Javascript 使用浏览器的本机 gzip 解压缩?

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

后端服务器响应一个 gzip 文件,但没有 Content-Encoding: gzip header。而且我无法控制服务器,因此无法处理服务器端的问题。

我现在需要的是使用 javascript.

解压缩 gzip 文件客户端

我发现这个优秀的库可以帮助我做到这一点:http://nodeca.github.io/pako/

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

我觉得应该有办法利用浏览器的原生功能来un-gzip。如果我错了,有人可以解释为什么这个浏览器功能没有公开为 javascript API?

不,不应该有,除非它符合 w3c 标准,但事实并非如此。唯一说明 gzip 压缩的标准是 an HTTP standard.

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

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

这就是为什么它不在标准中并且很可能不会出现在那里的原因。

您的具体情况是服务器端实施错误。使用没有适当 header 的压缩输出真的很臭。要么不使用压缩,要么正确使用。

有没有办法在 javascript 中 un-gzip 文件而不添加额外的库?

实际上除此之外还有一个可能的解决方案:创建一个浏览器扩展,在服务器响应中注入适当的 header,您不需要库,但需要将扩展​​分发给用户.可能更糟,但仍然可以工作。

Compression Streams API is a new web standard and is currently available in Chrome (since v80), Edge, and Deno. Other browsers will eventually add it, but in the mean time the best bet is a WASM implementation. Apparently WASM 实现可以达到本机实现性能的 90%(并且是 JS 实现速度的 20 倍左右)。

压缩流的一些示例用法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'));

更多信息: