Перерывы кэширования активов в Rails Первые несколько загрузок страницы - PullRequest
6 голосов
/ 05 мая 2010

Мы используем кэширование ресурсов Rails для JS и CSS следующим образом:

<%= 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 не будут восстановлены.

Мы развертываем много раз в день, и это пугает всех пользователей, которые случайно сталкиваются с перебором страницы.

Нашли ли люди способ сделать это более плавным, чтобы новые кэшированные ресурсы гарантированно присутствовали при первой загрузке новой страницы?

Ответы [ 2 ]

3 голосов
/ 03 января 2011

Gem AssetHat решает именно эту проблему. Вместо объединения ресурсов при первой загрузке страницы (что увеличивает время загрузки этой страницы), вместо этого она объединяет ресурсы при развертывании. В качестве бонуса драгоценный камень также минимизирует ваши CSS и JS, что экономит драгоценные байты.

После установки использование довольно простое:

  • Используйте include_css :bundle => 'admins' и include_js :bundle => 'admins' в макете. (Содержимое пакета задается в файле конфигурации, чтобы облегчить ваш макет.)
  • Добавьте rake asset_hat:minify в сценарий развертывания. Моя компания использует его в производстве с Capistrano уже около года.

В readme и документах есть больше информации, и я буду рад выслушать любые вопросы / идеи!

1 голос
/ 11 мая 2010

Вы можете попробовать согреть кеш во время развертывания, используя, например, 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

Возможно, вы сможете изменить код кэширования и запустить его вручную при развертывании.

...