Ce face zlib (gzip, brotli)
Modulul node:zlib comprimă date în formatele gzip (fișierele .gz, folosit și de HTTP), deflate și Brotli (comprimare mai bună pentru text, folosită de browsere). Fiecare format are trei variante: sincronă (gzipSync), cu callback (gzip) și ca stream (createGzip).
Pentru date mici din memorie, variantele sincrone sunt cele mai simple. Pentru fișiere mari, folosește stream-urile cu pipeline. Variantele cu callback se pot transforma în promisiuni cu util.promisify.
Nivelul de comprimare se dă prin opțiuni: { level: 9 } la gzip (0–9), params cu BROTLI_PARAM_QUALITY la Brotli (0–11). Comprimarea Zstandard (zstdCompress) a fost adăugată recent și este încă experimentală.
Parametri
| Parametru | Descriere |
|---|---|
gzipSync / gunzipSync |
Comprimare / decomprimare gzip. |
deflateSync / inflateSync |
Formatul deflate (fără antetul gzip). |
brotliCompressSync / brotliDecompressSync |
Formatul Brotli. |
createGzip() / createGunzip() |
Variantele ca stream de transformare. |
opțiuni.level |
Nivelul de comprimare la gzip/deflate (0–9). |
Ce returnează
Variantele sincrone întorc un Buffer.
Exemple
Exemplul 1: gzip și Brotli pe un text
import zlib from "node:zlib";
const text = JSON.stringify(Array.from({ length: 200 }, (_, i) => ({ id: i, oras: "Iași", stare: "livrat" })));
const gz = zlib.gzipSync(text);
const br = zlib.brotliCompressSync(text);
console.log("Original:", Buffer.byteLength(text), "octeți");
console.log("gzip mai mic decât originalul:", gz.length < text.length / 5);
console.log("Brotli mai mic decât gzip:", br.length < gz.length);
console.log("Textul revine identic:", zlib.gunzipSync(gz).toString() === text);
Rezultat
Original: 8491 octeți
gzip mai mic decât originalul: true
Brotli mai mic decât gzip: true
Textul revine identic: true
Exemplul 2: Varianta cu promisiuni
import zlib from "node:zlib";
import { promisify } from "node:util";
const gzip = promisify(zlib.gzip);
const gunzip = promisify(zlib.gunzip);
const comprimat = await gzip("Raport vânzări Iași: 12.400 lei");
console.log(comprimat.subarray(0, 2).toString("hex"));
console.log((await gunzip(comprimat)).toString());
Rezultat
1f8b
Raport vânzări Iași: 12.400 lei
Exemplul 3: Date stricate
import zlib from "node:zlib";
try {
zlib.gunzipSync(Buffer.from("nu sunt comprimat"));
} catch (eroare) {
console.log(eroare.code);
}
Rezultat
Z_DATA_ERROR
Greșeli frecvente
- Comprimi răspunsurile HTTP în aplicație și și în nginx sau CDN: datele sunt comprimate de două ori sau trimise cu antete greșite. Alege un singur loc, de obicei proxy-ul.
- Folosești
gzipSyncpe fișiere mari într-un server: blochează firul principal. Folosește stream-uri sau variantele asincrone. - Decomprimi cu
inflateSyncdate gzip: formatele diferă (gzip are antet), primeștiZ_DATA_ERROR. FoloseștegunzipSyncsauunzipSync, care le detectează pe amândouă.
Comenzi înrudite
stream.pipeline: Leagă stream-uri în lanț (citire → transformare → scriere), cu tratarea erorilor și închiderea tuturor la final.Buffer: Șir de octeți din Node.js: date binare din fișiere, rețea sau criptografie, cu conversii în text, hex și base64.stream.Transform: Stream care primește date, le modifică și le dă mai departe: comprimare, criptare, împărțire pe rânduri, conversii.util.promisify: Transformă o funcție cu callback în stil Node.js (eroare, rezultat) într-o funcție care întoarce o promisiune.