Piszę aplikację sieci Web, która musi przechowywać dane JSON w niewielkiej pamięci podręcznej po stronie serwera o stałej wielkości za pośrednictwem AJAX (pomyśl: limity Openocial ). Nie mam kontroli nad serwerem.
Muszę zmniejszyć rozmiar przechowywanych danych, aby pozostać w ramach limitu po stronie serwera, i miałem nadzieję, że będę w stanie zgzipować JSON w przeglądarce przed wysłaniem go na serwer.
Jednak nie mogę znaleźć wiele na drodze do implementacji JavaScript w Gzip. Wszelkie sugestie dotyczące sposobu kompresji danych po stronie klienta przed wysłaniem?
javascript
ajax
compression
gzip
David Citron
źródło
źródło
Odpowiedzi:
Edycja Wydaje się, że istnieje lepsze rozwiązanie LZW, które poprawnie obsługuje ciągi Unicode pod adresem http://pieroxy.net/blog/pages/lz-string/index.html (Dzięki pieroxy w komentarzach).
Nie znam żadnych implementacji gzip, ale biblioteka jsolait (strona wydaje się zniknąć) ma funkcje kompresji / dekompresji LZW. Kod jest objęty licencją LGPL .
źródło
Miałem inny problem, nie chciałem kodować danych w gzipie, ale dekodować dane w gzipie . Używam kodu javascript poza przeglądarką, więc muszę go zdekodować przy użyciu czystego javascript.
Zajęło mi to trochę czasu, ale odkryłem, że w bibliotece JSXGraph istnieje sposób na odczyt danych spakowanych gzipem.
Oto gdzie znalazłem bibliotekę: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ Istnieje nawet samodzielne narzędzie, które może to zrobić, JSXCompressor , a kod jest na licencji LGPL.
Po prostu dołącz plik jsxcompressor.js do swojego projektu, a wtedy będziesz mógł odczytać dane gzipowane w formacie 64:
Rozumiem, że nie tego chciałeś, ale wciąż odpowiadam tutaj, ponieważ podejrzewam, że pomoże to niektórym ludziom.
źródło
<?php..
bitu? .. Pytam, ponieważ jest przekazywany dodecompress
metody.14:16:28.512 TypeError: e.replace is not a function[Weitere Informationen] jsxcompressor.min.js:19:12201
Właśnie wydaliśmy pakiet pako https://github.com/nodeca/pako , port zlib na javascript. Myślę, że jest to teraz najszybsza implementacja js deflate / inflate / gzip / ungzip. Ma także demokratyczną licencję MIT. Pako obsługuje wszystkie opcje zlib, a jego wyniki są równe binarnie.
Przykład:
źródło
var inflate = require('pako/lib/inflate').inflate; var text = inflate(zipped, {to: 'string'});
@ Redsandro oto jak używam Pako.incorrect header check
Implementowałem LZMA z modułu GWT do samodzielnego JavaScript. To się nazywa LZMA-JS .
źródło
Oto kilka innych algorytmów kompresji zaimplementowanych w JavaScript:
źródło
Nie testowałem, ale istnieje implementacja ZIP w javascript, o nazwie JSZip:
http://jszip.stuartk.co.uk/
https://stuk.github.io/jszip/
źródło
Wydaje mi się, że ogólna implementacja kompresji JavaScript po stronie klienta byłaby bardzo kosztowną operacją pod względem czasu przetwarzania, w przeciwieństwie do czasu przesyłania kilku kolejnych pakietów HTTP z nieskompresowanym ładunkiem.
Czy wykonałeś jakieś testy, które dałyby Ci wyobrażenie, ile czasu jest do zaoszczędzenia? To znaczy, oszczędności pasma nie mogą być tym, czego szukasz, czy może?
źródło
Większość przeglądarek może dekompresować gzip w locie. To może być lepsza opcja niż implementacja javascript.
źródło
Możesz użyć apletu Java 1 piksel na 1 piksel osadzonego na stronie i użyć go do kompresji.
To nie jest JavaScript, a klienci będą potrzebować środowiska wykonawczego Java, ale zrobi to, czego potrzebujesz.
źródło