zlib (gzip, brotli) în Node.js

Evenimente, stream-uri și date binare Node.js 0.5.8; Brotli din 10.16 / 11.7; zstd experimental din 22.15 / 23.8

Comprimă și decomprimă date cu gzip, deflate sau Brotli: fișiere .gz, răspunsuri HTTP mai mici.

Sintaxă
import zlib from "node:zlib";
zlib.gzipSync(date)  zlib.gunzipSync(date)
zlib.brotliCompressSync(date)  zlib.brotliDecompressSync(date)
zlib.createGzip()  zlib.createGunzip()

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 gzipSync pe fișiere mari într-un server: blochează firul principal. Folosește stream-uri sau variantele asincrone.
  • Decomprimi cu inflateSync date gzip: formatele diferă (gzip are antet), primești Z_DATA_ERROR. Folosește gunzipSync sau unzipSync, 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.