6

我们正在为 JS 和 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 被重新生成。

我们每天部署多次,这对于碰巧遇到崩溃页面的任何用户来说都是可怕的。

人们有没有找到任何方法来使这更顺畅,从而保证新的缓存资产在第一个新页面加载时就在那里?

4

2 回答 2

3

AssetHat gem 解决这个确切的问题。不是在第一次加载页面时连接资产(这会增加该页面的加载时间),而是在部署时连接资产。作为奖励,gem 还缩小了您的 CSS 和 JS,从而节省了宝贵的字节。

设置后,使用非常简单:

  • Use include_css :bundle => 'admins' and include_js :bundle => 'admins' in your layout. (The bundle contents are set in a config file to keep your layout lightweight.)
  • Add rake asset_hat:minify to your deploy script. My company has been using it in production with Capistrano for about a year now.

There's more info in the readme and docs, and I'd be happy to hear any questions/ideas!

于 2011-01-03T16:45:39.833 回答
1

您可以尝试在部署期间使用 wget 预热缓存,例如(无耻地转发):

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

但是,这必须在您将符号链接切换到新部署后执行。一个可能更优雅的解决方案可能是在您的部署中手动调用资产缓存方法,尽管我不确定这是否可行。这是在 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

您可能能够修改缓存代码并在部署时手动运行它。

于 2010-05-11T09:26:46.237 回答