Смарт кеширане и версии в JavaScript

За да направите това, .js и .css файлове са дадени заглавия, за да осигуряват сигурна кеш.

Но какво се случва, когато някои от тези файлове промени в процеса на развитие? Всички потребители в кеш паметта на старата версия - до кеша е актуална, ще масата на жалби за счупени интеграция на сървъра и от страна на клиента.

Правилният начин на кеширане и версиите напълно елиминира този проблем и да осигурява надеждни, прозрачни и синхронизирани версии на стил / сценария.

Най-лесният начин да се кешира статични ресурси - използването на ETag.

Просто включете подходящата конфигурация сървър (за Apache по подразбиране) - и всеки файл заглавия ще бъдат дадени на ETAG - хашиш, което зависи от момента на актуализацията, размера на файла и (в файлови системи, възела-базирана), възела.

Браузърът кешира файл и в бъдещи искания Задава мишена заглавната If-None-Match с ETag кеширана документ. След като получи такова заглавие, сървърът може да отговори на 304 - и след това документът ще бъде взето от кеша.

Тя изглежда така:

Първото искане към сървъра (нетен паричен)

Като цяло, браузърът обикновено добавя пакет тип удар с глава на User-Agent, Accept, и т.н. За краткост, те са изрязани.

Отговор от сървъра на сървъра ще изпрати документа в код на отговор 200 гр и ETag:

Следващата Искането за сваляне На следващото искане Добавката If-None-Match. (Кеширано ETag):

Сървър реакция на сървъра изглежда - да, документът не се променя. Така че можете да дадете код 304 и не изпраща документа отново.

Алтернатива - ако документът се променя, а след това на сървъра просто изпраща 200 с новия ETAG.

Аналогично работи лигамент Last-Modified + If-Modified-Тъй като.

  1. сървърът изпраща последната модификация дата титлата Last-Modified (вместо ETag)
  2. браузъра кешира документа, а на следващия искане изпраща една и съща дата на документа, кеширана версия в заглавието If-Modified-Since (вместо If-None-Match)
  3. сървърът проверява датата, и ако документът не се е променило - само изпраща кода 304, без съдържание.

Тези методи са стабилни и добри, но на браузъра при всички случаи трябва да се направи по поръчка за всеки скрипт или стил.

Общият подход за създаване на версии - накратко:

След това ще разгледаме как да се направи този процес автоматично и прозрачно.

Твърдо кеширане - нещо като чук, който напълно ноктите на заявки до сървъра за кеширани документи.

Това е достатъчно, за да добавите заглавия Изтича и Cache-Control: макс възраст.

Например, за да се кешира за 365 дни в PHP:

Или можете да да кешира съдържание за дълго време, като се използват mod_header в Apache:

След получаване на такива заглавия, браузърът здраво zakeshiruet документ за дълго време. Всяко по-нататъшно позоваване на документа, ще се сервира директно от кеша на браузъра, без да се свързвате със сървъра.

Нека разгледаме как автоматично и безпроблемно променят версията без преименуване на файлове по едно и също време.

Най-простият - е да се превърне в името на версията в оригиналното име на файла.

На нивото Apache, че е възможно да се направи mod_rewrite:

Това правило обработва всички CSS / JS / GIF / PNG / JPG файлове, рязане на името на версията.

Но освен нарязани версия - трябва да се прибави заглавията твърди кеширане на файлове. За тази директива цел mod_header:

И всички заедно тук такива оръдия apachevy довереник:

Поради модул mod_rewrite работната поръчка, RewriteRule трябва да се сложи в основната конфигурационен файл httpd.conf или свързани с него (включително) на файлове, но в никакъв случай не е в .htaccess. в противен случай Header команда ще се проведе за пръв път, преди променливата се задава VERSIONED_FILE.

директива Header може да е навсякъде, дори и в .htaccess - няма значение.

Как да се сложи в името на версията на скрипта - зависи от вашия шаблон система и, като цяло, метод за добавяне на скриптове (стилове и т.н.).

Например използването на датата на изменението, както и версия шаблон двигател Smarty на - връзки могат да бъдат поставени както следва:

Функция версия добавя версия:

Резултати на страница:

За да се избегнат ненужни разговори стат. Можете да съхранявате масив със списъка на текущите версии в отделна променлива

В този случай, един HTML просто заместена текущата версия на масива.

Можете да преминат и двата подхода, и предлагаме проектиране време версия на датата на изменението - за адекватност, и в производството - версия на Solid производителност.

Полезно е, когато документът се променя, но него, винаги трябва да бъде текущата най-новата версия.

  • версия за печат

Друго е да се помисли за промяна на името на хеша на файла и го кодира в 36-шестнадесетичен система (за кратко).
Предимства:
- "Версия" зависи от действителното съдържание (т.е. е възможно и да се върнете към версия на сценария на стария използвате стар кеша на браузъра);
- не в зависимост от времето за промяна на файл;
- (Е необходимо за запитване на файл да се знае, хашиш, а не само едно име) по-висока сигурност.
недостатъци:
- Преформатиране на сценария ще се промени неговата хеш (но тази ситуация (преформатиране), по мое мнение, че е малко вероятно);
- Само когато промените сценария и промяна на текста на страницата (за коригиране на грешки в скрипта само възможно да се предвиди специален механизъм, но се съмнявам, че тя е много необходима).

Всичко изглежда толкова толкова погрешно.

Така например чрез натискане на бутона за презареждане firefoxe Firefox все още изпраща до всички елементи ИСКАНЕ точкуване на кеширане. Отговорът, разбира се, получава 306, но въпреки това защо го изпраща искания.

Да, тя работи за презареждане в Firefox. И, можете да натиснете Ctrl-F5, и той прави всички заявки за 200. Само това е презареждане. И когато се разхождах из страниците на всички приложението на движение.

Поради модул mod_rewrite работната поръчка, RewriteRule трябва да се сложи в основната конфигурационен файл httpd.conf или свързани с него (включително) на файлове, но в никакъв случай не е в .htaccess, в противен случай Header команда ще се проведе за пръв път, преди да са инсталирани променлива VERSIONED_FILE.

И не можете да променяте реда с помощта на поръчката?
Тя не винаги е възможно да се използват основните конфигурационни файлове

Стоя следващата задача:
Там статични Js-файлове в cheder страница. Внедрена уеб приложение от този на една страница (HTML), която е единствената част от големия проект на ASP.NET.
Необходимо е да се работи без кеширане на заявка към сървъра дори и с тестовата версия. Т.е. за актуализиране на приложението може, ако чисти кеша на браузъра си. В този случай, IIS 7 сървъра, че тя не може да бъде конфигуриран. В ASP.NET също вклинена нежелателно.
Решение не е намерен.