9

Sau khi triển khai ứng dụng Rails 2.3.x -> 3.1 (rc4) được nâng cấp lên môi trường thử nghiệm của chúng tôi chiều nay, tất cả các tệp định kiểu và tệp JavaScript của chúng tôi đều trả về lỗi 404. Chúng tôi đã thêm các tài sản rake: biên dịch trước nhiệm vụ của kịch bản hậu triển khai của chúng tôi và mất một thời gian để xác định lý do tại sao thư mục tài sản không có các tệp được biên dịch trước mà chúng tôi mong đợi.Đường ray 3.1 đường dẫn nội dung - thiếu tệp từ công khai/nội dung - tại sao đây không phải là mặc định?

Cuối cùng, các tệp không được biên dịch vì dường như chỉ các tệp application.css và application.js (+ non JS/CSS) được xử lý theo mặc định.

Chúng tôi cần phải thay đổi giá trị cấu hình sau đây như sau:

config.assets.precompile += %w(*.js *.css) 

Câu hỏi: tại sao không phải là này mặc định?

Tôi đã dự kiến ​​rằng mọi thứ không cần thiết để xử lý dưới dạng tệp kê khai sẽ chỉ được sao chép vào công khai/tài sản. Phần lớn những gì tôi đã đọc trên đường ống nội dung về cơ bản là "gắn tài sản của bạn vào ứng dụng/tài sản, định cấu hình tệp kê khai và nó chỉ hoạt động". Kể từ khi các tài sản: nhiệm vụ biên dịch trước đã không tiết lộ bất kỳ thông tin về những gì nó đã làm, phải mất một thời gian để xác định rằng nó chỉ là không nhìn vào các tập tin, chúng tôi nghĩ rằng nó sẽ.

Có bất kỳ lý do nào khiến đây không phải là một giá trị tốt cho cấu hình biên dịch trước không?

Cảm ơn!

Trả lời

9

Ý tưởng là để tất cả JavaScript và CSS của bạn luôn được tải trong một lần chụp, thay vì tải các bit và phần khi bạn di chuyển. Bằng cách đó bạn luôn có 'thế giới' được tải và sẵn sàng để làm việc với, thay vì phải bao gồm toàn bộ một loạt các tệp riêng lẻ ở đây và ở đó.

Đó là một chút tải lớn hơn 'phía trước', nhưng sau đó trình duyệt sẽ tiếp tục tải tất cả javascript từ bộ nhớ cache. Vì vậy, tốc độ cảm nhận của trang web sẽ tăng tốc do có mọi thứ được lưu trữ và sẵn sàng để đi sau yêu cầu đầu tiên.

Đây là một quyết định gây tranh cãi bao gồm cho Rails, nhưng do đó bao gồm CoffeeScript theo mặc định. Rails luôn luôn là một khuôn khổ được đánh giá theo cách đó.

+0

Cảm ơn, Chris, đã trả lời. Tôi hiểu rằng việc cắt giảm các yêu cầu HTTP về hiệu quả là rất có ý nghĩa, nhưng tôi nghĩ hầu hết các ứng dụng đều có CSS ​​được phân đoạn thành ít nhất các bảng định kiểu nội bộ/bên ngoài và các tệp JavaScript mô-đun. Nó chỉ có vẻ như một sự thay đổi thực sự từ cách mà phần còn lại của khung Rails đề cập đến mọi thứ, nhưng dựa trên các giá trị mặc định, nó chắc chắn xuất hiện mà phải là suy nghĩ. – shedd

+0

Vâng, người ta chắc chắn sẽ muốn cắt các tệp của họ thành các tệp mô-đun. Ý tưởng là app.js và application.css có "bao gồm" kéo tất cả javascript và css cụ thể vào các thư mục đó (nếu bạn nhìn vào các tệp đó, bạn sẽ tìm thấy chỉ thị 'require_tree.' mọi thứ trong thư mục đó và tất cả đều là trẻ em). –

+0

Hầu hết các ứng dụng Rails thực sự không có CSS ​​được phân đoạn thành các bảng định kiểu khác nhau - ít nhất là được phân phối tới máy khách. CSS nguồn (và JS) riêng biệt được biên dịch thành một application.css (hoặc .js) tổng hợp theo đường ống nội dung. Tuy nhiên, tôi có xu hướng đồng ý với bạn về những gì Rails mặc định là - nếu (* .js * .css) là mặc định, nó vẫn hoạt động tốt hoặc cách được đề xuất để thực hiện, nhưng cũng sẽ hoạt động những gì bạn đang cố gắng làm. Tôi nghĩ các phiên bản trước của Rails thực sự đã hoạt động như bạn đề nghị, nhưng họ đã thay đổi nó gần đây hơn, có lẽ vì những lý do tốt mà chúng tôi không nghĩ đến. – jrochkind

0

đường ống dựa trên sprockets mới biên dịch tất cả các tệp trong/asssets/stylesheets và/assets/javascripts được biên dịch vào application.css và application.js, theo mặc định.

Trong chế độ xem của bạn, bạn chỉ cần liên kết các tệp ứng dụng, sprockets sẽ xử lý phần còn lại.

Cập nhật: Vâng, bạn không cần phải biến tất cả thành một tệp ... Bạn có thể có shared.js, secure.js và public.js và yêu cầu chúng bao gồm các phần mà chúng cần. ..

Hãy coi chúng không phải là tệp javascript, nhưng tệp kê khai thiết lập nhóm tệp javascript mà sau đó bạn có thể bao gồm dưới dạng nhóm có một đơn javascript_include_tag. Mặc dù mặc định là bao gồm mọi thứ trong thư mục vào một tệp duy nhất, bạn luôn có thể chọn và chọn nội dung cần đưa vào và những gì không có.

Tác vụ 'biên dịch trước' chỉ cần chạy các tệp kê khai đó và biên dịch nhiều tệp thành một, trong khi tập lệnh trước khi xử lý và sass hoặc cà phê chạy trên đó.

+0

Cảm ơn, Colin. Đúng, tôi đã tìm ra điều đó, nhưng câu hỏi đã được thử nghiệm hơn một chút. – shedd

+0

cũng đã cập nhật bài đăng để có thông tin chi tiết hơn một chút – colinross

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