Implementazione JavaScript di Gzip

Sto scrivendo un’applicazione Web che deve memorizzare i dati JSON in una piccola cache lato server di dimensioni fisse tramite AJAX (si pensi: quote Opensocial ). Non ho il controllo sul server.

Devo ridurre la dimensione dei dati archiviati per rimanere all’interno di una quota lato server, e speravo di poter gzip il JSON con stringa nel browser prima di inviarlo al server.

Tuttavia, non riesco a trovare molto in termini di implementazioni JavaScript di Gzip. Qualche suggerimento su come posso comprimere i dati sul lato client prima di inviarlo?

Modifica Sembra esserci una soluzione LZW migliore che gestisca correttamente le stringhe Unicode su http://pieroxy.net/blog/pages/lz-string/index.html (grazie a pieroxy nei commenti).


Non conosco alcuna implementazione gzip, ma la libreria jsolait (il sito sembra essere andato via) ha funzioni per la compressione / decompressione LZW. Il codice è coperto dalla 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 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 

Ho avuto un altro problema, non volevo codificare i dati in gzip ma decodificare i dati gzippati . Sto eseguendo il codice javascript al di fuori del browser, quindi ho bisogno di decodificarlo utilizzando puro javascript.

Mi ci è voluto un po ‘di tempo ma ho scoperto che nella libreria JSXGraph c’è un modo per leggere i dati gzippati.

Qui è dove ho trovato la libreria: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ C’è persino un’utilità standalone che può farlo, JSXCompressor e il codice è LGPL licenziato.

Basta includere il file jsxcompressor.js nel tuo progetto e poi sarai in grado di leggere i dati gzipped codificati in base 64:

 < !doctype html>  Test gzip decompression page      

Capisco che non è quello che volevi, ma continuo a rispondere qui perché ho il sospetto che aiuterà alcune persone.

Abbiamo appena rilasciato pako https://github.com/nodeca/pako , port di zlib in javascript. Penso che ora sia l’implementazione js più veloce di deflate / inflate / gzip / ungzip. Inoltre, ha una licenza MIT democratica. Pako supporta tutte le opzioni di zlib ed i suoi risultati sono uguali.

Ho effettuato il porting di un’implementazione di LZMA da un modulo GWT in JavaScript autonomo. Si chiama LZMA-JS .

Ecco alcuni altri algoritmi di compressione implementati in Javascript:

  • Huffman
  • LZ77

Non ho provato, ma c’è un’implementazione javascript di ZIP, chiamata JSZip:

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

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

Immagino che un’implementazione di compressione JavaScript lato client generica sarebbe un’operazione molto costosa in termini di tempo di elaborazione rispetto al tempo di trasferimento di alcuni pacchetti HTTP con carico utile non compresso.

Hai fatto dei test che ti avrebbero dato un’idea di quanto tempo c’è da salvare? Voglio dire, il risparmio di larghezza di banda non può essere quello che cerchi, o no?

La maggior parte dei browser può decomprimere gzip al volo. Potrebbe essere un’opzione migliore rispetto all’implementazione di un javascript.

È ansible utilizzare un applet Java da 1 pixel per 1 pixel incorporato nella pagina e utilizzarlo per la compressione.

Non è JavaScript e i client avranno bisogno di un runtime Java, ma farà ciò di cui hai bisogno.