В режиме разработки Rails 3.1 (при использовании конвейера ресурсов) изображения, обслуживаемые из ресурсов / изображений, обрабатываются с заголовком ответа «Управление кэшем: must-revalidate».
Это означает, что Google Chrome (и, по-видимому, только Chrome) будет пытаться повторно загружать изображения много раз - даже при просмотре одной страницы. Это привело к серьезным проблемам со всеми способами манипулирования DOM через JavaScript. Чтобы назвать несколько:
- jQuery UI Draggable иногда имеет резкое смещение от курсора мыши
- Добавление или удаление класса CSS, который ссылается на изображение, будет мигать или изменяться в размерах, пока выполняется запрос изображения (который всегда будет возвращать значение 304 без изменений).
- Присоединение или замена узлов HTML, содержащих изображения, вызовет больше выборок изображений, что приведет к внезапному заиканию всего дерева узлов под ними, поскольку Chrome ожидает ответа 304 для каждого изображения.
Я могу полностью понять, что это разумная вещь для сервера разработки. Я даже могу понять, что отказ Chrome кэшировать изображение даже внутри одного просмотра страницы вполне оправдан.
Итак, есть ли способ изменить заголовок Cache Control, который Rails применяет к ответам изображений в процессе разработки?
Обновление: По предложению пары человек, еще более интересный вопрос заключается в том, почему Chrome пытается повторно загрузить изображения несколько раз в просмотре страницы, когда другие браузеры, похоже, не видят этого? (И почему это не вызывает проблем у других разработчиков?)
Обновление x2: Я не собираюсь отправлять это как ответ, потому что это просто обходной путь, который оказывается достаточным для моих целей, но мы смогли обойти эту проблему, предварительно скомпилировав ресурсы и затем отбрасывая предварительно скомпилированные CSS & JS. (Это потребует, чтобы отладка звездочек была установлена в false в development.rb
.)
rake assets:precompile
cd public/assets
find . -name "*.js*" -exec rm -rf {} \;
find . -name "*.css*" -exec rm -rf {} \;