Compression — gzip, brotli

~10 daq · NestJS · Fayllar va Xavfsizlik

Muammodan boshlaylik

GET /products — 500 ta mahsulot, javob 2MB. Sekin internet bor foydalanuvchi 4 soniya kutadi.

Compression — javobni yuborishdan oldin siqish. 2MB → 400KB. Brauzer qabul qilib, o'zi yoyadi. Foydalanuvchi uchun bu jarayon ko'rinmaydi — tezroq yuklanadi.


O'rnatish

npm install compression
npm install -D @types/compression

Ulash

// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as compression from 'compression';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use(compression({
    threshold: 1024, // ← 1KB dan kichik javoblar siqilmaydi (foydasiz)
    level: 6,        // ← 1-9 orasida (6 — tezlik va siqish balansi)
  }));

  await app.listen(3000);
}

threshold: 1024 — kichik javoblarni siqish tezlikni oshirmaydi, aksincha server yukini oshiradi. level: 6 — Node.js ning standart darajasi. 9 — eng kuchli siqish, eng sekin. 1 — eng tez, kam siqish.


Qanday ishlaydi?

Brauzer so'rov yuboradi:
  Accept-Encoding: gzip, deflate, br

Server javob qaytaradi:
  Content-Encoding: gzip
  (siqilgan ma'lumot)

Brauzer o'zi yoyadi — dasturchi hech narsa qilmaydi

Compression middleware Accept-Encoding headerini ko'radi. Brauzer qo'llab-quvvatlasa — siqib yuboradi. Qo'llab-quvvatlamasa — oddiy yuboradi.


Nima uchun Nginx da?

Produksiyada compression ko'pincha Nginx da qilinadi — Node.js da emas:

# nginx.conf
gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_types application/json text/plain text/css application/javascript;

# Brotli (yangroq, samarali)
brotli on;
brotli_comp_level 6;
brotli_types application/json text/plain;

Nima uchun Nginx da yaxshiroq? Nginx C da yozilgan — CPU ishlovi tezroq. Node.js event loop ni band qilmaydi. Nginx siqilgan natijalani keshlab qo'yishi ham mumkin.

Node.js da compression — Nginx yo'q (lokal dev, oddiy deploy) holatlar uchun.


Xulosa

Compression — bir qator kod, sezilarli tezlik oshishi.

Eslab qoling:

  • app.use(compression()) — bir marta, main.ts da
  • threshold: 1024 — kichik javoblar siqilmaydi
  • level: 6 — tezlik va siqish balansi
  • Produksiyada — Nginx da qilish afzal
  • Brauzer Accept-Encoding yuboradi, server Content-Encoding bilan javob beradi

Keyingi dars

36-dars: Logger — NestJS built-in, Winston/Pino integratsiya