Cache i kompresja: darmowa szybkość, po którą nikt się nie schyla
Cache-Control, który naprawdę cache'uje, dlaczego hash w nazwie pliku zmienia wszystko i ustawienie kompresji wciąż brakujące na połowie witryn.
Infrastruktura · Opublikowano: 30 sierpnia 2026 · 3 min czytania · Анна Ковалёва
Większość pracy nad wydajnością jest kosztowna: przepisać komponenty, odroczyć skrypty, pokłócić się o framework. Dwa ustawienia takie nie są. Leżą w pliku konfiguracyjnym, zajmują popołudnie i wciąż są błędne na sporej części produkcyjnych witryn.
Najpierw kompresja
Tekst kompresuje się o siedemdziesiąt do osiemdziesięciu procent. HTML, CSS, JavaScript, JSON, SVG — to wszystko tekst. Jeśli odpowiedź nie ma Content-Encoding, wysyłasz czterokrotnie więcej bajtów bez powodu.
Brotli wygrywa z gzipem o mniej więcej piętnaście procent na tej samej treści i jest wspierany wszędzie, gdzie to istotne; gzip zostaw jako zapas. Dwa częste błędy: kompresowanie obrazów (JPEG i PNG są już skompresowane — wydajesz CPU na nic) oraz zapominanie, że ustawienie działa per typ MIME, więc subdomena serwująca JSON z innej konfiguracji po cichu wysyła go surowo.
Cache-Control uczciwie
Nagłówek odpowiada na dwa pytania: czy wolno to przechować i jak długo. Użytecznych wzorców jest niewiele.
Zasoby z hashem — /app.4f2a91.js:
Cache-Control: public, max-age=31536000, immutable
Rok i bez rewalidacji. Bezpieczne właśnie dlatego, że nazwa pliku zmienia się razem z treścią. To największa dostępna wygrana i działa tylko wtedy, gdy build faktycznie hashuje nazwy.
HTML:
Cache-Control: no-cache
Wbrew nazwie to nie jest "nie cache'uj". To "przechowaj, ale przed użyciem dopytaj". Przeglądarka wysyła If-None-Match i zwykle dostaje 304 bez treści — szybko i nigdy nieświeże.
Odpowiedzi spersonalizowane:
Cache-Control: private, no-store
Dla wszystkiego, czego współdzielony cache trzymać nie może: konto, koszyk, wszystko za logowaniem.
Błędy, które kosztują najwięcej
Krótki max-age na plikach z hashem. max-age=600 na nazwie zawierającej hash treści przekreśla całą korzyść.
Długi max-age na plikach bez hasha. /logo.png w cache na rok oznacza, że redesign nie dotrze do nikogo, kto był wcześniej.
Brak ETag lub Last-Modified na HTML. Bez walidatora przeglądarka nie może spytać "czy się zmieniło"; pobiera cały dokument od nowa.
Źle ustawiony Vary. Vary: User-Agent rozdrabnia cache CDN na tysiące niemal identycznych wpisów i prawie nigdy nie jest tym, o co ci chodziło.
Udowodnij, zamiast zakładać
Konfiguracja to jedno, a to, co realnie dociera do przeglądarki, to drugie: CDN, proxy albo panel hostingu mogą przepisać nagłówki po drodze. Kontrola idzie po każdej odpowiedzi i po całej witrynie:
dla każdej odpowiedzi:
czy jest content-encoding na text/*?
czy cache-control pasuje do klasy zasobu?
czy dokumenty mają etag albo last-modified?
Uruchamiaj po każdym wdrożeniu. Ta klasa regresji jest bezgłośna — nic się nie psuje, witryna po prostu zwalnia, a rachunek za transfer rośnie — i właśnie dlatego przeżywa lata, gdy nikt nie patrzy.
Przeczytaj także
Sprawdź, ile z tego dotyczy Twojej strony
Darmowe skanowanie pokaże uszkodzone linki, błędy JS i problemy z wydajnością w minutę.