Browser caching konfigūravimas greitesniam įkėlimui

Kodėl naršyklės talpykla yra svarbi ir kaip ji veikia

Turbūt visi esame patyrę tą nemalonų jausmą, kai svetainė kraunasi amžinybę. Vartotojai tampa nervingi, o Google tai pastebi ir nubaudžia prastesne pozicija paieškoje. Vienas iš paprasčiausių būdų pagreitinti svetainės įkėlimą – tinkamai sukonfigūruoti naršyklės talpyklą (browser caching).

Principas paprastas: užuot kaskart atsisiųsdama tuos pačius failus (CSS, JavaScript, paveikslėlius), naršyklė juos išsaugo vartotojo kompiuteryje. Kai žmogus grįžta į svetainę ar pereina į kitą puslapį, naršyklė naudoja lokaliai išsaugotus failus vietoj to, kad siųstų naujus užklausimus serveriui. Rezultatas? Žymiai greitesnis įkėlimas ir mažesnė serverio apkrova.

Tačiau čia yra viena problema – kaip naršyklei pasakyti, kuriuos failus talpinti, kaip ilgai juos laikyti ir kada juos atnaujinti? Būtent čia ir prasideda konfigūravimo darbas.

HTTP antraščių magija: Cache-Control ir Expires

Naršyklės talpyklos valdymas vyksta per HTTP antraštes, kurias serveris siunčia kartu su kiekvienu failu. Dvi pagrindinės antraštės, su kuriomis dirbsime – Cache-Control ir Expires.

Cache-Control yra modernesnė ir lankstesnė. Ji leidžia nustatyti įvairius parametrus:

  • max-age – nurodo, kiek sekundžių failas gali būti laikomas talpykloje
  • public – failą gali talpinti bet kas (naršyklės, CDN, proxy serveriai)
  • private – failą gali talpinti tik vartotojo naršyklė
  • no-cache – naršyklė turi patikrinti su serveriu, ar failas nepasikeitė
  • no-store – failo visiškai netalpinti (naudojama jautriems duomenims)

Pavyzdys: Cache-Control: public, max-age=31536000 reiškia, kad failas gali būti viešai talpinamas vienerius metus (31536000 sekundžių).

Expires antraštė veikia panašiai, tik nurodo konkrečią datą, kada failas taps pasenęs. Ji daugiau naudojama suderinamumui su senesnėmis naršyklėmis. Jei nustatytos abi antraštės, Cache-Control turi prioritetą.

Apache serverio konfigūracija praktikoje

Jei naudojate Apache serverį, talpyklos konfigūracija vyksta per .htaccess failą arba serverio konfigūracijos faile. Pirmiausia įsitikinkite, kad įjungtas mod_expires ir mod_headers moduliai.

Štai praktinis pavyzdys, kurį galite tiesiog nukopijuoti į savo .htaccess:

<IfModule mod_expires.c>
  ExpiresActive On
  
  # Paveikslėliai
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  
  # CSS ir JavaScript
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  
  # Šriftai
  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType font/woff "access plus 1 year"
  ExpiresByType font/ttf "access plus 1 year"
  
  # HTML
  ExpiresByType text/html "access plus 0 seconds"
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(jpg|jpeg|png|gif|webp|svg|woff|woff2|ttf|css|js)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
</IfModule>

Atkreipkite dėmesį, kad HTML failams nustatome labai trumpą talpyklos laiką arba jo visai nenustatome. Kodėl? Nes HTML dažniausiai yra dinaminis turinys, kuris keičiasi dažniau nei statiniai resursai.

Nginx konfigūracija – greičio entuziastams

Nginx vartotojai džiaugsis, nes čia viskas dar paprasčiau. Konfigūracija vyksta serverio bloke arba location direktyvose:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

location ~* \.(html)$ {
    expires -1;
    add_header Cache-Control "no-cache, no-store, must-revalidate";
}

Čia expires 1y automatiškai nustato ir Expires, ir Cache-Control antraštes. Parametras immutable yra ypač naudingas – jis naršyklei sako, kad failas tikrai niekada nepasikeis, todėl net perkrovus puslapį su Ctrl+F5, naršyklė nenaudos serverio resursų patikrinimui.

Versijų valdymas arba kaip atnaujinti talpyklą

Dabar iškyla klausimas: jei nustatėme, kad failai talpykloje gali būti saugomi metus, kaip vartotojai pamatys pakeitimus, kai atnaujinsime CSS ar JavaScript?

Atsakymas – versijų valdymas (cache busting). Yra keli būdai:

1. Query string metodas

Paprasčiausias būdas – pridėti versijos numerį ar laiką prie failo URL:

<link rel="stylesheet" href="styles.css?v=1.2.3">
<script src="app.js?v=20240115"></script>

Kai atnaujinate failą, pakeičiate versijos numerį, ir naršyklė laiko tai nauju failu.

2. Failo pavadinimo keitimas

Profesionalesnis būdas – įtraukti hash’ą į failo pavadinimą. Daugelis build įrankių (Webpack, Vite, Parcel) tai daro automatiškai:

styles.a3f2b1c8.css
app.9d4e2f1a.js

Kai failas pasikeičia, pasikeičia ir hash’as, todėl naršyklė žino, kad tai naujas failas.

