Tôi nghĩ Jake Archibald đã trình bày cho chúng tôi một số thông tin chuyên sâu về năm 2013 có thể tăng thêm tính tích cực cho chủ đề này:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Chén thánh đang có một tập hợp các tập lệnh tải xuống ngay lập tức mà không chặn kết xuất và thực thi càng sớm càng tốt theo thứ tự chúng được thêm vào. Thật không may, HTML ghét bạn và sẽ không cho phép bạn làm điều đó.
(...)
Câu trả lời thực sự nằm ở thông số HTML5, mặc dù nó bị ẩn ở cuối phần tải tập lệnh. " Thuộc tính IDL async kiểm soát xem phần tử có thực thi không đồng bộ hay không. Nếu cờ" bắt buộc không đồng bộ "của phần tử được đặt, thì khi nhận, thuộc tính IDL async phải trả về đúng và khi cài đặt," bắt buộc không đồng bộ " trước tiên phải bỏ cờ ".
(...)
Các tập lệnh được tạo động và thêm vào tài liệu theo mặc định là không đồng bộ , chúng không chặn kết xuất và thực thi ngay khi chúng tải xuống, có nghĩa là chúng có thể xuất hiện theo thứ tự sai. Tuy nhiên, chúng tôi có thể đánh dấu rõ ràng chúng là không đồng bộ:
[
'//other-domain.com/1.js',
'2.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
Điều này mang lại cho các tập lệnh của chúng tôi một hỗn hợp các hành vi không thể đạt được với HTML đơn giản. Bằng cách không rõ ràng không đồng bộ, các tập lệnh được thêm vào hàng đợi thực thi, cùng hàng đợi chúng được thêm vào trong ví dụ HTML đơn giản đầu tiên của chúng tôi. Tuy nhiên, bằng cách được tạo động, chúng được thực hiện bên ngoài phân tích tài liệu, do đó kết xuất không bị chặn trong khi chúng được tải xuống (đừng nhầm lẫn việc tải tập lệnh không đồng bộ với XHR đồng bộ hóa, điều này không bao giờ là một điều tốt).
Tập lệnh ở trên phải được đưa vào nội tuyến trong phần đầu của trang, xếp hàng tải xuống tập lệnh càng sớm càng tốt mà không làm gián đoạn kết xuất liên tục và thực thi càng sớm càng tốt theo thứ tự bạn đã chỉ định. Bạn có thể tải xuống miễn phí trước khi tải xuống 1.js, nhưng nó sẽ không được thực thi cho đến khi mà 1. 1. 1.ss đã tải xuống và thực hiện thành công hoặc không thực hiện được. Tiếng hoan hô! async-download nhưng thực hiện theo lệnh !
Tuy nhiên, đây có thể không phải là cách nhanh nhất để tải tập lệnh:
(...) Với ví dụ trên, trình duyệt phải phân tích cú pháp và thực thi tập lệnh để khám phá tập lệnh nào sẽ tải xuống. Điều này ẩn tập lệnh của bạn từ máy quét tải trước. Các trình duyệt sử dụng các máy quét này để khám phá các tài nguyên trên các trang bạn có thể truy cập tiếp theo hoặc khám phá các tài nguyên trang trong khi trình phân tích cú pháp bị chặn bởi một tài nguyên khác.
Chúng tôi có thể thêm khả năng khám phá trở lại bằng cách đặt phần này vào phần đầu của tài liệu:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Điều này cho trình duyệt biết trang cần 1.js và 2.js. link [rel = subresource] tương tự như link [rel = prefetch], nhưng với ngữ nghĩa khác nhau. Thật không may, hiện tại nó chỉ được hỗ trợ trong Chrome và bạn phải khai báo tập lệnh nào sẽ tải hai lần, một lần qua các thành phần liên kết và một lần nữa trong tập lệnh của bạn.
Sửa chữa: Ban đầu tôi đã nói rằng những thứ này được chọn bởi trình quét trước, chúng không phải, chúng được chọn bởi trình phân tích cú pháp thông thường. Tuy nhiên, trình quét tải trước có thể chọn những thứ này, nhưng nó vẫn chưa có, trong khi các tập lệnh được bao gồm bởi mã thực thi không bao giờ có thể được tải trước. Cảm ơn Yoav Weiss đã sửa chữa tôi trong các bình luận.
async
là mới (ish), nhưngdefer
đã là một phần của IE kể từ IE4.defer
đã được thêm vào các trình duyệt khác gần đây hơn, nhưng các phiên bản cũ hơn của các trình duyệt đó có xu hướng ít gặp hơn rất nhiều.