Mise en œuvre JavaScript de Gzip [fermé]

j'écris une application Web qui a besoin de stocker des données JSON dans une petite cache côté serveur fixe via AJAX (pensez: quotas Opensociaux ). Je n'ai pas de contrôle sur le serveur.

j'ai besoin de réduire la taille des données stockées pour rester dans un quota côté serveur, et j'espérais pouvoir gzip le JSON stringifié dans le navigateur avant de l'envoyer vers le serveur.

cependant, je ne peux pas trouver beaucoup dans la façon des implémentations JavaScript de Gzip. Des suggestions sur la façon de compresser les données du côté client avant de les envoyer?

198
demandé sur Roy Tinker 2008-11-16 22:54:38

9 réponses

Edit il semble y avoir une meilleure solution LZW qui gère correctement les chaînes Unicode à http://pieroxy.net/blog/pages/lz-string/index.html (merci à pieroxy dans les commentaires).


Je ne connais aucune implémentation de gzip, mais la bibliothèque jsolait (le site semble avoir disparu) a des fonctions de compression/décompression LZW. Le code est couvert par le LGPL .

// 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("");
}
130
répondu Matthew Crumley 2013-05-09 13:40:08

j'ai eu un autre problème, Je ne voulais pas encoder des données dans gzip mais décoder des données gzippées . J'exécute le code javascript en dehors du navigateur donc je dois le décoder en utilisant pur javascript.

cela m'a pris un certain temps mais j'ai trouvé que dans la bibliothèque JSXGraph il y a un moyen de lire des données gzippées.

voici où j'ai trouvé la bibliothèque: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code / Il existe même un utilitaire autonome qui peut faire cela, JSXCompressor , et le code est licencied LGPL.

inclut juste le jsxcompressor.fichier js dans votre projet et ensuite vous serez en mesure de lire une base 64 encodé données gzippées:

<!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>

je comprends que ce n'est pas ce que vous vouliez mais je continue à répondre ici parce que je suspect, il va aider certaines personnes.

48
répondu pcans 2011-04-12 11:35:49

nous venons de libérer pako https://github.com/nodeca/pako , port de zlib à javascript. Je pense que c'est maintenant l'implémentation js la plus rapide de deflate / inflate / gzip / ungzip. De plus, il a la licence du MIT démocratique. Pako prend en charge toutes les options zlib et ses résultats sont binaires égaux.

34
répondu Vitaly 2014-03-15 19:41:59

j'ai porté une implémentation de LZMA à partir d'un module GWT en JavaScript autonome. Ça s'appelle LZMA-JS .

17
répondu nmrugg 2010-09-06 16:14:22

Voici d'autres algorithmes de compression implémentés en Javascript:

14
répondu Mauricio Scheffer 2009-10-30 13:46:01

Je n'ai pas testé, mais il y a une implémentation javascript de ZIP, appelée JSZip:

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

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

8
répondu Sirber 2015-06-10 18:59:19

je suppose qu'une implémentation générique de compression JavaScript côté client serait une opération très coûteuse en termes de temps de traitement par opposition au temps de transfert de quelques paquets HTTP supplémentaires avec une charge utile non compressée.

avez-vous fait des tests qui vous donneraient une idée de combien de temps il y a à économiser? Je veux dire, les économies de bande passante ne peuvent pas être ce que vous recherchez, ou le pouvez-vous?

0
répondu Tomalak 2008-11-16 20:34:29

la Plupart des navigateurs peuvent décompresser gzip à la volée. Cela pourrait être une meilleure option qu'une implémentation javascript.

-3
répondu 2008-11-16 20:04:06

vous pouvez utiliser un applet Java de 1 pixel pour 1 pixel intégré dans la page et utiliser cela pour la compression.

ce n'est pas JavaScript et les clients auront besoin D'un Java runtime mais il fera ce dont vous avez besoin.

-3
répondu Bogdan 2008-11-16 20:51:36