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?
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("");
}
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.
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.
Je n'ai pas testé, mais il y a une implémentation javascript de ZIP, appelée JSZip:
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?
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.