Satır İçi Javascript ve Harici Javascript'i ne zaman kullanmalıyım?


129

Performans ve bakım kolaylığı açısından harici komut dosyalarını ne zaman eklemem veya html kodu ile satır içi yazmam gerektiğini bilmek istiyorum.

Bunun için genel uygulama nedir?

Gerçek dünya senaryosu - İstemci tarafında form doğrulamasına ihtiyaç duyan birkaç html sayfam var. Bunun için tüm bu sayfalara dahil ettiğim bir jQuery eklentisi kullanıyorum. Ama soru şu ki:

  • Bu betiği satır içi olarak yapılandıran kod bitlerini mi yazıyorsunuz?
  • tüm bu html sayfaları arasında paylaşılan tek bir dosyaya tüm bitleri dahil edilsin mi?
  • her biti, her html sayfası için ayrı bir harici dosyaya dahil edilsin mi?

Teşekkürler.

Yanıtlar:


114

Bu cevabın ilk yayınlandığı tarihte (2008), kural basitti: Tüm komut dosyası harici olmalıdır. Hem bakım hem de performans için.

(Neden performans? Çünkü kod ayrı ise tarayıcılar tarafından daha kolay önbelleğe alınabilir.)

JavaScript HTML kodu ait değil ve (gibi özel karakterler içeriyorsa <, >) bile sorun yaratır.

Günümüzde web ölçeklenebilirliği değişti. Birden çok HTTP isteği yapma gecikmesi nedeniyle istek sayısını azaltmak geçerli bir değerlendirme haline geldi. Bu, yanıtı daha karmaşık hale getirir: Çoğu durumda, JavaScript'in harici olması yine de önerilir. Ancak bazı durumlarda, özellikle çok küçük kod parçalarını sitenin HTML'sine yerleştirmek mantıklıdır.


6
@Nick: Çoğu sorunun üstesinden gelinebilir. İlk etapta onları üretmemek daha iyi.
Konrad Rudolph

17
Bazen satır içi yaparken daha iyi performans elde edersiniz. Google.com'un kaynağına bakın . Ne yaptıklarını biliyorlar.
callum

13
@callum Google, web sitelerinin% 99,999999'undan farklı bir kullanım alanına sahiptir. Elbette son derece dikkatli ölçüyorlar ve en küçük fark bile önemli. Ancak sırf kendi özel kullanım durumlarında satır içi yapmanın daha iyi çalıştığını bulmaları (muhtemelen komut dosyası çok sık değiştiği için mi?), Bundan genel bir kural çıkarabileceğimiz veya hatta "geleneksel" olanı göz ardı etmemiz gerektiği anlamına gelmez. kural (komut dosyalarını dışa aktarmak için).
Konrad Rudolph

8
@KonradRudolph - Kabul edildi, Google'ın yaklaşımından genel bir kural çıkarılmamalıdır. Sadece cevabınızda kuralı sorgulamaya değebileceğine dair bir ipucu olduğunu söylüyorum . Her neyse, Google'ın bunu yapmasının sebebinin HTTP isteklerini azaltmak olduğunu düşünüyorum ve bu sitelerin% 0.000001'inden fazlasına fayda sağlayabilir. Bant genişliği artıyor ancak gidiş-dönüş süreleri aynı kalıyor. Seri HTTP isteğinin tamamını kaldırmak bazen harici JS'nin önbelleğe alma avantajından daha iyidir. Elbette JS'nizin boyutuna bağlıdır.
callum

5
@callum Bu doğru olsa da, önbelleğe alma ile ilgili nokta hala kalır ve önemli kalır. Gidiş dönüşlerin azaltılması, yalnızca ziyaretçileriniz geri dönmezse (ve o zaman önemli hale getirmek için yeterli sayfa isabeti almazsanız) veya içeriğiniz o kadar sık ​​değişiyorsa, komut dosyalarını önbelleğe almanın bir yararı olmazsa önemlidir.
Konrad Rudolph

31

Sürdürülebilirlik kesinlikle onları harici tutmak için bir nedendir, ancak yapılandırma tek satırlıysa (veya genel olarak bu dosyaları harici yapmak için elde edeceğiniz HTTP ek yükünden daha kısaysa), bunları satır içi tutmak performans açısından daha iyidir. Her HTTP isteğinin yürütme süresi ve trafik açısından bazı ek yükler oluşturduğunu her zaman unutmayın.

Doğal olarak, kodunuz birkaç satırdan daha uzun olduğu ve tek bir sayfaya gerçekten özgü olmadığı anda bunların hepsi önemsiz hale gelir. Bu kodu yeniden kullanabilmek istediğiniz an, onu harici yapın. Yapmazsanız, boyutuna bakın ve o zaman karar verin.


