如何在JavaScript中高效地访问gzipped xml?

4
我需要从JavaScript(实际上是从Greasemonkey)高效地访问一个大的gzipped xml文件。不幸的是,服务器没有提供Content-Encoding头信息,而Content-Type是"application/x-gzip",所以Firefox不会(据我所知)自动解压它。如果有一种方法可以欺骗Firefox,那就太理想了。除此之外,我需要一种有效的方式来进行解压缩...现在我正在使用的方法需要大约30秒才能解压缩1.2Mb的gzipped文件;我希望将其降至5秒以下。
(我正在开发的Greasemonkey脚本不能有任何其他外部服务器依赖项,因此代理和呈现Content-Encoding头信息不是一个选项。)
我现在正在做的事情是从几个地方拼凑起来的。为了接收未经处理的二进制数据,我正在使用firefox XMLHTTPRequest overrideMimeType扩展。
$.ajax(url, {
    dataType:'text',
    beforeSend:function(xhr){
        xhr.overrideMimeType('text/plain; charset=x-user-defined')
    },
    success:function(data){
        var blob='';
        for (i=0; i<data.length; ++i)
            blob += String.fromCharCode(data.charCodeAt(i) & 0xff);
        ...

然后使用稍作修改并内联的https://github.com/dankogai/js-deflate/blob/master/rawinflate.js的副本进行解压缩(还有其他几个JavaScript解压缩库,据我所知都基于更旧的库http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt)。这是非常缓慢的部分。
        // blithely assuming the gzip header won't change,
        // strip a fixed number of bytes from the front
        deflated=RawDeflate.inflate(blob.substring(22,blob.length-8));

然后将其放入innerHTML属性中进行解析:

        xmlcontainer=$('<div>');
        // remove <?xml...> prolog
        xmlcontainer.html(deflated.substring(45));
        xmldoc=xmldoc.children();

我知道最后一部分可以更好地使用DOMParser的parseFromString来完成,但我还没有搞定。


2
很遗憾,似乎没有浏览器将其解压算法暴露给Javascript - 我想这应该是相对容易且最有效的方式。 - Pekka
你可能已经知道了,但是为了参考,请访问https://dev59.com/DHVC5IYBdhLWcg3wcgqd - Pekka
@Pekka,是的,我已经读过了,并且还有另一个问题,现在找不到了,它有更多关于deflate的链接。 - ysth
1
@Pekka,我想浏览器开发人员可能从未考虑过这个想法。我的意思是,你会用它做什么?JS不应该触及文件,如果设置正确,浏览器会自动处理其余部分。很难为这种情况制定计划。 - Brock Adams
1个回答

1

使用这个配置,你不可能有明显的提升。

JavaScript 太慢了,无法像期望的那样快速解压缩,而且你不能可靠地从 JS 调用二进制文件——除非将数据通过 AJAX 发送到你自己的服务器(可以是本地 PC)。

你可以采取以下改进措施:

  1. 让浏览器自动解压缩内容。如果你已经尝试使用 overrideMimeType 设置为 application/x-gzip,你可以尝试使用 GM_xmlhttpRequest(机会渺茫)。

  2. 将此从 GM 脚本转换为 Firefox 插件。作为插件,你可以访问二进制文件,如 7-Zip,甚至可能可以访问浏览器的解压缩方法。你也可以更容易地欺骗 mimetype。



我确实注意到一些微不足道的机会来加速JS的膨胀...例如在for循环内部进行长度检查。然而,考虑到具体情况,可能只能节省一两秒钟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接