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 が再生成されるまで推測します。

私たちは 1 日に何度も展開していますが、これは、たまたま壊れたページに出くわしたユーザーにとって恐ろしいことです。

新しいキャッシュされたアセットが最初の新しいページの読み込み時にそこにあることが保証されるように、これをよりスムーズにする方法を人々は見つけましたか?

4

2 に答える 2

3

AssetHat gem はまさにこの問題に対処します。ページが最初にロードされるときにアセットを連結する (そのページのロード時間が長くなります) 代わりに、デプロイ時にアセットを連結します。おまけとして、gem は CSS と JS も縮小し、貴重なバイトを節約します。

セットアップ後の使用方法は非常に簡単です。

  • include_css :bundle => 'admins'レイアウトでandを使用include_js :bundle => 'admins'します。(バンドルの内容は、レイアウトを軽量に保つために構成ファイルで設定されます。)
  • rake asset_hat:minifyデプロイ スクリプトに追加します。私の会社では、約 1 年間、Capistrano で本番環境で使用しています。

readmedocsに詳細が記載されています。質問やアイデアがあれば喜んでお聞かせください。

于 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 に答える