5
Endişelerimden biri bu. Birkaç satır kod için ayrı bir HTTP isteğine sahip olmak boşuna görünüyor.
Dan Burzo

Kodunuz için örnek bir yapılandırma gönderebilir misiniz? IMO, 300 karakterin altındaysa ve kesinlikle sayfaya özgüse, satır içinde.
Horst Gutmann

Bu en iyi cevap olmalı imo
sgarcia.dev

@Dan, ayrı bir isteğin yalnızca ilk seferde gerçekleştiğini unutmayın. Kullanıcılarınızın sayfayı bir kereden fazla yüklemesini bekliyorsanız, önbelleğe alınmış harici (birkaç satır için bile), n = 2 + sayfa yüklemelerinde kablo üzerinden bu birkaç satır için bayt beklemekten açıkça daha hızlıdır.
jinglesthula

@HorstGutmann dosya harici yardıma sahip olmak bakım kolaylığı ile nasıl olur? Şahsen mümkün olduğunda harici js'yi tercih ederim, ancak bakımı kolaylaştıran bir hedef var mı?
jinglesthula

21

JavaScript'i dışsallaştırmak yahoo performans kurallarından biridir: http://developer.yahoo.com/performance/rules.html#external

Komut dosyalarını her zaman dışsallaştırmanız gereken zor ve hızlı kural genellikle iyi bir bahis olsa da, bazı durumlarda bazı komut dosyalarını ve stilleri satır içi yapmak isteyebilirsiniz. Bununla birlikte, yalnızca performansı artıracağını bildiğiniz şeyleri satır içi yapmalısınız (çünkü bunu ölçtünüz).


1
Bu komut tüm gerçi gelişimi sırasında aynı dosyada olması gerektiği anlamına gelmez - Ben Yahoo da biri HTTP çok çağrı içine tüm Javascript eklemenizi öneririz düşünüyorum
Paul Shannon

Ayrıca, yukarıda belirtildiği gibi, HTTP / 2 "1 çağrı" uygulamasını da değiştirir.
jinglesthula

19

Yalnızca performansı önemsiyorsanız, bu konudaki tavsiyelerin çoğu tamamen yanlıştır ve sayfanın JS kodu olmadan işe yaramaz olduğunu varsayabileceğimiz SPA döneminde giderek daha fazla yanlış hale gelmektedir. SPA sayfa yükleme sürelerini optimize etmek ve bu sonuçları farklı tarayıcılarla doğrulamak için sayısız saatler harcadım. Genelde html'nizi yeniden düzenleyerek performans artışı oldukça dramatik olabilir.

En iyi performansı elde etmek için sayfaları iki aşamalı roketler olarak düşünmelisiniz. Bu iki aşama kabaca karşılık gelir <head>ve <body>aşamalar, ancak bunların yerine <static>ve olarak düşünün <dynamic>. Statik kısım, temelde yanıt borusunu olabildiğince hızlı bir şekilde aşağı ittiğiniz bir dizi sabitidir. Çerezleri ayarlayan çok sayıda ara yazılım kullanıyorsanız (bunların http içeriği gönderilmeden önce ayarlanması gerekir) bu biraz yanıltıcı olabilir, ancak prensipte, bazı şablon oluşturma kodlarına (jilet, php, vb) sunucuda. Bu kulağa zor gelebilir, ama sonra sadece yanlış açıklıyorum çünkü neredeyse önemsiz. Tahmin edebileceğiniz gibi, bu statik kısım tüm javascript satır içi ve küçültülmüş olarak içermelidir. Bir şeye benzeyecekti

<!DOCTYPE html>
     <html>
         <head>
             <script>/*...inlined jquery, angular, your code*/</script>
             <style>/* ditto css */</style>
         </head>
         <body>
             <!-- inline all your templates, if applicable -->
             <script type='template-mime' id='1'></script>
             <script type='template-mime' id='2'></script>
             <script type='template-mime' id='3'></script>

Bu kısmı kabloya göndermek size neredeyse hiçbir maliyeti olmadığı için, istemcinin bunu sunucunuza bağlandıktan sonra yaklaşık 5ms + gecikme süresi civarında bir yerde almaya başlayacağını bekleyebilirsiniz. Sunucunun oldukça yakın olduğunu varsayarsak, bu gecikme 20 ms ile 60 ms arasında olabilir. Tarayıcılar, bu bölümü alır almaz işlemeye başlayacaklar ve işlem süresi, normal olarak, aktarım süresine 20 veya daha fazla faktörle hakim olacaktır; bu, artık, <dynamic>kısmın sunucu tarafında işlenmesi için amortize edilmiş pencerenizdir .

