caching inteligent și versionare în JavaScript
Pentru a face acest lucru, js și fișierele .css sunt date antetele pentru a oferi un cache securizat.
Dar ce se întâmplă atunci când unele dintre aceste fișiere modificări în procesul de dezvoltare? Toți utilizatorii din cache-ul versiunii vechi - până când cache-ul este actualizat, va masa plângerilor de integrare rupt de server și client.
Modul corect de cache și versionare elimină complet această problemă și oferă o versiune de încredere, transparente și sincronizate ale stilului / script.
Cel mai simplu mod de a cache resurse statice - 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.
Browser-ul cache fișierul și în cererile viitoare Specifică antetul țintă Dacă-Fără-meci cu documentul ETag în cache. După ce a primit un astfel de titlu, serverul poate răspunde la un 304 - și apoi documentul va fi luată din cache.
Se pare ca acest lucru:
Prima cerere către server (numerar net)
În general, browser-ul adaugă de obicei un pachet de tip antet User-Agent, Accept, etc. Pentru concizie, acestea sunt tăiate.
Răspuns de la serverul server trimite documentul în codul de răspuns 200 C și ETag:
Următoarea cerere de browser La următorul browser cerere add If-None-Match. (ETag Cached):
răspuns server Server arata - Da, documentul nu este schimbat. Deci, vă puteți da codul 304 și nu trimite din nou documentul.
Alternativa - în cazul în care documentul este schimbat, atunci serverul trimite doar 200 cu noul ETAG.
In mod similar opereaza ligamentului Last-Modified + If-Modified-Since.
- serverul trimite ultima modificare titlu Data ultimei-Modified (în loc ETag)
- browser-ul cache documentul, iar următoarea cerere transmite aceeași dată documentul versiunea memorată în cache în titlu If-Modified-Since (în locul If-None-Match)
- serverul verifică data, iar în cazul în care documentul nu a fost modificat - trimite doar codul 304, fără conținut.
Aceste metode sunt stabile și bune, dar browser-ul, în orice caz, trebuie să facă, la cerere, pentru fiecare script sau stil.
Abordarea generală pentru versionare - pe scurt:
În continuare, vom examina modul de a face acest proces automat și transparent.
Rigid caching - un fel de baros ca unghiile complet cererile de către server pentru documente stocate în memoria cache.
Este suficient pentru a adăuga antete Expiră și Cache-Control: max-age.
De exemplu, pentru a fi în cache timp de 365 de zile în PHP:
Sau puteți să cache conținut pentru o lungă perioadă de timp, folosind mod_header în Apache:
După ce a primit astfel de antete, browser-ul zakeshiruet rigid document pentru o lungă perioadă de timp. Orice referire la documentul va fi servit direct din cache-ul browser-ul fără a contacta serverul.
Să luăm în considerare modul în care să se schimbe în mod automat și perfect versiunea fără redenumirea fișierelor în același timp.
Cel mai simplu - este de a transforma numele versiunii în numele fișierului original.
La nivel Apache, este posibil să se facă mod_rewrite:
Această regulă se ocupă de toate css / js / GIF / PNG / jpg-fișiere, tăierea numele versiunii.
Dar, în afară de versiunea cut - trebuie să adăugați, de asemenea, antete fișiere de cache dure. În acest scop, directiva mod_header:
Și toți împreună aici, astfel de instrumente de configurare apachevy:
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. în caz contrar comanda antet va fi rulat în primul rând, înainte de variabila este setată VERSIONED_FILE.
Directiva antet poate fi oriunde, chiar și în .htaccess - nu face nici o diferență.
Cum de a pune în numele versiunii script - depinde de sistemul dvs. șablon și, în general, o metodă de a adăuga script-uri (stiluri, etc.).
De exemplu, folosind data modificării ca versiune și șablon motor Smarty - link-uri pot fi puse după cum urmează:
Versiune funcție adaugă o versiune:
Rezultate pe pagină:
Pentru a evita apelurile inutile Stat. Puteți stoca o matrice cu lista de versiuni curente într-o variabilă separată
În acest caz, un HTML pur și simplu substituit versiunea curentă a matrice.
Puteți traversa ambele abordări, și să ofere versiunea design-time de la data modificării - pentru relevanța și în producție - versiune de performanță solidă.
Este util atunci când un document este schimbat, dar browser-ul ar trebui să fie întotdeauna cea mai noua versiune curentă.
- versiune printabilă
O alta este să ia în considerare schimbarea numelui hash fișier și codificarea l într-un sistem de 36-hexazecimal (pentru scurt).
avantaje:
- „Versiunea“ depinde de conținutul real (de exemplu, este posibil și pentru a reveni la vechea versiune a script-ul folosind un cache veche de browser);
- nu, în funcție de timpul de modificare de fișiere;
- creșterea securității (pentru o cerere de fișier este necesar să se cunoască hash, nu doar un nume).
dezavantaje:
- Reformatarea script-ul se va schimba codul hash (dar această situație (reformatarea), în opinia mea, este puțin probabil);
- Numai atunci când modificați script-ul și a modifica textul paginii (pentru a corecta erorile din script posibil doar pentru a oferi un mecanism special, dar mă îndoiesc că este foarte necesar).
Totul pare a fi atât de atât de greșit.
De exemplu, prin apăsarea în Reîncărcare firefoxe butonul firefox încă trimite la toate elementele CERERE punctare caching-ul. Răspunsul, desigur, devine 306, dar cu toate acestea, de ce trimite cereri.
Da, funcționează în Firefox reîncărcare. Și, puteți apăsa Ctrl-F5, și el face toate cererile de 200. Doar se reincarca. Și când mersul pe jos prin paginile tuturor aplicației de funcționare.
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 folosind comanda?
Nu este întotdeauna posibil să se utilizeze fișierele principale de configurare
Stau sarcină următoare:
Acolo statice js-fișiere în pagina cheder. Desfășurat aplicație web de la aceasta pagina (HTML), care este singura parte a proiectului mare pe ASP.NET.
Este necesar să se lucreze fără cache cerere către server chiar și cu versiunea de test. Ie pentru a actualiza aplicația ar putea, dacă este curat cache-ul browser-ul. În acest caz, IIS 7 server care nu poate fi configurată. În ASP.NET, de asemenea, înțepenit nedorite.
Decizia nu a fost găsită.