2010-05-04 23 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