Наверняка любой разработчик, который пишет для web сталкивался с проблемой кэширования контента. При этом проблема может делится на две части: кэширование динамического контента и кэширование статического контента. Эти проблемы связанные с оптимизацией времени загрузки сайта. Я же подойду к этой проблеме с другой стороны: проблемы с кэшированием при разработке. Ведь все мы сталкивались с тем, что при изменении всего-лишь одной строке в javascript или изменении класса в CSS приходится в очередной раз очищать кэш браузера. И никакие магические сочетания Ctrl + F5 не помогают. В случае с Internet Explorer не всегда помогает даже очиситка кэша (Ctrl+R) в IE Developer Tools - приходится это делать стандартными средствами браузера.
Для себя я нашел следующий выход из сложившейся ситуации: отключение кэширования на стороне веб-сервера на момент разработки. Почему это нельзя сделать в браузере? Одна из причин - потому что, как правило, сайт разрабатывается для более чем одного браузера. Другая - можно забыть включить обратно и работы с другими сайтами будет не такая комфортная.
Уточню, что я редко использую веб-сервер, встроенный в Visual Studio, т.к. считаю что IIS, встроенный в Windows Vista/7 более приближен к тому решению, которое будет на stage и production environments. Из этих же соображений некоторый используют Windows Server на своих рабочих станциях.
Как всегда, сначала немного теории о том, как это всё кэширование работает.
В заголовке ответа от веб-сервера (Response) может быть поле Cache-Control, которое говорит браузеру о том, как нужно кэшировать полученный файл. Самые используемые поля это:
- no-cache - отключить кэширование;
- max-age - максимальное время (в секундах) жизни закешированного ресурса;
- min-fresh - минимальное время (в секундах) жизни закешированного ресурса.
Так же часто используется параметр “Expires”, который содержит дату, когда необходимо будет заново загрузить ресурс с сервера.Подробнее о всём это можно почитать в спецификации HTTP протокола по адресу http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html.Ещё одним способом указать браузеру, что запрашиваемый ресурс не изменился является ответ с кодом “304 Not Modified” (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).Таким образом, для отключения кэширования нам достаточно всегда добавлять поле no-cache в заголовок response. Побочных эффектов я тут вижу два:
- нужно не забыть потом включить кэширование;
- при отключенном кэшировании производительность сайта может значительно упасть, но я надеюсь, что у всех нас имеются достаточно мощные ПК для комфортной работы/разработки.
Подробно всё уже давно описано на сайтах Technet (http://technet.microsoft.com/en-us/library/cc770661(WS.10).aspx) и IIS (http://www.iis.net/ConfigReference/system.webServer/staticContent/clientCache), поэтому повторяться не буду, тем более что у меня вряд ли получится написать лучше. Скажу только пару слов о моём решении.
Кэширование я отключаю с момощью комманды “appcmd set config /section:staticContent /clientCache.cacheControlMode:DisableCache”, которую я поместил в bat-файл discache.bat.
Включаю аналогичной командой “appcmd set config /section:staticContent /clientCache.cacheControlMode:NoControl” из файла encache.bat.Ярлыки для этих файлов можно поместить в удобное для вас место либо добавть путь к ним в переменную окружения PATH для быстрого доступа к ним из любого места. Таким образом включение/выключение кэширования происходит одним кликом/одной строчкой в командной строке и позволяет избавиться от всех проблем при активной работе с javascript, CSS и картинками.