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 패킷의 전송 시간과는 달리 처리 시간 측면에서 일반적인 클라이언트 측 JavaScript 압축 구현은 비용이 많이 드는 작업이라고 생각합니다.
얼마나 많은 시간을 절약해야하는지 알 수있는 테스트를 수행 했습니까? 내 말은, 대역폭 절약은 당신이 추구하는 것이 될 수 없습니까?