Caching inteligent și versiuni în javascript

Pentru aceasta, fișierele .js și .Css sunt date cu anteturi care oferă cache-ul fiabil.

Dar dacă unele dintre aceste fișiere se schimbă în timpul dezvoltării? Toți utilizatorii din memoria cache au o versiune veche - în timp ce memoria cache nu este depășită, vor exista multe plângeri legate de integrarea ruptă a serverului și a părții client.







Modul corect de cache și de versiune elimină complet această problemă și oferă o sincronizare fiabilă și transparentă a versiunilor de stil / script.

Cea mai ușoară cale de stocare a resurselor statice este utilizarea ETag.

Doar porniți configurația serverului corespunzătoare (pentru Apache în mod implicit) - și fiecare titluri de fișiere va fi dat ETAG - hash, care depinde de momentul actualizării, dimensiunea fișierului și (în sistemele de fișiere bazate pe inode) inode.

Browserul cache un astfel de fișier, iar în cererile ulterioare indică antetul If-None-Match cu ETag al documentului memorat în memoria cache. După primirea unui astfel de antet, serverul poate răspunde cu codul 304 - și apoi documentul va fi luat din memoria cache.

Se pare ca aceasta:

Prima solicitare către server (cache-ul este curat)

În general, browserul adaugă de obicei un alt pachet de anteturi, cum ar fi User-Agent, Accept, etc. Pentru o scurtă durată sunt tăiate.

Răspunsul serverului Serverul trimite un document de 200 de documente și document ETAG ca răspuns:

Următoarea solicitare de browser Data viitoare când browserul solicită, adăugați If-None-Match. (ETag cache):

Răspunsul serverului Serverul urmărește - da, documentul nu sa schimbat. Deci, puteți emite codul 304 și nu mai trimiteți din nou documentul.

Alternativ, dacă documentul s-a schimbat, serverul trimite pur și simplu 200 cu noul ETag.

Ultima legătură modificată + dacă modificată din moment funcționează într-un mod similar.

  1. serverul trimite ultima dată de modificare în antetul Ultima modificare (în loc de ETag)
  2. browserul cache documentul, iar data viitoare când solicită același document, trimite data versiunii memorate în cache în antetul If-Modified-Since (în loc de If-None-Match)
  3. serverul verifică datele și, dacă documentul nu sa schimbat - trimite numai codul 304, fără conținut.

Aceste metode funcționează stabil și bine, dar browserul trebuie în orice caz să facă cerere la fiecare scenariu sau stil.

Abordarea generală pentru versiune este în două cuvinte:

Apoi, vom analiza modul de a face acest proces automat și transparent.

Caching-ul greu este un fel de caruserie care completează cererile serverului pentru documente memorate în cache.

Pentru a face acest lucru, trebuie doar să adăugați anteturile Expires și Cache-Control: max-age.

De exemplu, pentru cache pentru 365 de zile în PHP:

Sau puteți cache-ul de conținut pentru o lungă perioadă de timp, folosind mod_header în Apache:







După primirea unor astfel de anteturi, browserul va memora cache documentul mult timp. Toate apelurile suplimentare către document vor fi difuzate direct din cache-ul browserului, fără a accesa serverul.

Să analizăm cum să modificăm automat și transparent versiunea, fără a redenumi fișierele în sine.

Cel mai simplu lucru este să convertiți numele cu versiunea la numele original al fișierului.

La nivelul Apache, puteți face acest mod_rewrite:

Această regulă se ocupă de toate fișierele css / js / gif / png / jpg, tăind versiunea din nume.

Dar, pe lângă decuparea versiunii, trebuie să adăugați și antete cache-hard în fișiere. Directivele mod_header sunt utilizate pentru aceasta:

Și toate împreună implementează această configurație apache:

Din cauza ordinii modulului mod_rewrite, RewriteRule trebuie să fie plasat în fișierul de configurare httpd.conf principal sau în fișierele de includere, dar în nici un caz în .htaccess. în caz contrar, comenzile Header vor fi pornite mai întâi, înainte ca variabila VERSIONED_FILE să fie setată.

Direcțiile Header pot fi oriunde, chiar și în .htaccess - fără nici o diferență.

Cum să puneți versiunea în numele script-ului depinde de sistemul de șabloane și, în general, de modul de adăugare a scripturilor (stiluri etc.).

De exemplu, dacă folosiți data modificării ca versiune și șablon Smarty, puteți pune linkuri în felul următor:

Funcția de versiune adaugă versiunea:

Rezultat pe pagina:

Pentru a evita apelurile inutile la stat. Puteți stoca un tablou cu o listă de versiuni curente într-o variabilă separată

În acest caz, versiunea curentă a matricei este pur și simplu substituită în HTML.

Puteți trece ambele abordări și puteți da o versiune în momentul dezvoltării până la data modificării - pentru relevanță și pentru producție - versiunea din matrice pentru performanță.

Este util ori de câte ori un document este schimbat, dar browserul trebuie să aibă întotdeauna actuala versiune curentă.

  • versiune tipărită

Un alt lucru care merită luat în considerare este schimbarea numelui prin hash a fișierului și codarea acestuia într-un sistem pe 36 de biți (pentru brevitate).
avantaje:
- "versiunea" depinde de conținutul real (adică este posibil să reveniți la vechea versiune a scriptului folosind vechea memorie cache a browserului);
- nici o schimbare a fișierelor dependente de timp;
- Creșteți securitatea (pentru o solicitare de fișier, trebuie să știți hash-ul său, nu doar un nume).
dezavantaje:
- când scriptul este reformatat, hash-ul său se va schimba (dar această situație (reformatarea), în opinia mea, este puțin probabilă);
- când schimbați doar scriptul, textul paginii se va schimba (pentru corectarea erorilor numai în scriptul pe care îl puteți oferi un mecanism special, dar mă îndoiesc că este foarte necesar).

Totul pare a fi așa că nu-mi place asta.

De exemplu, făcând clic pe butonul firefox reload firefox trimite încă toate ELEMENTELE interogării prin ciocnire în cache. Ca răspuns, desigur, devine 306, dar totuși, de ce trimite cereri.

Da, așa funcționează reîncărcarea în Firefox. Și puteți apăsa Ctrl-F5 și, în general, solicită 200. Numai aceasta este o reîncărcare. Și când treceți prin pagini, totul funcționează bine.

Datorită modulului comandă de lucru mod_rewrite, RewriteRule nevoie pentru a pune în principal httpd.conf fișierul de configurare sau conectat la acesta (include) fișiere, dar, în orice caz, nu în htaccess, altfel comanda Antet va fi rulat în primul rând, înainte de instalat VERSIONED_FILE variabilă.

Și nu puteți schimba ordinea cu ordinea?
Nu este întotdeauna posibil să utilizați fișierele principale de configurare

Am următoarea sarcină:
Există fișiere js-statice în antetul paginii. O aplicație Web a fost implementată de pe această pagină (html), care este doar o parte a întregului mare proiect ASP.NET.
Este necesar ca caching-ul să funcționeze fără cerere la server, chiar și cu verificarea modificării. Ie Puteți să actualizați aplicația dacă ștergeți memoria cache a browserului. Astfel, serverul IIS 7, pe care este imposibil să îl configurați. În ASP.NET, de asemenea, înclinarea este nedorită.
Decizia nu a fost găsită încă.







Trimiteți-le prietenilor: