it-source

Gzip의 JavaScript 구현

criticalcode 2022. 11. 20. 12:16
반응형

Gzip의 JavaScript 구현

JSON 데이터를 AJAX를 통해 작은 고정 크기의 서버 측 캐시에 저장해야 하는 웹 애플리케이션을 작성 중입니다(생각: 오픈소셜 쿼터).서버를 제어할 수 없습니다.

서버측 할당량을 유지하기 위해 저장된 데이터의 크기를 줄일 필요가 있으며, 서버로 전송하기 전에 브라우저에서 문자열화된 JSON을 gzip으로 압축할 수 있기를 희망합니다.

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

편집 Unicode 문자열을 올바르게 처리하는 더 나은 LZW 솔루션이 http://pieroxy.net/blog/pages/lz-string/index.html에 있는 것 같습니다(댓글의 pieroxy 덕분에).


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으로 데이터를 디코딩하는 이 또 다른 문제가 있었습니다.브라우저 외부에서 javascript 코드를 실행하고 있기 때문에 순수 javascript를 사용하여 디코딩해야 합니다.

시간이 좀 걸렸지만 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>

당신이 원하는 것이 아닌 것은 이해하지만, 그래도 도움이 될 것 같아서 여기에 회신합니다.

javascript에 대한 zlib 포트인 pako https://github.com/nodeca/pako을 방금 출시했습니다.그것이 deflate/bulve/gzip/unzip의 가장 빠른 구현이라고 생각합니다.또한, 그것은 민주적인 MIT 라이선스를 가지고 있다.Pako는 모든 zlib 옵션을 지원하며 결과는 2진수입니다.

예:

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

GWT 모듈에서 독립형 JavaScript로 LZMA 구현을 포팅했습니다.LZMA-JS라고 해요

다음은 Javascript에서 구현된 기타 압축 알고리즘입니다.

테스트하지 않았습니다만, JSZip이라고 불리는 ZIP의 Javascript 구현이 있습니다.

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

일반적인 클라이언트측 JavaScript 압축 실장은 비압축 payload를 가진 몇 개의 HTTP 패킷 전송 시간이 아닌 처리 시간 측면에서 매우 비싼 작업이 될 것입니다.

얼마나 많은 시간을 절약할 수 있는지 알 수 있는 테스트를 해본 적이 있습니까?즉, 대역폭 절감이 원하는 것이 아닐 수도 있고, 그렇지 않습니까?

대부분의 브라우저는 즉시 gzip 압축을 해제할 수 있습니다.이는 javascript 구현보다 더 나은 옵션일 수 있습니다.

페이지에 내장된 1픽셀당 1픽셀의 Java 애플릿을 사용하여 압축할 수 있습니다.

JavaScript는 아니며 클라이언트는 Java 런타임이 필요하지만 필요한 작업을 수행할 수 있습니다.

언급URL : https://stackoverflow.com/questions/294297/javascript-implementation-of-gzip

반응형