Sanırım Jake Archibald 2013'te bize konuya daha da fazla pozitiflik katabilecek bazı görüşler sundu:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Kutsal kâse, oluşturmayı engellemeden hemen bir dizi komut dosyası indiriyor ve eklendikleri sırayla en kısa sürede yürütüyor. Ne yazık ki HTML sizden nefret ediyor ve bunu yapmanıza izin vermiyor.
(...)
Komut dosyası yükleme bölümünün altında gizlenmiş olmasına rağmen, cevap aslında HTML5 spesifikasyonundadır. " Eşzamansız IDL özniteliği, öğenin eşzamansız olarak yürütülüp yürütülmeyeceğini denetler. Öğenin" zaman uyumsuz "bayrağı ayarlanırsa, alma işleminde, zaman uyumsuz IDL özelliğinin true değerini ve ayarlandığında" zorla senkronize edilmemesi "gerekir bayrak önce ayarlanmamış olmalıdır… ".
(...)
Dinamik olarak oluşturulan ve belgeye eklenen komut dosyaları varsayılan olarak zaman uyumsuzdur, indirilmeleri engellemez ve yürütülmez çalıştırılmaz, yani yanlış sırada ortaya çıkabilirler. Ancak, bunları açıkça eşzamansız değil olarak işaretleyebiliriz:
[
'//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);
});
Bu, komut dosyalarımıza düz HTML ile gerçekleştirilemeyen bir davranış karışımı sağlar. Açıkça zaman uyumsuz olmamakla birlikte, komut dosyaları bir yürütme kuyruğuna, ilk düz HTML örneğimizde eklendikleri kuyruğa eklenir. Bununla birlikte, dinamik olarak oluşturularak, belge ayrıştırma işleminin dışında yürütülürler, bu nedenle oluşturma işlemi indirildiklerinde engellenmez (zaman uyumsuz komut dosyası yüklemesini XHR senkronizasyonu ile karıştırmayın, bu asla iyi bir şey değildir).
Yukarıdaki komut dosyası sayfaların başına satır içi olarak eklenmeli, komut dosyası yüklemelerini aşamalı oluşturmayı kesintiye uğratmadan mümkün olan en kısa sürede kuyruğa almalı ve belirttiğiniz sırayla en kısa sürede yürütülmelidir. “2.js”, “1.js” den önce ücretsiz olarak indirilebilir, ancak “1.js” başarıyla indirilip çalıştırılana veya hiçbiri başarısız oluncaya kadar yürütülmez. Yaşa! async-download ama sipariş-yürütme !
Yine de, komut dosyalarını yüklemenin en hızlı yolu bu olmayabilir:
(...) Yukarıdaki örnekte, hangi komut dosyalarının indirileceğini bulmak için tarayıcının betiği ayrıştırması ve yürütmesi gerekir. Bu, komut dosyalarınızı önceden yüklenmiş tarayıcılardan gizler. Tarayıcılar bu tarayıcıları bir sonraki ziyaret etme olasılığınızdaki sayfalardaki kaynakları keşfetmek veya ayrıştırıcı başka bir kaynak tarafından engellenirken sayfa kaynaklarını keşfetmek için kullanır.
Bunu belgenin başına koyarak keşfedilebilirliği tekrar ekleyebiliriz:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Bu tarayıcıya sayfanın 1.js ve 2.js'ye ihtiyacı olduğunu söyler. link [rel = subresource], link [rel = prefetch] 'e benzer, ancak farklı anlambilim içerir. Maalesef şu anda yalnızca Chrome'da destekleniyor ve hangi komut dosyalarının iki kez, bir kez bağlantı öğeleri aracılığıyla ve tekrar komut dosyanızda yükleneceğini bildirmeniz gerekiyor.
Düzeltme: Başlangıçta bunların önyükleme tarayıcısı tarafından alındığını, normal ayrıştırıcı tarafından alındıklarını söylemiştim. Ancak, önyükleme tarayıcısı bunları alabilir, henüz çalıştırılmaz, ancak yürütülebilir kodun içerdiği komut dosyaları hiçbir zaman önceden yüklenemez. Yorumlarda beni düzelten Yoav Weiss'a teşekkürler.
async
yeni (ish), ancakdefer
IE4'ten beri IE'nin bir parçası olmuştur.defer
diğer tarayıcılara çok daha yakın zamanda eklendi, ancak bu tarayıcıların eski sürümleri çok daha az asılı kalıyor.