it-swarm.com.de

JavaScript-Implementierung von Gzip

Ich schreibe eine Webanwendung, die JSON-Daten über AJAX (think: Opensocial quotas ) in einem kleinen serverseitigen Cache mit fester Größe speichern muss Ich habe keine Kontrolle über den Server.

Ich musste die Größe der gespeicherten Daten reduzieren, um innerhalb eines serverseitigen Kontingents zu bleiben, und ich hoffte, die JSON-Zeichenfolge im Browser gzipen zu können, bevor ich sie an den Server sendete.

Ich kann jedoch nicht viel in Bezug auf JavaScript-Implementierungen von Gzip finden. Gibt es Vorschläge, wie ich die Daten auf der Clientseite komprimieren kann, bevor ich sie abschicke?

202
David Citron

Bearbeiten Es scheint eine bessere LZW-Lösung zu geben, die Unicode-Zeichenfolgen unter http://pieroxy.net/blog/pages/lz) korrekt verarbeitet -string/index.html (Danke an pieroxy in den Kommentaren).


Ich kenne keine gzip-Implementierungen, aber die jsolait library (die Site scheint verschwunden zu sein) enthält Funktionen für die LZW-Komprimierung/Dekomprimierung. Der Code wird unter LGPL behandelt.

// LZW-compress a string
function lzw_encode(s) {
    var dict = {};
    var data = (s + "").split("");
    var out = [];
    var currChar;
    var phrase = data[0];
    var code = 256;
    for (var i=1; i<data.length; i++) {
        currChar=data[i];
        if (dict[phrase + currChar] != null) {
            phrase += currChar;
        }
        else {
            out.Push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
            dict[phrase + currChar] = code;
            code++;
            phrase=currChar;
        }
    }
    out.Push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
    for (var i=0; i<out.length; i++) {
        out[i] = String.fromCharCode(out[i]);
    }
    return out.join("");
}

// Decompress an LZW-encoded string
function lzw_decode(s) {
    var dict = {};
    var data = (s + "").split("");
    var currChar = data[0];
    var oldPhrase = currChar;
    var out = [currChar];
    var code = 256;
    var phrase;
    for (var i=1; i<data.length; i++) {
        var currCode = data[i].charCodeAt(0);
        if (currCode < 256) {
            phrase = data[i];
        }
        else {
           phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
        }
        out.Push(phrase);
        currChar = phrase.charAt(0);
        dict[code] = oldPhrase + currChar;
        code++;
        oldPhrase = phrase;
    }
    return out.join("");
}
132
Matthew Crumley

Ich hatte ein anderes Problem, ich wollte keine Daten in gzip verschlüsseln, sondern komprimierte Daten entschlüsseln. Ich verwende Javascript-Code außerhalb des Browsers, daher muss ich ihn mit pure Javascript dekodieren.

Es hat einige Zeit gedauert, aber ich habe festgestellt, dass es in der JSXGraph-Bibliothek eine Möglichkeit gibt, komprimierte Daten zu lesen.

Hier habe ich die Bibliothek gefunden: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ Es gibt sogar einen Standalone Dienstprogramm, das das kann, JSXCompressor , und der Code ist LGPL-lizenziert.

Fügen Sie einfach die Datei jsxcompressor.js in Ihr Projekt ein, und Sie können 64-verschlüsselte komprimierte Daten lesen:

<!doctype html>
</head>
<title>Test gzip decompression page</title>
<script src="jsxcompressor.js"></script>
</head>
<body>
<script>
    document.write(JXG.decompress('<?php 
        echo base64_encode(gzencode("Try not. Do, or do not. There is no try.")); 
    ?>'));
</script>
</html>

Ich verstehe, dass es nicht das ist, was Sie wollten, aber ich antworte trotzdem hier, weil ich vermute, dass es einigen Menschen helfen wird.

50
pcans

Wir haben gerade pako https://github.com/nodeca/pako , den Port von zlib für Javascript veröffentlicht. Ich denke, das ist jetzt die schnellste Implementierung von deflate/inflate/gzip/ungzip. Außerdem hat es eine demokratische MIT Lizenz. Pako unterstützt alle Zlib-Optionen und die Ergebnisse sind binär gleich.

Beispiel:

var inflate = require('pako/lib/inflate').inflate; 
var text = inflate(zipped, {to: 'string'});
36
Vitaly

Ich habe eine Implementierung von LZMA von einem GWT-Modul in eigenständiges JavaScript portiert. Es heißt LZMA-JS .

17
nmrugg

Hier sind einige andere in Javascript implementierte Komprimierungsalgorithmen:

14

Ich habe nicht getestet, aber es gibt eine JavaScript-Implementierung von Zip namens JSZip:

http://jszip.stuartk.co.uk/

https://stuk.github.io/jszip/

8
Sirber

Ich vermute, eine generische clientseitige Implementierung der JavaScript-Komprimierung wäre ein sehr teurer Vorgang in Bezug auf die Verarbeitungszeit im Gegensatz zur Übertragungszeit einiger weiterer HTTP-Pakete mit unkomprimierter Nutzlast.

Haben Sie Tests durchgeführt, die Aufschluss darüber geben, wie viel Zeit gespart werden muss? Ich meine, Bandbreiteneinsparungen können nicht das sein, wonach Sie streben, oder?

0
Tomalak