2010-05-04 29 views
6

Chúng tôi đang sử dụng bộ nhớ đệm Rails tài sản cho JS và CSS như thế này:Rails Asset Caching Breaks vài tải trang đầu tiên

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

Trong triển khai, chúng tôi gọi rake tmp:assets:clear mỗi lần. Vấn đề là trang đầu tiên tải sau khi triển khai không có css hoặc js trên trang. Tôi đoán cho đến khi all.js và all.css được lưu trong bộ nhớ cache đã được tạo lại.

Chúng tôi triển khai nhiều lần mỗi ngày và điều này thật đáng sợ đối với bất kỳ người dùng nào tình cờ gặp phải trang bị busted.

Mọi người đã tìm thấy bất kỳ cách nào để làm cho điều này mượt mà hơn để các nội dung được lưu trong bộ nhớ cache mới được đảm bảo có trên trang tải mới đầu tiên không?

+0

Một số câu hỏi: 1) Bạn có nhiều máy chủ ứng dụng trên các máy khác nhau không? 2) Đường bộ nhớ cache cho CSS trong các mẫu là gì? – scottd

+0

Xin chào Scott. Tất cả các máy chủ ứng dụng trên một máy. Dưới đây là ví dụ về dòng bộ nhớ cache css: '<% = stylesheet_link_tag 'reset', 'global', 'admins', 'autocomplete', 'date_input', 'tablesorter', 'partners', 'jqmodal',: media = > 'screen',: cache => set_asset_cache (: quản trị viên)%> 'Chúng tôi có những người riêng biệt cho quản trị viên, người mua, người bán, trang đích, v.v ... (mỗi bố cục). Cảm ơn! –

Trả lời

3

Đá quý AssetHat giải quyết vấn đề chính xác này. Thay vì ghép nối các tài sản lần đầu tiên một trang được tải (làm tăng thời gian tải của trang đó), nó kết hợp các tài sản được triển khai thay thế. Như một phần thưởng, gem cũng làm giảm thiểu CSS và JS của bạn, giúp tiết kiệm byte quý giá.

Sau khi cài đặt, sử dụng khá đơn giản:

  • Sử dụng include_css :bundle => 'admins'include_js :bundle => 'admins' trong cách bố trí của bạn. (Nội dung gói được đặt trong tệp cấu hình để giữ bố cục của bạn gọn nhẹ.)
  • Thêm rake asset_hat:minify vào tập lệnh triển khai của bạn. Công ty của tôi đã sử dụng nó trong sản xuất với Capistrano trong khoảng một năm nay.

Có thêm thông tin trong số readmedocs và tôi rất vui khi được nghe bất kỳ câu hỏi/ý tưởng nào!

1

Bạn có thể thử làm nóng bộ nhớ cache trong việc triển khai sử dụng wget, như một ví dụ (shamelessly reposted):

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

Tuy nhiên, điều này sẽ phải được thực hiện sau khi bạn chuyển liên kết tượng trưng của bạn để triển khai mới của bạn. Một giải pháp có thể thanh lịch hơn có thể là gọi các phương thức lưu trữ nội dung theo cách thủ công trong triển khai của bạn, mặc dù tôi không chắc chắn về tính khả thi của nó. 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 

Bạn có thể sửa đổi mã bộ nhớ đệm và chạy thủ công khi triển khai.

+0

Các wget có thể làm việc, mặc dù một số tài sản của chúng tôi lưu trữ chỉ được tạo ra trên các trang đăng nhập (một cho quản trị viên, người mua, người bán, vv) vì vậy tôi không nghĩ rằng một sử dụng có thể đăng nhập với một wget đơn giản. Phương thức write_asset_file_contents trông đầy hứa hẹn. Nếu ai đó làm việc đó từ việc triển khai capistrano thì sẽ rất thú vị. –

Các vấn đề liên quan