我们正在为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都已重新生成。
我们每天都会多次部署,这对碰巧遇到破坏页面的用户来说都是可怕的。
让人们找到任何方法使这个更顺畅,以便在第一次新页面加载时保证新的缓存资产存在吗?
答案 0 :(得分:3)
AssetHat gem解决了这个问题。不是在第一次加载页面时连接资产(这会增加页面的加载时间),而是在部署时连接资产。作为奖励,gem还可以缩小CSS和JS,从而节省宝贵的字节。
设置完成后,使用非常简单:
include_css :bundle => 'admins'
和include_js :bundle => 'admins'
。 (捆绑包内容在配置文件中设置,以保持您的布局轻量级。)rake asset_hat:minify
添加到部署脚本中。我的公司已经在Capistrano的生产中使用了大约一年了。答案 1 :(得分: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
您可以修改缓存代码并在部署时手动运行。