Komut dosyalarını dinamik olarak yüklemiyorsanız veya bunları olarak işaretlemiyorsanız defer
veyaasync
, o zaman komut sayfasında karşılaşılan sırayla yüklenir. Harici bir komut dosyası mı yoksa satır içi bir komut dosyası mı olduğu önemli değil - sayfada karşılaştıkları sırayla yürütülürler. Harici komut dosyalarından sonra gelen satır içi komut dosyaları, yüklenmeden ve çalıştırılmadan önce gelen tüm dış komut dosyalarına kadar tutulur.
Zaman uyumsuz komut dosyaları (nasıl zaman uyumsuz olarak belirtildiklerinden bağımsız olarak) öngörülemeyen bir sırada yüklenir ve çalıştırılır. Tarayıcı bunları paralel olarak yükler ve istediği sırayla çalıştırmak ücretsizdir.
Birden fazla eşzamansız şey arasında tahmin edilebilir bir düzen yoktur. Tahmin edilebilir bir sipariş gerekiyorsa, uygun olmayan şeyler yüklendiğinde zaman uyumsuz komut dosyalarından yük bildirimleri için kayıt ve el ile sıralı javascript çağrılarını kodlayarak kodlanması gerekir.
Bir komut dosyası etiketi dinamik olarak eklendiğinde, yürütme sırasının nasıl davrandığı tarayıcıya bağlı olacaktır. Bu referans makalede Firefox'un nasıl davrandığını görebilirsiniz . Özetle, Firefox'un daha yeni sürümleri, komut dosyası etiketi başka türlü ayarlanmadığı sürece senkronize olarak dinamik olarak eklenen bir komut dosyası etiketini varsayılan olarak ayarlar.
İle bir komut dosyası etiketi async
yüklenir yüklenmez çalıştırılabilir. Aslında, tarayıcı ayrıştırıcıyı yaptığı her şeyden duraklatabilir ve o komut dosyasını çalıştırabilir. Yani, neredeyse her zaman çalışabilir. Komut dosyası önbelleğe alındıysa, hemen çalıştırılabilir. Betiğin yüklenmesi biraz zaman alırsa, ayrıştırıcı tamamlandıktan sonra çalıştırılabilir. Hatırlanması gereken tek şey, async
her zaman çalışabileceği ve o zamanın öngörülebilir olmadığıdır.
İle bir komut dosyası etiketi defer
Ayrıştırıcının tamamı tamamlanıncaya kadar bekleyen daha sonra işaretlenen tüm komut dosyalarını karşılandıkları defer
sırayla çalıştırır . Bu, birbirine bağlı olan birkaç komut dosyasını işaretlemenizi sağlar defer
. Hepsi belge ayrıştırıcısı bitene kadar ertelenecek, ancak bağımlılıklarını koruyarak karşılaştıkları sırayla yürütüleceklerdir. defer
Scriptler ayrıştırıcı tamamlandıktan sonra işlenecek bir sıraya düşüyor gibi düşünüyorum . Teknik olarak, tarayıcı her an arka planda komut dosyalarını indirirken olabilir, ancak bunlar yürütmek veya ayrıştırıcı sayfasını ayrıştırma ve ayrıştırma ve işaretlenmemiş tüm satır içi komut dosyalarını çalıştırarak yapılır sonrasına kadar ayrıştırıcı engellemez defer
ya async
.
İşte bu makaleden bir alıntı:
betiğe eklenen komut dosyaları IE ve WebKit'te eşzamansız olarak, Opera ve 4.0 öncesi Firefox'ta eşzamanlı olarak yürütülür.
HTML5 spesifikasyonunun ilgili bölümü (daha yeni uyumlu tarayıcılar için) burada . Orada zaman uyumsuz davranış hakkında çok şey var. Açıkçası, bu özellik, davranışlarını belirlemek için muhtemelen test etmeniz gereken eski tarayıcılar (veya hatalı uyumlu tarayıcılar) için geçerli değildir.
HTML5 spesifikasyonundan bir fiyat teklifi:
Ardından, durumu tanımlayan aşağıdaki seçeneklerden ilkine uyulmalıdır:
Öğenin src özniteliği varsa ve öğenin erteleme özniteliği varsa ve öğe "ayrıştırıcıya eklenen" olarak işaretlenmişse ve öğenin zaman uyumsuz bir özniteliği yoksa
Öğe, listenin sonuna eklenmelidir. belge öğeyi oluşturan ayrıştırıcının Dokümanı ile ilişkili ayrıştırma bittiğinde yürütülecek komut dosyaları.
Getirme algoritması tamamlandıktan sonra ağ oluşturma görev kaynağının görev kuyruğuna yerleştirdiği görev, öğenin "ayrıştırıcı tarafından yürütülmeye hazır" bayrağını ayarlamalıdır. Ayrıştırıcı komut dosyasının yürütülmesini yönetir.
Öğenin src özniteliği varsa ve öğe "ayrıştırıcıya eklenen" olarak işaretlenmişse ve öğenin async özniteliği yoksa
Öğe, öğeyi oluşturan ayrıştırıcının Dokümanının bekleyen ayrıştırma-engelleme komut dosyasıdır. (Belge başına aynı anda yalnızca bir tane komut dosyası olabilir.)
Getirme algoritması tamamlandıktan sonra ağ oluşturma görev kaynağının görev kuyruğuna yerleştirdiği görev, öğenin "ayrıştırıcı tarafından yürütülmeye hazır" bayrağını ayarlamalıdır. Ayrıştırıcı komut dosyasının yürütülmesini yönetir.
Eleman bir src özelliğini yok ve eleman olarak işaretlendi "Eğer ayrıştırıcı tarafından eklenmiş" ve komut dosyası elemanı oluşturulan HTML ayrıştırıcı veya XML ayrıştırıcı Belge komut engelleyen bir stil sayfası olan elementtir öğeyi oluşturan ayrıştırıcının Belgesinin ayrıştırma-engelleme komut dosyası bekleniyor. (Belge başına aynı anda yalnızca bir tane komut dosyası olabilir.)
Öğenin "ayrıştırıcı tarafından yürütülmeye hazır" bayrağını ayarlayın. Ayrıştırıcı komut dosyasının yürütülmesini yönetir.
Öğenin src özniteliği varsa, eşzamansız özniteliği yoksa ve "zorla eşzamansız" bayrak kümesi yoksa Öğe, mümkün olan en kısa sürede yürütülecek komut dizileri listesinin sonuna eklenmelidir bir komut dosyası algoritması hazırlandığı sırada komut dosyası öğesinin Belgesi ile.
Getirme algoritması tamamlandıktan sonra ağ görevi kaynağının görev kuyruğuna yerleştirdiği görev aşağıdaki adımları çalıştırmalıdır:
Öğe şimdi, yukarıda eklendiği en kısa sürede sırayla yürütülecek komut dosyaları listesindeki ilk öğe değilse , öğeyi hazır olarak işaretleyin, ancak henüz komut dosyasını çalıştırmadan bu adımları iptal edin.
Yürütme: Bu komut dosyası listesindeki ilk komut dosyası öğesine karşılık gelen komut dosyasını, en kısa sürede sırayla yürütür.
En kısa sürede sırayla yürütülecek olan komut dosyaları listesinden ilk öğeyi kaldırın.
Mümkün olan en kısa sürede yürütülecek komut dosyaları listesi hala boş değilse ve ilk giriş zaten hazır olarak işaretlenmişse yürütme etiketli adıma geri dönün.
Öğenin src özniteliği varsa Öğe, bir komut dosyası hazırlama algoritması başlatıldığı sırada, komut dosyası öğesinin Belgesini mümkün olan en kısa sürede yürütecek olan komut dosyası kümesine eklenmelidir.
Getirme algoritması tamamlandıktan sonra ağ görev kaynağının görev kuyruğuna yerleştirdiği görevin komut dosyası bloğunu yürütmesi ve öğeyi mümkün olan en kısa zamanda yürütülecek komut dizisi kümesinden kaldırması gerekir.
Aksi takdirde , diğer komut dosyaları zaten yürütülüyor olsa bile, kullanıcı aracısı komut dosyası bloğunu derhal yürütmelidir.
Javascript modülü komut dosyalarına ne dersiniz type="module"
?
Javascript artık aşağıdaki gibi sözdizimi ile modül yükleme desteği sunuyor:
<script type="module">
import {addTextToBody} from './utils.mjs';
addTextToBody('Modules are pretty cool.');
</script>
Veya şu src
nitelikle:
<script type="module" src="http://somedomain.com/somescript.mjs">
</script>
İle birlikte type="module"
olan tüm komut dosyalarına otomatik olarak defer
öznitelik verilir . Bu, bunları sayfanın diğer yüklenmesiyle paralel olarak (satır içi değilse) indirir ve ardından sırayla çalıştırır, ancak ayrıştırıcı tamamlandıktan sonra.
Modül komut dosyalarına async
satır içi modül komut dosyalarını en kısa zamanda çalıştıracak, ayrıştırıcı tamamlanana kadar beklemeyecek ve async
komut dosyasını diğer komut dosyalarına göre belirli bir sırada çalıştırmayı beklemeyecek özellik de verilebilir .
Bu makalede modül komut dosyaları da dahil olmak üzere farklı komut dosyası birleşimlerinin getirilmesini ve yürütülmesini gösteren oldukça kullanışlı bir zaman çizelgesi grafiği vardır: Javascript Modülü Yükleme .