Включить кеширование изображений в режиме разработки в Rails 3.1 - PullRequest
5 голосов
/ 19 января 2012

В режиме разработки 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 {} \;

Ответы [ 4 ]

4 голосов
/ 19 января 2012

Единственный способ манипулировать заголовком Cache-Control для ресурсов, который я видел, - это настроить статические активы с помощью:

config.serve_static_assets = true

config.static_cache_control = "public, max-age=3600"
1 голос
/ 04 сентября 2012

http://code.google.com/p/chromium/issues/detail?id=102706

Это похоже на документально подтвержденную проблему с Chrome.Я страдаю от той же проблемы: добавление или удаление класса CSS, который ссылается на изображение, будет мигать или изменяться в размерах, пока выполняется запрос изображения (который всегда будет возвращать 304 без изменений).

1 голос
/ 19 января 2012

Sprockets будет отправлять кэширующие заголовки или принудительно выполнять повторную проверку (см. источник ).

Я не вижу общедоступных опций для изменения этого поведения.

Чтобы изменить это, я думаю, вам придется обезьяна патч Sprockets.

Возможно, более интересный вопрос, почему Chrome ведет себя таким образом?

0 голосов
/ 07 мая 2013

Вам не нужно компилировать ресурсы в public / assets и удалять * js * css для кэширования изображений

Вы можете кэшировать изображение в стойке, https://github.com/mvj3/rack_image_assets_cache_control

...