Tôi thường gắn JS của tôi ở phần dưới phần thân của tôi (theo HTML5Boilerplate), nhưng từ TurboLinks, sẽ là on by default trong Rails 4, tải lại phần thân (và tựa đề) theo mọi yêu cầu, có ý nghĩa không để đặt JS của tôi trong đầu từ bây giờ? Có hướng dẫn hay thực hành tốt nhất về điều này chưa?Rails 4 + Turbolinks: JS ở đầu hoặc ở dưới cùng của cơ thể?
Trả lời
Cũng được biên dịch trước application.js (theo đường ống nội dung) được bật và ở đầu theo mặc định. Lý do là ngay cả khi js được tải trước phần còn lại của trang, vì js luôn giống nhau, nó sẽ được tải từ bộ nhớ cache từ yêu cầu thứ hai trở đi, vì vậy không có lý do thực sự nào để phân phối nó ở dưới cùng của cơ thể nữa.
Nếu bạn đang sử dụng Turbolinks 5, bây giờ bạn có thể đặt turbolinks ở dưới cùng của cơ thể của bạn (và làm theo các thực hành tốt nhất cho web dev để hiển thị một trang). Điều này cũng giúp với SEO bao giờ nên hơi. Chỉ cần thêm kịch bản của bạn để dưới cùng của cơ thể của bạn và thêm
data-turbolinks-eval="false"
vào thẻ script của bạn. Điều này sẽ ngăn chặn turbolinks đánh giá sau tải trang ban đầu. Dưới đây là cách nó được thực hiện với sự javascript_include_tag
:
<%= javascript_include_tag 'application', 'data-turbolinks-eval' => 'false'%>
Sau đó, chỉ cần sử dụng
$(document).on('turbolinks:load', function() { // code to be executed when use changes pages });
cảm ơn, đó là đủ tốt cho tôi :) – stephenmurdoch
nó lưu trữ các tập tin, nhưng nó vẫn cần phải chờ đợi cho js để tải (nếu toàn bộ trang được tải), phải không? Sẽ không phải là một thuộc tính 'async' cung cấp những lợi ích của việc thêm vào phía dưới mà không được tải lại bởi Turbolinks? – michelpm
Với các tài sản dựa trên đường ray bình thường, bạn sẽ có một js được nén, rút gọn thường được lưu trữ trong bộ nhớ cache của trình duyệt. Thời gian tải (như trong "tải mã") vẫn là một phần của tổng số tải xuống + chờ + thời gian tải cho js. Trong mọi trường hợp, TL chỉ tải toàn bộ trang ở chế độ nền, sau đó lấy các phần tử (tiêu đề, nội dung, v.v.) và hoán đổi chúng vào trang của bạn thay vì trang hiện tại. Đó là một hành vi đơn giản, có thể hoặc không thể dẫn đến tốc độ lớn hơn. Trong ví dụ thế giới thực, tôi thấy sprockets biên dịch javascript trong đầu quá đủ. – rewritten