在 Rails 3.1 开发模式中(使用资产管道时),从资产/图像中提供的图像会附带响应标头“缓存控制:必须重新验证”。
这意味着 Google Chrome(似乎只有 Chrome)将尝试多次重新获取图像 - 即使在单个页面视图期间也是如此。这导致通过 JavaScript 进行的各种 DOM 操作方式都出现了棘手的问题。仅举几例:
- jQuery UI Draggable 有时会出现与鼠标光标的剧烈偏移
- 在图像请求(始终返回 304 未修改)正在进行时,添加或删除引用图像的 CSS 类将会闪烁或调整大小。
- 附加或替换包含图像的 HTML 节点将触发更多图像获取,这将导致它们下面的整个节点树在 Chrome 等待每个图像的 304 响应时闪烁。
我完全可以理解,对于开发服务器来说,这是一件合理的事情。我什至可以理解 Chrome 拒绝缓存图像,即使在单个页面视图中也是完全合理的。
那么,有没有一种方法可以更改 Rails 在开发中应用于图像响应的缓存控制标头?
Update:正如几个人所建议的,一个更有趣的问题是,为什么 Chrome 会尝试在页面视图中多次重新获取图像,而其他浏览器似乎没有这样做? (为什么这不会给其他开发人员带来问题?)
更新x2:我不会将此作为答案提交,因为这只是一个足以满足我的目的的解决方法,但我们能够通过预编译资产然后丢弃预编译的 CSS 和 JS 来解决这个问题。 (这将需要链轮调试在development.rb
.)
rake assets:precompile
cd public/assets
find . -name "*.js*" -exec rm -rf {} \;
find . -name "*.css*" -exec rm -rf {} \;
我见过的操作资源的 Cache-Control 标头的唯一方法是通过以下方式配置静态资源:
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)