Всем привет!
Пишу о наболевшем...
Подключая внешние CSS и Javascript, мы хотим снизить до минимума лишние HTTP-запросы.
Для этого .js и .css файлы отдаются с заголовками, обеспечивающими надежное кеширование.
Но что делать, когда какой-то из этих файлов меняется в процессе разработки? У всех пользователей в кеше старый вариант — пока кеш не устарел, придет масса жалоб на сломанную интеграцию серверной и клиентской части.
Вот именно такая проблема возникает у меня при любых доработках. Поэтому предлагаю небольшой хак/решение.
Сразу отмечу, если вдруг кто-то писал уже об этом, то прошу не кидать камнями, т.к. блоги отслеживаю, а разработчики данный функционал на сегодняшний день еще не заложили.
Предлагаю следующее решение: после имени JS или CSS файла добавлять переменную версии, которая берется из даты изменения файла.
Таким образом, при редактировании данных файлов, дата изменения будет меняться, а следовательно браузер запросит и закеширует файлы заново, а старая версия постепенно выпадет из кеша.
Зачастую подключение JS и CSS происходит через $inPage->addHeadJS и $inPage->addHeadCSS, поэтому внесем правки именно в эти функции.
Файл: /core/classes/page.class.php
функцию:
меняем на:
и также подключение CSS
функцию:
меняем на:
Прошу прокомментировать данное решение, надеюсь функция запроса даты изменения файла не будет сильно нагружать сервер.
upd: вариант для 2-ой ветки Хак: Умное Кеширование и Версионность в Javascript/CSS (2.x)
Пишу о наболевшем...
Подключая внешние CSS и Javascript, мы хотим снизить до минимума лишние HTTP-запросы.
Для этого .js и .css файлы отдаются с заголовками, обеспечивающими надежное кеширование.
Но что делать, когда какой-то из этих файлов меняется в процессе разработки? У всех пользователей в кеше старый вариант — пока кеш не устарел, придет масса жалоб на сломанную интеграцию серверной и клиентской части.
Вот именно такая проблема возникает у меня при любых доработках. Поэтому предлагаю небольшой хак/решение.
Сразу отмечу, если вдруг кто-то писал уже об этом, то прошу не кидать камнями, т.к. блоги отслеживаю, а разработчики данный функционал на сегодняшний день еще не заложили.
Предлагаю следующее решение: после имени JS или CSS файла добавлять переменную версии, которая берется из даты изменения файла.
Таким образом, при редактировании данных файлов, дата изменения будет меняться, а следовательно браузер запросит и закеширует файлы заново, а старая версия постепенно выпадет из кеша.
Зачастую подключение JS и CSS происходит через $inPage->addHeadJS и $inPage->addHeadCSS, поэтому внесем правки именно в эти функции.
Файл: /core/classes/page.class.php
функцию:
public function addHeadJS($src){ return $this->addHead('<script type="text/javascript" src="/'.$src.'"></script>'); }
public function addHeadJS($src){ return $this->addHead('<script type="text/javascript" src="/'.$src.'?'.filemtime(PATH.'/'.$src).'"></script>'); }
функцию:
public function addHeadCSS($src){ return $this->addHead('<link href="/'.$src.'" rel="stylesheet" type="text/css" />'); }
public function addHeadCSS($src){ return $this->addHead('<link href="/'.$src.'?'.filemtime(PATH.'/'.$src).'" rel="stylesheet" type="text/css" />'); }
upd: вариант для 2-ой ветки Хак: Умное Кеширование и Версионность в Javascript/CSS (2.x)
Реклама #
Stecc 9 лет назад #
Stecc 9 лет назад #
Kirill Levitskiy 9 лет назад #
irbis 9 лет назад #
Fuze 9 лет назад #
p.s. ну и filemtime($src) - это не правильно, ведь в $src относительный путь, тогда уж через константу PATH нужно.
irbis 9 лет назад #
Fuze 9 лет назад #
http://httpd.apache.org/docs/current/mod/mod_expires.html
http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html
https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ru
И так далее
irbis 9 лет назад #
irbis 9 лет назад #