有没有办法使用 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'));
更多信息:
后端服务器响应一个 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'));
更多信息: