5

在Rails 3.1開發模式下(使用資產管道時),從資產/圖像提供的圖像通過響應頭「Cache Control:must-revalidate」提供。在Rails 3.1中以開發模式啓用圖像緩存

這意味着Google Chrome瀏覽器(看起來只有Chrome瀏覽器)會嘗試多次重新獲取圖像 - 即使在單頁面視圖中也是如此。這導致了所有通過JavaScript操作DOM操作的棘手問題。僅舉幾例:

  • jQuery UI的可拖動有時有戲劇性的鼠標光標
  • 添加或刪除CSS類引用了圖像閃爍或同時圖像的要求調整(這將始終返回偏移304未修改)正在進行中。
  • 附加或替換包含圖像的HTML節點將觸發更多的圖像抓取,這將導致Chrome瀏覽器等待每個圖像的304響應時,其下方的整個節點樹會出現口吃。

我完全可以理解爲開發服務器做一件合理的事情。我甚至可以理解,即使在單個頁面視圖內,Chrome拒絕緩存圖像也是合理的。

那麼,有沒有辦法改變Rails應用於開發中的圖像響應的緩存控制頭?

更新:如同一對夫婦所建議的,更有趣的問題是爲什麼Chrome瀏覽器嘗試在瀏覽視圖中多次重新提取圖片,而其他瀏覽器似乎沒有? (爲什麼這不會導致其他開發者的問題?)

更新x2:我不打算提交這個答案,因爲它只是一個解決方案,恰好足以滿足我的目的,但我們通過預編譯資源,然後丟棄預編譯的CSS,可以解決這個問題。 (這需要鏈輪調試被打開,以虛假的development.rb

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

我想不出一個Rails配置的這一點,也許做一些挖掘鏈輪配置而不是? – 2012-01-18 20:36:08

回答

4

我見過的唯一方法來操縱資產的Cache-Control頭是通過配置靜態資產:

config.serve_static_assets = true 

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

感謝@MitchKett,但不幸的是,當資產必須由鏈輪處理時,似乎並沒有這樣做(也就是說,如果上述文件是公共/資產文件,可能會起作用,但顯然如果它們處於應用程序/資產/圖像) – 2012-01-18 21:00:39

+0

呃,我給了它一個鏡頭:)。祝你找到解決方案! – 2012-01-18 21:04:48

1

鏈輪要麼發送緩存標題或強制重新驗證(請參閱the source)。

我看不到公開可用的選項來更改此行爲。我想你將不得不猴子補丁鏈輪。

可能更大的興趣是爲什麼Chrome會以這種方式行事?

+0

是的,事實上,我只是測試了黑客的鏈輪源,它的工作*很棒*。編輯的要點:https://gist.github.com/1636038 – 2012-01-18 21:54:56

+0

需要注意的一個問題。緩存後,您必須強制重新加載才能更新任何更改的圖像。您可能希望縮短開發時間,並將其僅用於圖像。 – 2012-01-18 21:58:19

+0

是的,當然,這不是一個修復,只是驗證更改標題可以解決問題。 – 2012-01-18 22:03:13

相關問題