在Rails 3.1中以开发模式启用图像缓存

时间:2012-01-18 20:17:39

标签: ruby-on-rails-3 google-chrome asset-pipeline cache-control

在Rails 3.1开发模式中(使用资产管道时),使用响应标题“Cache Control:must-revalidate”提供由资源/图像提供的图像。

这意味着即使在单页浏览中,Google Chrome(以及看似只有Chrome)也会尝试多次重新获取图片。这导致了通过JavaScript进行DOM操作的所有方式的棘手问题。仅举几例:

  • jQuery UI Draggable有时会与鼠标光标有明显的偏移
  • 添加或删除引用图像的CSS类将闪烁或调整大小,同时图像请求(始终返回304未修改)正在进行中。
  • 附加或替换包含图像的HTML节点将触发更多图像提取,这将导致其下方的整个节点树闪烁,因为Chrome等待每个图像的304响应。

我完全可以理解为开发服务器做一件合理的事情。我甚至可以理解,即使在单页视图中,Chrome也拒绝缓存图像,这是非常合理的。

那么,有没有办法更改Rails应用于开发中的图像响应的Cache Control标头?

更新:正如一些人所建议的那样,一个更有趣的问题是,为什么当没有其他浏览器时,Chrome会尝试在网页浏览中多次重新获取图片? (为什么这不会给其他开发者带来问题?)

更新x2:我不打算将此作为答案提交,因为这只是一个适合我的目的的解决方法,但我们能够通过预编译资产来解决这个问题然后丢弃预先编译的CSS& JS。 (这将要求sprockets调试在development.rb中变为false。)

rake assets:precompile
cd public/assets
find . -name "*.js*" -exec rm -rf {} \;
find . -name "*.css*" -exec rm -rf {} \;

4 个答案:

答案 0 :(得分:4)

我看到操纵资产的Cache-Control标头的唯一方法是使用以下命令配置静态资产:

config.serve_static_assets = true

config.static_cache_control = "public, max-age=3600"

答案 1 :(得分:1)

Sprockets要么发送缓存标头,要么强制重新验证(参见the source)。

我看不到公开可用的选项来更改此行为。

要修改这个,我想你将不得不修补Sprockets。

可能更感兴趣的是为什么Chrome会以这种方式行事?

答案 2 :(得分:1)

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

这似乎是Chrome的文档问题。我遇到了同样的问题:添加或删除引用图像的CSS类会闪烁或调整大小,而图像请求(总是返回304未修改)正在进行中。

答案 3 :(得分:0)

您不需要将资产编译为公共/资产并删除* js * css来缓存图像

您可以在机架中缓存图片,https://github.com/mvj3/rack_image_assets_cache_control