2010-05-04 26 views
6

我們使用JS Rails的資產緩存和CSS這樣的:Rails的資產緩存打破開始幾頁加載

<%= stylesheet_link_tag 'reset','global','admins','autocomplete', 'date_input', 'tablesorter', 'partners', 'jqmodal', :media => 'screen', :cache => set_asset_cache(:admins) %> 
<%= javascript_include_tag :defaults, 'autocomplete', 'searchbox', 'jqmodal', :cache => set_asset_cache(:admins) %> 

在我們的部署,我們稱之爲rake tmp:assets:clear各一次。問題是在部署頁面上沒有css或js之後,前幾頁加載。我想直到緩存的all.js和all.css都被重新生成了。

我們每天部署很多次,這對任何偶然碰到破壞頁面的用戶都很可怕。

有沒有人找到任何方式使這個更平滑,以便新的緩存資產保證在第一個新的頁面加載?

+0

幾個問題: 1)你在不同的機器上有多個應用服務器嗎? 2)模板中CSS的緩存行是什麼? – scottd 2010-05-11 14:24:36

+0

嗨斯科特。一臺機器上的所有應用服務器。下面是一個css緩存行的例子:'<%= stylesheet_link_tag'reset','global','admins','autocomplete','date_input','tablesorter','partners','jqmodal',:media = >'screen',:cache => set_asset_cache(:admins)%>'我們爲管理員,買方,賣方,着陸頁等分別設置了一個(每個佈局一個)。謝謝! – 2010-05-11 19:51:58

回答

3

AssetHat寶石解決了這個確切的問題。首次加載頁面(這會增加頁面的加載時間)而不是連接資源,而是在部署上連接資源。作爲獎勵,gem還可以縮小您的CSS和JS,從而節省寶貴的字節。

安裝後,使用很簡單:

  • 使用include_css :bundle => 'admins'和佈局include_js :bundle => 'admins'。 (捆綁的內容被設置在配置文件中以保持您的佈局輕量級。)
  • rake asset_hat:minify添加到您的部署腳本。我的公司一直在Capistrano生產中使用它一年左右。

還有更多的信息在readmedocs,我很樂意聽到任何問題/想法!

1

你可以嘗試使用wget在部署過程中升溫緩存,作爲一個例子(shamelessly reposted):

wget -r -nd --delete-after http://whatever.com/~popular/page/ 

然而,這必須要執行您打開符號鏈接到新的部署之後。一個可能更優雅的解決方案可能是在部署中手動調用資產緩存方法,但我不確定這是多麼可行。 Here's where the caching is performed in Rails

# File vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb, line  273 
273:  def javascript_include_tag(*sources) 
274:   options = sources.extract_options!.stringify_keys 
275:   concat = options.delete("concat") 
276:   cache = concat || options.delete("cache") 
277:   recursive = options.delete("recursive") 
278: 
279:   if concat || (ActionController::Base.perform_caching && cache) 
280:   joined_javascript_name = (cache == true ? "all" : cache) + ".js" 
281:   joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ? ASSETS_DIR : JAVASCRIPTS_DIR, joined_javascript_name) 
282: 
283:   unless ActionController::Base.perform_caching && File.exists?(joined_javascript_path) 
284:    write_asset_file_contents(joined_javascript_path, compute_javascript_paths(sources, recursive)) 
285:   end 
286:   javascript_src_tag(joined_javascript_name, options) 
287:   else 
288:   expand_javascript_sources(sources, recursive).collect { |source| javascript_src_tag(source, options) }.join("\n") 
289:   end 
290:  end 

你也許可以修改緩存代碼和部署手動運行它。

+0

雖然我們的一些資產緩存只能在登錄頁面(管理員,買方,賣方等)生成,但wget可以工作,所以我不認爲用戶可以用簡單的wget登錄。 write_asset_file_contents方法看起來很有前途。如果有人從capistrano部署工作,這將是有趣的。 – 2010-05-11 19:55:29