Saya pikir Jake Archibald memberi kami beberapa wawasan pada tahun 2013 yang mungkin menambah lebih positif pada topik:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Cawan suci memiliki set unduhan skrip segera tanpa memblokir rendering dan mengeksekusi sesegera mungkin dalam urutan mereka ditambahkan. Sayangnya HTML membenci Anda dan tidak akan membiarkan Anda melakukannya.
(...)
Jawabannya sebenarnya dalam spesifikasi HTML5, meskipun tersembunyi di bagian bawah bagian pemuatan skrip. " Atribut async IDL mengontrol apakah elemen akan menjalankan asynchronous atau tidak. Jika flag" force-async "elemen diatur, maka, pada saat mendapatkan, atribut IDL async harus mengembalikan true, dan pada pengaturan," force-async " bendera harus terlebih dahulu tidak disetel ... ".
(...)
Script yang dibuat secara dinamis dan ditambahkan ke dokumen async secara default , mereka tidak memblokir rendering dan mengeksekusi segera setelah mereka unduh, yang berarti mereka bisa keluar dalam urutan yang salah. Namun, kami dapat secara eksplisit menandainya sebagai bukan asinkron:
[
'//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);
});
Ini memberi skrip kami campuran perilaku yang tidak dapat dicapai dengan HTML biasa. Dengan secara eksplisit bukan async, skrip ditambahkan ke antrian eksekusi, antrian yang sama dengan yang ditambahkan ke dalam contoh HTML-polos pertama kami. Namun, dengan dibuat secara dinamis, mereka dieksekusi di luar parsing dokumen, jadi rendering tidak diblokir saat diunduh (jangan bingung memuat skrip tidak-async dengan sinkronisasi XHR, yang tidak pernah merupakan hal yang baik).
Script di atas harus dimasukkan secara inline di bagian atas halaman, antrian unduhan skrip sesegera mungkin tanpa mengganggu rendering progresif, dan dieksekusi sesegera mungkin dalam urutan yang Anda tentukan. “2.js” bebas untuk diunduh sebelum “1.js”, tetapi itu tidak akan dijalankan sampai “1.js” berhasil diunduh dan dieksekusi, atau gagal melakukan keduanya. Hore! async-download tetapi memerintahkan-eksekusi !
Namun, ini mungkin bukan cara tercepat untuk memuat skrip:
(...) Dengan contoh di atas browser harus mengurai dan mengeksekusi skrip untuk menemukan skrip yang akan diunduh. Ini menyembunyikan skrip Anda dari preload scanner. Peramban menggunakan pemindai ini untuk menemukan sumber daya pada halaman yang akan Anda kunjungi berikutnya, atau menemukan sumber daya halaman saat parser diblokir oleh sumber daya lain.
Kami dapat menambahkan penemuan kembali dengan menempatkan ini di kepala dokumen:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Ini memberitahu browser bahwa halaman membutuhkan 1.js dan 2.js. tautan [rel = subresource] mirip dengan tautan [rel = prefetch], tetapi dengan semantik yang berbeda. Sayangnya saat ini hanya didukung di Chrome, dan Anda harus menyatakan skrip mana yang akan dimuat dua kali, sekali melalui elemen tautan, dan sekali lagi di skrip Anda.
Koreksi: Saya awalnya menyatakan ini diambil oleh pemindai preload, tidak, diambil oleh parser biasa. Namun, preload scanner bisa mengambil ini, hanya saja belum, sedangkan skrip yang dimasukkan oleh kode yang dapat dieksekusi tidak pernah dapat dimuat sebelumnya. Terima kasih kepada Yoav Weiss yang mengoreksi saya di komentar.
async
baru (ish), tetapidefer
telah menjadi bagian dari IE sejak IE4.defer
telah ditambahkan ke browser lain jauh lebih baru, tetapi versi yang lebih lama dari browser tersebut cenderung kurang banyak berkeliaran.