3. Service Workers

Progresyviose web aplikacijose galite naudoti Service Workers, kurie suteikia visišką kontrolę, kokie failai talpinami ir kaip jie atnaujinami. Tai sudėtingesnis metodas, bet suteikia maksimalų lankstumą.

CDN ir talpyklos sluoksniai

Jei naudojate CDN (Content Delivery Network) kaip Cloudflare, AWS CloudFront ar Fastly, turite papildomą talpyklos sluoksnį. CDN serveriai taip pat talpina jūsų failus ir turi savo taisykles.

Svarbu suprasti hierarchiją:

  • Vartotojo naršyklės talpykla (browser cache)
  • CDN edge serverių talpykla
  • Jūsų origin serverio talpykla

Konfigūruojant CDN, atkreipkite dėmesį į šiuos dalykus:

Cache-Control antraštės respektavimas – dauguma CDN pagal nutylėjimą gerbia jūsų nustatytas antraštes, bet galite jas perrašyti CDN lygyje.

Query string elgesys – kai kurie CDN pagal nutylėjimą ignoruoja query string parametrus talpyklos tikslais. Tai gali sukelti problemų su versijų valdymu.

Purge funkcionalumas – geri CDN tiekėjai leidžia rankiniu būdu išvalyti talpyklą, kai reikia skubiai atnaujinti turinį.

Dažniausios klaidos ir kaip jų išvengti

Per daugelį metų esu matęs įvairiausių talpyklos konfigūravimo klaidų. Štai dažniausios:

Per ilgas HTML talpyklos laikas

Daugelis nustatę agresyvų caching’ą visiems failams, įskaitant HTML. Rezultatas – vartotojai nemato atnaujinimų. HTML turėtų būti talpinamas trumpai arba su no-cache direktyva.

Nepakankamas statinių resursų talpyklos laikas

Priešinga problema – nustatyti tik kelias minutes ar valandas paveikslėliams ir CSS. Jei turite versijų valdymą, drąsiai nustatykite metus ar daugiau.

Ignoruojamas Vary antraštė

Jei jūsų turinys skiriasi priklausomai nuo Accept-Encoding, User-Agent ar kitų antraščių, turite naudoti Vary antraštę:

Vary: Accept-Encoding

Tai naršyklei ir CDN pasako, kad failas gali skirtis priklausomai nuo šių parametrų.

Jautrių duomenų talpinimas

Asmeniniai duomenys, autentifikacijos atsakymai ir kitas jautrus turinys niekada neturėtų būti talpinami. Naudokite:

Cache-Control: private, no-cache, no-store, must-revalidate

Testavimas ir matavimas: ar tikrai veikia?

Konfigūracija be testavimo – tai tik spėliojimai. Štai kaip patikrinti, ar jūsų talpykla veikia teisingai:

Browser DevTools

Atidarykite Chrome DevTools (F12), eikite į Network tab ir perkraukite puslapį. Stulpelyje „Size” matysite:

  • „disk cache” arba „memory cache” – failas paimtas iš talpyklos
  • Faktinis dydis (pvz., „45.2 KB”) – failas atsisiųstas iš serverio

Stulpelyje „Time” talpinti failai turėtų rodyti tik kelis milisekundžius.

Response Headers tikrinimas

Tame pačiame Network tab spustelėkite ant bet kurio failo ir pažiūrėkite Response Headers. Turėtumėte matyti savo nustatytas Cache-Control ir Expires antraštes.

Online įrankiai

Naudokite tokius įrankius kaip:

  • GTmetrix – rodo detalią talpyklos analizę
  • WebPageTest – leidžia palyginti pirmą ir pakartotinį apsilankymą
  • Google PageSpeed Insights – duoda rekomendacijas dėl talpyklos

cURL komanda

Techniniam patikrinimui naudokite cURL:

curl -I https://jusu-svetaine.lt/styles.css

Tai parodys visas HTTP antraštes, įskaitant talpyklos direktyvas.

Kai viskas sudėliota į vietas

Tinkamas naršyklės talpyklos konfigūravimas nėra vienkartinis darbas – tai procesas, kuris reikalauja supratimo, testavimo ir nuolatinio tobulinimo. Bet rezultatai to verti: greitesnis svetainės įkėlimas, laimingesni vartotojai, mažesnė serverio apkrova ir geresnis SEO.

Pradėkite nuo paprastos konfigūracijos: ilgas talpyklos laikas statiniams resursams su versijų valdymu, trumpas arba jokio talpyklos HTML failams. Išbandykite, pamatuokite rezultatus, koreguokite. Neužmirškite, kad skirtingi projektai gali reikalauti skirtingų strategijų – e-commerce svetainė turės kitokius poreikius nei korporacinis blog’as.

Ir dar vienas patarimas: dokumentuokite savo talpyklos strategiją. Po pusės metų, kai reikės kažką pakeisti, būsite dėkingi sau už tuos kelis sakinius, paaiškinus, kodėl pasirinkote būtent tokią konfigūraciją. Nes talpyklos problemos dažnai pasireiškia netikėčiausiu metu, ir greitai suprasti, kas ir kodėl sukonfigūruota tam tikru būdu, gali sutaupyti daug nervų ir laiko.

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *