Göze batmayan JavaScript: <script> HTML kodunun üstünde mi yoksa altında mı?


90

Yakın zamanda Yahoo Web Sitenizi Hızlandırmak için En İyi Uygulamalar manifestosunu okudum . Yapabildiğimizde JavaScript dahil etmeyi HTML kodunun altına koymanızı tavsiye ediyorlar.

Ama tam olarak nerede ve ne zaman?

Kapatmadan önce </html>mi yoksa sonra mı koymalıyız ? Ve her şeyden önce, onu ne zaman <head>bölüme koymalıyız ?


Yanıtlar:


87

Gerçekten göze batmayan komut dosyaları için iki olasılık vardır:

  • head bölümünde bir komut dosyası etiketi aracılığıyla harici bir komut dosyası dahil
  • gövdenin altındaki bir komut dosyası etiketi aracılığıyla harici bir komut dosyası dahil (önce </body></html>)

Orijinal Yahoo araştırması, bazı tarayıcıların komut dosyası etiketine tıkladıklarında komut dosyası dosyalarını yüklemeye çalıştıklarını ve bu nedenle, bitene kadar sayfanın geri kalanını yüklemediklerini gösterdiğinden, ikincisi daha hızlı olabilir. Bununla birlikte, komut dosyanız, DOM hazır olur olmaz çalıştırılması gereken 'hazır' bir bölüme sahipse, buna başlığa ihtiyacınız olabilir. Diğer bir sorun da düzendir - komut dosyanız, yüklenmesini istediğiniz sayfa düzenini olabildiğince erken değiştirecekse, böylece sayfanız kullanıcılarınızın önünde kendini yeniden çizmek için uzun zaman harcamayacaktır.

Harici komut dosyası sitesi başka bir etki alanında ise (harici widget'lar gibi), sayfanın yüklenmesini geciktirmekten kaçınmak için onu en alta koymaya değer olabilir.

Ve herhangi bir performans sorunu için kendi ölçütlerinizi yapın - bir çalışma yapıldığında doğru olabilecek şeyler, kendi yerel kurulumunuzla veya tarayıcılardaki değişikliklerle değişebilir.


13
'Hazır' bölümü olan komut dosyasıyla ilgili olarak. Bu betiği gövdenin altına koymak DOM'un manipüle edilmeye hazır olmasını garanti eder, eğer onu kafaya koyarsanız, DOMReady (veya benzeri) etkinliğini beklemesi için sarmalısınız
Juan Mendes

4
@Juan Evet öyle, ancak betiği en alta yerleştirerek DOMReady olayını tarayıcının belgeyi ayrıştırması ve baş öğelerini (200-500 ms) işlemesi için gereken süre kadar geciktiriyorsunuz. . Esas olarak ilk sayfa yüklemesinde (oradan önbelleğe alınabileceğini varsayarak). Oysa kafasına yerleştirirsen. Çok daha hızlı hazır olması muhtemeldir. Dolayısıyla, HTML5'i göz önünde bulundurursak, DOM hazır olduğunda komut dosyasının düzeni değiştirmesi gerekiyorsa, artık kafanızda bir "eşzamansız" veya "erteleme" komut dosyası olması daha iyidir.
hexalys 01

31

Asla bu kadar kesik ve kuru değildir - Yahoo, komut dosyalarını kapanış </body>etiketinin hemen önüne koymanızı önerir ; bu, sayfanın boş bir önbelleğe daha hızlı yüklendiği yanılsamasını yaratır (çünkü komut dosyaları belgenin geri kalanının indirilmesini engellemeyecektir). Bununla birlikte, sayfa yüklenirken çalıştırmak istediğiniz bir kodunuz varsa, bu kod yalnızca tüm sayfa yüklendikten sonra yürütülmeye başlayacaktır. Komut dosyalarını <head>etikete koyarsanız, daha önce çalışmaya başlayacaklardır - bu nedenle, hazırlanmış bir önbellekte sayfa aslında daha hızlı yükleniyormuş gibi görünecektir.

Ayrıca, komut dosyalarını sayfanın altına koyma ayrıcalığı her zaman mevcut değildir. Görünümlerinize önceden yüklenmiş bir kitaplığa veya başka bir JavaScript koduna bağlı olan satır içi komut dosyalarını eklemeniz gerekiyorsa, bu bağımlılıkları <head>etikete yüklemeniz gerekir .

Sonuçta Yahoo'nun önerileri ilgi çekicidir ancak her zaman uygulanabilir değildir ve duruma göre değerlendirilmelidir.


1
Göze çarpmayan javscript'iniz varsa, özellikle dikkat çekmeyen soruda satır içi snippet'leriniz olmayacak.
Juan Mendes

1
satır içi <script>etiketler rahatsız edici javascript anlamına gelmez.
Eran Galperin

@Eric Galperin: Rahatsız edici olmayan satır içi komut dosyası etiketlerinin iyi kullanımı nedir?
Juan Mendes

4
@Juan rahatsız edici Javascript, kullanıcı arayüzünün onsuz kırıldığı veya işaretlemeye gömülü olduğu anlamına gelir. <script>etiketler işaretlemeden ayrıdır ve arayüzü geliştiren ancak gerekli olmayan kodla kullanılabilir. Dolayısıyla, satır içi <script>etiketlerin doğası gereği rahatsız edici hiçbir şey yoktur .
Eran Galperin

4
1. Adım Eric değil Eran, 2. Javascript'e sunucu tarafı dilinden veri iletmek istediğinizde, örneğin öğeler için bir döngüde, <script>bu değerleri javascript değişkenlerine kodlamak için etiketleri kullanabilirsiniz. satır içi düzenleme veya diğer benzer davranışlar.
Eran Galperin

22

Diğerlerinin de söylediği gibi, bunu kapanış gövde html etiketlerinin önüne yerleştirin .

Geçen gün, müşterilerimizden sitelerinin aşırı derecede yavaş olduğundan şikayet eden çok sayıda telefon aldık. Onları yerel olarak ziyaret ettik ve tek bir sayfayı yüklemelerinin 20-30 saniye sürdüğünü gördük. Kötü performans gösteren sunucular olduğunu düşünerek, oturum açtık - ancak hem web hem de sql sunucuları ~% 0 etkinlikti.

Birkaç dakika sonra, Javascript izleme etiketleri için bağladığımız harici bir sitenin çalışmadığını fark ettik. Bu, tarayıcıların sitenin baş kısmındaki komut dosyası etiketine vurduğu ve komut dosyasını indirmeyi beklediği anlamına geliyordu .

Bu nedenle, en azından 3. taraf / harici komut dosyaları için, bunları sayfaya son şey olarak koymanızı öneririm. Daha sonra, kullanılamazlarsa, tarayıcı en azından sayfayı o noktaya kadar yükler ve kullanıcı bundan habersiz olurdu.


10
Harika hikaye kardeşim :) Ama cidden, bu, komut dosyası etiketlerini sayfanın altına yerleştirmek için gördüğüm en ikna edici argüman.
user271608

16

Özetlemek gerekirse, yukarıdaki önerilere dayanarak:

  1. Harici komut dosyaları için (Google analizi, 3. taraf pazarlama izleyicileri, vb.) Bunları </body>etiketinin önüne yerleştirin .
  2. Sayfa düzenini etkileyen komut dosyaları için, başlığa yerleştirin.
  3. 'Dom ready' (jquery gibi) kullanan komut dosyaları için, komut </body>dosyalarını başa yerleştirmek için uç durum nedeniniz yoksa önüne yerleştirmeyi düşünün .
  4. Bağımlılıkları olan satır içi komut dosyaları varsa, gerekli komut dosyalarını başlığa yerleştirin.

6

Senaryolarınızın konumunu düzeltmek istiyorsanız, YSlow performansı iyileştirecek veya azaltacaksa size bir lezzet katmak için harika bir araçtır. Javascript'i belirli belge konumlarına koymak, sayfa yükleme sürelerini gerçekten öldürebilir.

http://developer.yahoo.com/yslow/


5

Hayır, </html>geçersiz olacağı için sonrasına gelmemelidir . Komut dosyalarını yerleştirmek için en iyi yer,</body>

Bunun temel nedeni, çoğu tarayıcının sağladığınız komut dosyasını değerlendirirken sayfayı oluşturmayı bırakmasıdır. Bu nedenle, sayfanın herhangi bir yerine engelleyici olmayan kod koymak sorun değil ( onLoadolay bağlama etkili bir şekilde ücretsiz olacak kadar hızlı olduğundan , esas olarak olaya işlevler ekleyen şeyler düşünüyorum ). Buradaki büyük bir katil, sayfanın başında, reklamlar tamamen indirilmeden herhangi bir sayfanın yüklenmesini engelleyebilecek bazı reklam sunucusu komut dosyası yerleştirmektir, bu da sayfa yükleme sürelerinizi balon yapar.


Biliyorsunuz, gerçekten hız ile ilgileniyorsanız, o zaman hiçbir </body> veya </html> olmayacaktır - bu öğe türleri için kapanış etiketleri isteğe bağlıdır. <script> 'i en sona koyun ve </body> ile </html>' yi bir arada kullanmayı unutun.
Jim

9
Umarım Jim alaycıdır - her halükarda onun tavsiyesine uymayın. İyi biçimlendirilmiş XHTML, gövde ve html etiketleri dahil her öğe için kapanış etiketleri gerektirir. Kodunuz geçerli XML değilse, yanlış yapıyorsunuzdur.
matt lohkamp

6
Hayır, alay etmiyorum. Soruya bir göz atın. XHTML'yi değil HTML'yi belirtir. Geçerli XHTML'nin bunları gerektirdiği doğrudur, ancak geçerli HTML gerektirmez. Bu öğe türleri için HTML'yi seçip kapanış etiketlerini atlamada kesinlikle yanlış bir şey yoktur.
Jim

2

En alta koyarsanız, en son yüklenir, dolayısıyla kullanıcının sayfayı görebileceği hız artar. Finalden önce olması gerekir, </html>aksi takdirde DOM'un bir parçası olmayacaktır.

Yine de koda anında ihtiyaç duyulursa, kafasına koyun.

Blog widget'ları gibi şeyleri en alta koymak en iyisidir, böylece yüklenmezlerse sayfanın kullanılabilirliğini etkilemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.