Frage

Wir verwenden Rails Asset-Caching für JS und CSS wie folgt aus:

<%= 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) %>

In unserer deploy nennen wir jedes Mal rake tmp:assets:clear. Das Problem ist, dass die ersten paar Seite lädt nach einem deploy ohne CSS oder js auf der Seite kommen. Ich denke, bis die im Cache gespeicherten all.js und all.css regeneriert worden sind.

Wir haben viele Male pro Tag bereitstellen und das ist beängstigend für alle Benutzer, die über eine gesprengte Seite passieren kommen.

gefunden haben die Menschen eine Möglichkeit, dies glatter zu machen, damit die neuen gecached Vermögen garantiert werden auf der ersten neuen Seite zu laden, dort zu sein?

War es hilfreich?

Lösung

Die AssetHat gem Adressen genau dieses Problem. Anstelle von Vermögenswerten zum ersten Mal eine Seite geladen wird verketten (die die Seite der Ladezeit erhöht), verkettet sie Vermögen auf deploy statt. Als Bonus minifies die Perle auch Ihre CSS und JS, die kostbare Bytes speichert.

Nach der Einrichtung Nutzung ist recht einfach:

  • Verwenden Sie include_css :bundle => 'admins' und include_js :bundle => 'admins' in Ihrem Layout. (Die Bündel Inhalte werden in einer Konfigurationsdatei festgelegt, das Layout leichten zu halten.)
  • Add rake asset_hat:minify zu Ihrem deploy Skript. Mein Unternehmen ist seit etwa einem Jahr in der Produktion mit Capistrano verwenden.

Es gibt weitere Informationen in dem readme und docs , und ich würde gerne alle Fragen / Ideen hören!

Andere Tipps

Sie könnten versuchen, den Cache während der Bereitstellung Erwärmung wget als Beispiel ( schamlos reposted ):

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

Allerdings würde dies haben ausgeführt werden, nachdem Sie Ihre Symlink auf die neue Implementierung wechseln. Eine eventuell elegantere Lösung könnte sein, die Asset-Caching-Methoden manuell in Ihrem deploy zu nennen, obwohl ich nicht sicher bin, wie möglich, das ist. Hier, wo das Caching in Rails ausgeführt wird:

# 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

Sie könnten in der Lage, den Caching-Code zu ändern, und es manuell auf deploy ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top