Jika Anda tidak secara dinamis memuat skrip atau menandainya sebagai defer
atau async
, maka skrip dimuat dalam urutan yang ditemukan di halaman. Tidak masalah apakah itu skrip eksternal atau skrip inline - skrip dieksekusi sesuai urutan yang ditemukan pada halaman. Skrip sebaris yang datang setelah skrip eksternal ditahan hingga semua skrip eksternal yang datang sebelum mereka dimuat dan dijalankan.
Skrip Async (terlepas dari bagaimana mereka ditentukan sebagai async) memuat dan berjalan dalam urutan yang tidak terduga. Peramban memuatnya secara paralel dan bebas menjalankannya dalam urutan apa pun yang diinginkan.
Tidak ada urutan yang dapat diprediksi di antara banyak hal async. Jika seseorang membutuhkan pesanan yang dapat diprediksi, maka itu harus dikodekan dengan mendaftar untuk memuat notifikasi dari skrip async dan secara manual mengurutkan panggilan javascript ketika hal-hal yang sesuai dimuat.
Ketika tag skrip dimasukkan secara dinamis, bagaimana perilaku eksekusi akan tergantung pada browser. Anda dapat melihat bagaimana Firefox berperilaku dalam artikel referensi ini . Singkatnya, versi Firefox yang lebih baru default tag tag ditambahkan secara dinamis ke async kecuali tag script telah ditetapkan sebaliknya.
Tag skrip dengan async
dapat dijalankan segera setelah dimuat. Faktanya, browser dapat menghentikan parser dari apa pun yang sedang dilakukan dan menjalankan skrip itu. Jadi, itu benar-benar dapat berjalan hampir kapan saja. Jika skrip di-cache, mungkin akan segera berjalan. Jika skrip membutuhkan waktu untuk memuat, skrip mungkin berjalan setelah parser selesai. Satu hal yang perlu diingat async
adalah bahwa ia dapat berjalan kapan saja dan waktu itu tidak dapat diprediksi.
Tag skrip dengan defer
menunggu hingga seluruh pengurai selesai dan kemudian menjalankan semua skrip yang ditandai dengan defer
urutan mereka temui. Ini memungkinkan Anda untuk menandai beberapa skrip yang bergantung satu sama lain sebagai defer
. Mereka semua akan ditunda sampai setelah parser dokumen selesai, tetapi mereka akan mengeksekusi dalam urutan yang mereka temui menjaga dependensi mereka. Saya pikir defer
seperti skrip dijatuhkan ke dalam antrian yang akan diproses setelah parser selesai. Secara teknis, browser dapat mengunduh skrip di latar belakang kapan saja, tetapi mereka tidak akan menjalankan atau memblokir parser sampai setelah parser selesai mengurai halaman dan parsing serta menjalankan skrip inline apa pun yang tidak ditandai defer
atau async
.
Berikut kutipan dari artikel itu:
skrip yang disisipkan dieksekusi secara asinkron di IE dan WebKit, tetapi secara sinkron di Opera dan Firefox 4.0-sebelumnya.
Bagian yang relevan dari spesifikasi HTML5 (untuk peramban yang lebih baru) ada di sini . Ada banyak tulisan di sana tentang perilaku async. Jelas, spesifikasi ini tidak berlaku untuk browser yang lebih lama (atau browser yang tidak sesuai) yang perilakunya Anda mungkin harus menguji untuk menentukan.
Kutipan dari spesifikasi HTML5:
Kemudian, yang pertama dari opsi berikut yang menggambarkan situasi harus diikuti:
Jika elemen memiliki atribut src, dan elemen memiliki atribut penangguhan, dan elemen telah ditandai sebagai "parser-insert", dan elemen tersebut tidak memiliki atribut async
. Elemen harus ditambahkan ke akhir daftar skrip yang akan mengeksekusi ketika dokumen telah selesai parsing yang terkait dengan Dokumen parser yang membuat elemen.
Tugas yang ditempatkan oleh sumber tugas jaringan pada antrian tugas setelah algoritma pengambilan selesai harus mengatur flag elemen "ready to be parser-dieksekusi". Parser akan menangani mengeksekusi skrip.
Jika elemen memiliki atribut src, dan elemen tersebut telah ditandai sebagai "parser-insert", dan elemen tersebut tidak memiliki atribut async
. Elemen tersebut adalah skrip parsing-blocking yang tertunda dari Dokumen parser yang membuat elemen. (Hanya ada satu script per Dokumen pada satu waktu.)
Tugas yang ditempatkan oleh sumber tugas jaringan pada antrian tugas setelah algoritma pengambilan selesai harus mengatur flag elemen "ready to be parser-dieksekusi". Parser akan menangani mengeksekusi skrip.
Jika elemen tidak memiliki atribut src, dan elemen tersebut telah ditandai sebagai "parser-insert", dan Dokumen parser HTML atau parser XML yang membuat elemen skrip memiliki style sheet yang memblokir skrip . Elemen adalah skrip parsing-blocking tertunda dari Dokumen parser yang membuat elemen. (Hanya ada satu script per Dokumen pada satu waktu.)
Setel elemen "siap untuk dieksekusi parser". Parser akan menangani mengeksekusi skrip.
Jika elemen memiliki atribut src, tidak memiliki atribut async, dan tidak memiliki set flag "force-async" Elemen harus ditambahkan ke akhir daftar skrip yang akan dieksekusi dalam urutan secepat mungkin terkait dengan Dokumen elemen skrip pada saat mempersiapkan algoritma skrip dimulai.
Tugas yang ditempatkan oleh sumber tugas jaringan pada antrian tugas setelah algoritma pengambilan selesai harus menjalankan langkah-langkah berikut:
Jika elemen bukan sekarang elemen pertama dalam daftar skrip yang akan dieksekusi dalam urutan sesegera mungkin yang ditambahkan di atas, maka tandai elemen tersebut sebagai siap tetapi batalkan langkah-langkah ini tanpa menjalankan skrip belum.
Eksekusi: Jalankan blok skrip yang sesuai dengan elemen skrip pertama dalam daftar skrip yang akan dieksekusi dalam urutan sesegera mungkin.
Hapus elemen pertama dari daftar skrip ini yang akan dieksekusi dalam urutan sesegera mungkin.
Jika daftar skrip ini yang akan dieksekusi dalam urutan sesegera mungkin masih belum kosong dan entri pertama telah ditandai sebagai siap, kemudian melompat kembali ke langkah berlabel eksekusi.
Jika elemen memiliki atribut src, elemen harus ditambahkan ke set skrip yang akan mengeksekusi sesegera mungkin dari dokumen elemen skrip pada saat persiapan algoritma skrip dimulai.
Tugas yang ditempatkan oleh sumber tugas jaringan pada antrian tugas setelah algoritma pengambilan selesai harus menjalankan blok skrip dan kemudian menghapus elemen dari set skrip yang akan mengeksekusi sesegera mungkin.
Jika tidak, agen pengguna harus segera menjalankan blok skrip, bahkan jika skrip lain sudah dijalankan.
Bagaimana dengan skrip modul Javascript type="module"
,?
Javascript sekarang memiliki dukungan untuk memuat modul dengan sintaks seperti ini:
<script type="module">
import {addTextToBody} from './utils.mjs';
addTextToBody('Modules are pretty cool.');
</script>
Atau, dengan src
atribut:
<script type="module" src="http://somedomain.com/somescript.mjs">
</script>
Semua skrip dengan type="module"
secara otomatis diberi defer
atribut. Ini mengunduhnya secara paralel (jika tidak sebaris) dengan memuat halaman lain dan kemudian menjalankannya secara berurutan, tetapi setelah pengurai selesai.
Modul skrip juga dapat diberikan async
atribut yang akan menjalankan skrip modul inline sesegera mungkin, tidak menunggu hingga parser selesai dan tidak menunggu untuk menjalankan async
skrip dalam urutan tertentu relatif terhadap skrip lain.
Ada bagan waktu yang cukup berguna yang menunjukkan pengambilan dan pelaksanaan berbagai kombinasi skrip, termasuk skrip modul di sini dalam artikel ini: Javascript Module Loading .