[javascript] Gzip의 자바 스크립트 구현

AJAX를 통해 JSON 데이터를 작은 고정 크기 서버 측 캐시에 저장 해야하는 웹 응용 프로그램을 작성 중입니다 (생각 : Opensocial quotas ). 서버를 제어 할 수 없습니다.

서버 측 할당량 내에 유지하기 위해 저장된 데이터의 크기를 줄여야하며 서버로 전송하기 전에 브라우저에서 문자열 화 된 JSON을 압축 할 수 있기를 바랐습니다.

그러나 Gzip의 JavaScript 구현 방식을 많이 찾을 수는 없습니다. 클라이언트 측에서 데이터를 전송하기 전에 압축하는 방법에 대한 제안 사항이 있습니까?



답변

편집 http://pieroxy.net/blog/pages/lz-string/index.html (의견에 pieroxy 감사 합니다)에는 유니 코드 문자열을 올바르게 처리하는 더 나은 LZW 솔루션이 있는 것으로 보입니다.


gzip 구현을 모르지만 jsolait 라이브러리 (사이트가 사라진 것 같습니다)에는 LZW 압축 / 압축 해제 기능이 있습니다. 이 코드는 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("");
}


답변

다른 문제가 있었는데 gzip으로 데이터를 인코딩하고 싶지 않고 gzip으로 압축 된 데이터디코딩 하고 싶습니다 . 브라우저 외부에서 자바 스크립트 코드를 실행 중이므로 순수한 자바 스크립트를 사용하여 디코딩해야합니다 .

시간이 좀 걸렸지 만 JSXGraph 라이브러리에는 gzipped 데이터를 읽는 방법이 있다는 것을 알았 습니다.

나는 도서관을 발견 한 곳 여기입니다 : http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/
, 그렇게 할 수도 독립 유틸리티가 JSXCompressor을 코드는 LGPL 라이센스입니다.

jsxcompressor.js 파일을 프로젝트에 포함 시키면 기본 64 인코딩 된 gzipped 데이터를 읽을 수 있습니다.

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

나는 그것이 당신이 원하는 것이 아니라는 것을 이해하지만 일부 사람들을 도울 것이라고 생각하기 때문에 여전히 여기에 회신합니다.


답변

방금 palib https://github.com/nodeca/pako , zlib 포트를 javascript로 릴리스했습니다 . 나는 그것이 deflate / inflate / gzip / ungzip의 가장 빠른 js 구현이라고 생각합니다. 또한 민주적 MIT 라이센스가 있습니다. Pako는 모든 zlib 옵션을 지원하며 결과는 이진 동일합니다.

예:

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


답변

GWT 모듈에서 LZMA 구현을 독립형 JavaScript로 이식했습니다. LZMA-JS 라고 합니다.


답변

다음은 자바 스크립트로 구현 된 다른 압축 알고리즘입니다.


답변

테스트하지는 않았지만 JSZip이라는 ZIP의 자바 스크립트 구현이 있습니다.

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

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


답변

압축되지 않은 페이로드가있는 몇 가지 HTTP 패킷의 전송 시간과는 달리 처리 시간 측면에서 일반적인 클라이언트 측 JavaScript 압축 구현은 비용이 많이 드는 작업이라고 생각합니다.

얼마나 많은 시간을 절약해야하는지 알 수있는 테스트를 수행 했습니까? 내 말은, 대역폭 절약은 당신이 추구하는 것이 될 수 없습니까?