Tarayıcının satır içi jquery + signalr + angular + ng animate + ng + ng rotaları + lodash'ı işlemesi yaklaşık 50ms sürer (krom, dinlenme belki% 20 daha yavaş). Bu başlı başına oldukça şaşırtıcı. Çoğu web uygulaması, tüm bu popüler kitaplıkların toplamından daha az koda sahiptir, ancak sizin de aynı miktarda sahip olduğunuzu varsayalım, bu nedenle istemcide gecikme + 100 ms işleme süresi kazanırız (bu gecikme kazancı ikinci aktarım yığınından gelir). İkinci parça geldiğinde, tüm js kodunu ve şablonlarını işledik ve dom dönüşümlerini gerçekleştirmeye başlayabiliriz.

Bu yöntemin satır içi kavramına ortogonal olduğuna itiraz edebilirsiniz, ancak öyle değildir. Satır içi yapmak yerine, cdns'ye veya kendi sunucularınıza bağlanırsanız, tarayıcının başka bir bağlantı (lar) açması ve yürütmeyi geciktirmesi gerekir. Bu yürütme temelde ücretsiz olduğundan (sunucu tarafı veritabanıyla konuştuğundan), tüm bu atlamaların hiç atlama yapmamaktan daha pahalıya mal olacağı açık olmalıdır. Harici js'nin daha hızlı çalıştığını söyleyen bir tarayıcı tuhaflığı olsaydı, hangi faktörün baskın olduğunu ölçebilirdik. Ölçümlerim, ekstra taleplerin bu aşamadaki performansı düşürdüğünü gösteriyor.

SPA uygulamalarının optimizasyonu ile çok çalışıyorum. İnsanların veri hacminin önemli olduğunu düşünmesi yaygındır, gerçekte gecikme ve yürütme genellikle baskındır. Listelediğim küçültülmüş kitaplıklar 300 kb'a kadar veri ekler ve bu yalnızca 68 kb gzip'lenmiş veya 2mbit 3g / 4g telefonda 200ms indirme, aynı verilere sahip olup olmadığını kontrol etmek için aynı telefonda alacağı gecikme süresidir. zaten önbelleğinde, proxy önbelleğe alınmış olsa bile, çünkü mobil gecikme vergisi (telefondan kuleye gecikme) hala geçerli. Bu arada, daha düşük ilk atlama gecikmesine sahip masaüstü bağlantıları genellikle daha yüksek bant genişliğine sahiptir.

Kısacası, şu anda (2014), tüm komut dosyalarını, stilleri ve şablonları satır içi yapmak en iyisidir.

DÜZENLEME (MAYIS 2016)

JS uygulamaları büyümeye devam ettikçe ve yüklerimden bazıları artık 3+ megabayta kadar küçültülmüş kod yığıldıkça, en azından yaygın kitaplıkların artık satır içi olmaması gerektiği aşikar hale geliyor.


<dynamic> kısmının sunucu tarafında işlenmesi için artık sizin amortize edilmiş pencereniz olanı alamadım - Sunucu, ihtiyaç duyduğu her şeyi işler ve ancak o zaman işlenmiş html'nin tamamına (head + body) hizmet eder, diğer sunucu işlemleri bundan sonra gerekli mi?
BornToCode

@BornToCode Buradaki fikir, istemciye aynı zamanda sunucu tarafında yapacak bir şey sunmaktır. İstemci kitaplıklarının yorumlanması gerektiğinden , sunucuda herhangi bir hesaplama yapmadan önce bu işlemi başlatmak daha iyidir . Amortize edilmiş pencere, istemcinin JS'yi işlemesi için geçen süredir. 2 aşamalı bir roket düzenlerseniz, bu pencereyi ücretsiz alırsınız.
Gleno


9

Aslında, satır içi javascript kullanmak için oldukça sağlam bir durum var. Js yeterince küçükse (tek satırlık), javascript'i iki faktörden dolayı satır içi olarak tercih ederim:

  • Yerellik . Bazı javascript'lerin davranışını doğrulamak için harici bir dosyada gezinmeye gerek yoktur
  • AJAX . AJAX aracılığıyla sayfanın bazı bölüm takviye ediyorsanız, siz olabilir bunları binded şekline bağlı olarak, bu bölüm için DOM işleyicileri (onclick, vs) tüm kaybederler. Örneğin, bunu aşmak jQueryiçin liveya da delegateyöntemlerini kullanabilirsiniz, ancak js yeterince küçükse, onu satır içi olarak yerleştirmenin tercih edildiğini görüyorum.

5

Her zaman harici komut dosyaları kullanmanızın bir başka nedeni de İçerik Güvenlik Politikası'na (CSP) geçişin daha kolay olmasıdır . CSP varsayılanları tüm satır içi komut dosyalarını yasaklar ve sitenizi XSS saldırılarına karşı daha dirençli hale getirir.


