在Rails 3.1的开发模式下启用图像缓存



在Rails 3.1开发模式中(当使用资产管道时),从资产/图像中提供的图像会带有响应标头"Cache Control:must revalidate"。

这意味着谷歌Chrome(似乎只有Chrome)将多次尝试重新获取图像——即使是在单页浏览中。这导致了通过JavaScript进行各种DOM操作时出现了一些奇怪的问题。举几个例子:

  • jQuery UI Draggable有时具有与鼠标光标显著偏移的特性
  • 添加或删除引用图像的CSS类将在图像请求(总是返回未修改的304)进行时闪烁或调整大小
  • 附加或替换包含图像的HTML节点将触发更多的图像获取,这将导致它们下面的整个节点树在Chrome等待每个图像的304响应时闪烁

我完全可以理解开发服务器这样做是合理的。我甚至可以理解Chrome拒绝缓存图像,即使是在单个页面视图中,也是完全合理的。

那么,有没有一种方法可以更改Rails在开发中应用于图像响应的Cache-Control头?

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

更新x2:我不会将其作为答案提交,因为这只是一个变通方法,恰好对我的目的来说足够了,但我们能够通过预编译资产,然后丢弃预编译的CSS&JS。(这需要在development.rb中将链轮调试设置为假。)

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

我看到的操作资产的缓存控制头的唯一方法是使用配置静态资产

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

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

这似乎是chrome的一个记录问题。我也遇到了同样的问题:添加或删除引用图像的CSS类会在图像请求(总是返回未修改的304)进行时闪烁或调整大小。

Sprockets要么发送缓存头,要么强制重新验证(请参阅源代码)。

我看不到任何公开的选项可以改变这种行为。

要修改这一点,我认为你将不得不对Sprockets进行猴子补丁。

可能更令人感兴趣的是Chrome为什么会这样做?

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

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