2010-05-04 17 views
6

Używamy Rails buforowania zasobów dla JS i CSS tak:Szyny aktywami buforowanie Breaks kilku pierwszych stron ładunki

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

W naszym wdrożeniu nazywamy rake tmp:assets:clear każdym razem. Problem polega na tym, że pierwsza strona ładuje się po wdrożeniu bez css lub js na stronie. Zgaduję, dopóki buforowane pliki all.js i all.css nie zostaną zregenerowane.

Wdrażamy wiele razy dziennie i jest to przerażające dla wszystkich użytkowników, którzy natrafili na zniszczoną stronę.

Czy ludzie znaleźli sposób, aby to wygładzić, aby nowe zasoby z pamięci podręcznej były tam na pierwszym ładowaniu nowej strony?

+0

Kilka pytań: 1) Czy masz wiele serwerów aplikacji na różnych komputerach? 2) Jaka jest linia pamięci podręcznej dla CSS w szablonach? – scottd

+0

Witaj Scott. Wszystkie serwery aplikacji na jednym komputerze. Oto przykład linii cache cache: '<% = stylesheet_link_tag 'reset', 'global', 'admins', 'autouzupełnianie', 'date_input', 'tablesorter', 'partners', 'jqmodal',: media = > 'screen',: cache => set_asset_cache (: admins)%> 'Mamy osobne dla administratorów, kupujących, sprzedawców, stron docelowych itp. (po jednym na układ). Dzięki! –

Odpowiedz

3

Klejnot AssetHat rozwiązuje ten problem. Zamiast łączenia zasobów za pierwszym razem, gdy strona jest ładowana (co zwiększa czas ładowania strony), łączy ona zasoby przy wdrażaniu. Jako bonus, gem zminimalizuje twoje CSS i JS, co pozwala zaoszczędzić cenne bajty.

Po skonfigurowaniu, użycie jest bardzo proste:

  • Zastosowanie include_css :bundle => 'admins' i include_js :bundle => 'admins' w układzie. (Zawartość pakietu jest ustawiona w pliku konfiguracyjnym, aby zachować lekkość układu.)
  • Dodaj rake asset_hat:minify do skryptu wdrażania. Moja firma używa go w produkcji z Capistrano już od około roku.

Więcej informacji można znaleźć pod numerami readme i docs. Z przyjemnością odpowiem na wszelkie pytania i pomysły!

1

można spróbować ocieplenie cache podczas wdrażania za pomocą wget, jako przykład (shamelessly reposted):

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

Jednak byłoby to muszą być wykonywane po włączeniu komputera dowiązania do nowej instalacji. Ewentualnie bardziej eleganckim rozwiązaniem może być ręczne wywołanie metod buforowania zasobów w twoim wdrożeniu, chociaż nie jestem pewien, jak to jest możliwe. 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 

Możesz być w stanie zmodyfikować kod buforowania i uruchomić go ręcznie na wdrożenia.

+0

Wget może działać, chociaż niektóre z naszych pamięci podręcznych zasobów są generowane tylko na zalogowanych stronach (jedna dla administratorów, kupujących, sprzedających itp.), Więc nie sądzę, aby użycie mogło się zalogować za pomocą prostego wget. Metoda write_asset_file_contents wygląda obiecująco. Jeśli ktoś ma taką pracę z użyciem capistrano, byłoby to interesujące. –