4

Gerekli koda bir göz atar ve onu gerektiği kadar çok ayrı dosyaya bölerdim. Her js dosyası yalnızca bir "mantıksal işlev kümesi" içerir. Örn. oturum açma ile ilgili tüm işlevler için bir dosya.

Daha sonra her html sayfasındaki site geliştirme sırasında yalnızca gerekli olanları dahil edersiniz. Sitenizi yayına aldığınızda, bir sayfanın ihtiyaç duyduğu her js dosyasını tek bir dosyada birleştirerek optimizasyon yapabilirsiniz.


4

Satır içi javascipt için önerebileceğim tek savunma, .net MVC ile güçlü yazılmış görünümleri kullanırken, yararlı bulduğum javascript ortasında c # değişkenlerine başvurabilmenizdir.


3

Dikkate alınacak üç nokta:

  • Ne kadar koda ihtiyacınız var (bazen kitaplıklar birinci sınıf tüketicidir)?
  • Özgüllük: Bu kod yalnızca bu belirli belge veya unsur bağlamında işlevsel mi?
  • Belgedeki her kod, onu daha uzun ve dolayısıyla daha yavaş yapma eğilimindedir. Bunun yanı sıra, SEO ile ilgili düşünceler, dahili komut dosyalarını en aza indirdiğinizi açıkça ortaya koyuyor ...

2

Harici komut dosyalarında Firebug kullanılarak hata ayıklamak daha kolaydır. JavaScript'imi Birim Testi yapmayı ve tüm harici yardımlara sahip olmasını seviyorum. JavaScript'i PHP kodunda ve HTML'de görmekten nefret ediyorum, bana büyük bir karmaşa gibi görünüyor.


2

JavaScript'i harici tutma noktasında:

ASP.NET 3.5SP1 kısa süre önce bir Bileşik komut dosyası kaynağı oluşturmak için işlevsellik sunmuştur (bir grup js dosyasını tek bir dosyada birleştirme). Bunun bir başka yararı, Web sunucusu sıkıştırması açıldığında, biraz daha büyük bir dosyanın indirilmesi, daha küçük dosyalardan daha iyi bir sıkıştırma oranına sahip olacaktır (ayrıca daha az http ek yükü, gidiş dönüş vb ...). Sanırım bu, ilk sayfa yüklemesinde tasarruf sağlıyor, ardından tarayıcı önbelleği yukarıda belirtildiği gibi devreye giriyor.

ASP.NET bir yana, bu ekran yayını faydaları daha ayrıntılı olarak açıklıyor: http://www.asp.net/learn/3.5-SP1/video-296.aspx


2

Harici komut dosyalarının bir başka gizli yararı da, onları jslint gibi bir sözdizimi denetleyicisi aracılığıyla kolayca çalıştırabilmenizdir . Bu sizi çok sayıda kalp kırıcı, bulunması zor IE6 hatasından kurtarabilir.


1

Senaryonuzda, harici şeyleri sayfalar arasında paylaşılan tek bir dosyaya yazmak sizin için iyi olacak gibi görünüyor. Yukarıda söylenen her şeye katılıyorum.


1

Erken prototipleme sırasında, hızlı yinelemenin yararı için kodunuzu satır içinde tutun, ancak üretime ulaştığınızda hepsini harici yaptığınızdan emin olun.

Hatta tüm Javascript'inizi harici olarak yerleştiremezseniz, elinizin altında kötü bir tasarıma sahip olduğunuzu ve verilerinizi ve komut dosyalarınızı yeniden düzenlemeniz gerektiğini söylemeye bile cüret edebilirim.


1

Google, sayfa sıralaması ölçümlerine yükleme sürelerini dahil etti, eğer çok satır içi yaparsanız, örümceklerin sayfanızda gezinmesi daha uzun sürer, bu, çok fazla dahil etmeniz gerekiyorsa, sayfa sıralamanızı etkileyebilir. her durumda, farklı stratejiler sıralamanızı etkileyebilir.


1

bence tek sayfalı web siteleri oluştururken satır içi kullanmanız gerektiğini, çünkü komut dosyalarının birden çok sayfada paylaşılmasına gerek olmayacak


-3

Satır içi j'lerin bakımı her zaman zor olduğundan, her zaman harici J'ler kullanmayı deneyin.

Dahası, geliştiricilerin çoğu js'yi harici olarak kullanmanızı önerdiğinden, profesyonel olarak harici bir js kullanmanız gerekir.

Ben kendim harici js kullanıyorum.


2
Profesyonel olarak gerekli mi? Neden? Bunu kim söyledi?
Siyah
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.