Harici javascript referansına karşılık kendi kopyamı barındırma


42

JQuery kullanan bir web uygulaması var. Gerekli javascript dosyalarını web sitelerim ile birlikte kendi sunucularımda barındırmak veya jQuery'nin CDN'sine (örneğin: http://code.jquery.com/jquery-1.7.1.min.js ) referans vermek daha iyi bir uygulama mıdır? ?

İki taraf için de artılarını görebiliyorum:

  • Sunucularımdaysa, bu daha az dışsal bir bağımlılıktır; jQuery çöktü ya da barındırma yapısını ya da onun gibi bir şeyi değiştirirse, o zaman benim uygulama bozulur. Fakat bunun çok sık gerçekleşmeyeceğini hissediyorum; Bunu yapan çok sayıda küçük zamanlı site olmalı ve jQuery ekibi onları kırmaktan kaçınmak isteyecektir.
  • Sunucularımdaysa, birisinin güvenlik sorununu arayabileceği daha az dış referans var
  • Dışarıdan başvuruda bulunulursa, dosyaları sunmak için bant genişliği konusunda endişelenmeme gerek yok (bunun çok fazla olmadığını bilmeme rağmen).
  • Dışarıdan başvuruda bulunulursa ve bu web sitesini tüm dosyaların kendi kopyalarına sahip olması gereken birçok sunucuya dağıtıyorum, o zaman kopyalamak / güncellemek için hatırlamam gereken daha az dosya var.

İlk iki puan, Google’ın düşmesi veya saldırıya uğramasından endişe duyuyorsanız geçerlidir.
user16764

1
@ user16764 - ya da jQuery kopyasını bir nedenden ötürü alıyorlar (siyaset, kim bilir).
Bay Jefferson,

2
Yapmamak için başka bir neden gizliliktir. Üçüncü bir tarafın barındırdığı içerik kullanılması, üçüncü tarafın, kullanıcıları kolayca seçemeyecekleri bir yol izleme yöntemi sağlar.
Ian Newson,

Ayrıca bazı CDN'lerin özel google toplantı sahipleri bazen belirli ülkelerdeki dosyaları kısıtlama eğilimindedir
azerafati

Yanıtlar:


58

İkisini de yapmalısın:

Google gibi bir CDN'den hosting ile başlayın, çünkü bu muhtemelen kendi sitenizden daha yüksek bir çalışma süresine sahip olacak ve en hızlı yanıt süresi için yapılandırılacak. Ek olarak, CDN'ye bağlanan bir sayfayı ziyaret eden herhangi biri, dosyanın önbelleğe alınmış kopyasını kullanır, bu nedenle ilk yüklemeyi daha da hızlı hale getiren bir kopyasını yeniden indirmeleri gerekmez.

Sonra, CDN'nin düşmesi durumunda kendi sunucunuza bir geri dönüş referansı ekleyin (büyük olasılıkla değil, ancak güvenlidir). Geri dönüşlerin anlaşılması kolaydır, ancak kullanılan betiğe uyacak şekilde özelleştirilmesi gerekir:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>
<script>
    if (!window.jQuery) document.write('<script src="/path/to/jquery-ver.sion.min.js"><\/script>');
</script>

</script>Bir <script>öğenin içinde hiçbir yere yazmadığınızdan emin olun , çünkü HTML öğesini kapatır ve komut dosyasının başarısız olmasına neden olur. Basit bir düzeltme bir kaçış olarak bir ters eğik çizgi kullanmaktır: <\/script>.


İkisini birden yapmak için bir neden daha:

Eğer popüler bir CDN seçerseniz, herhangi bir zaman aşımına uğrama ihtimalinin düşük olması muhtemeldir, ancak çok uzak bir gelecekte (~, Moore yasasına göre ~ 18 ay ) barındırma formatı değiştiğinde veya adres ayarlandığında veya ağ bir ödeme duvarının arkasına yerleştirilir veya başka bir şey varsa, bağlantınız olduğu gibi çalışmayacaktır. Bir geri dönüş kullanırsanız, o zaman oluşturduğunuz her web sitesine geri dönmek ve CDN bağlantılarını değiştirmek zorunda kalmadan önce barındırma için herhangi bir yeni formata uyum sağlamanız biraz zaman verir.


İkisini birden yapmak için başka bir sebep:

Son zamanlarda bir dizi internet kesintisiyle çarpıldım. Yerel olarak komut dosyası kaynaklarının yerel kopyalarını bağladığım projeler üzerinde çalışmaya devam ettim ve yerel kopyaların birbirine bağlanması için gereken birkaç projenin olduğunu hemen gördüm.


+1 Size CDN'nin avantajlarını sunar ve olası tehlikeleri de kapsar.
quentin-starin,

5
Çalışma süresi ne kadardır? Eğer sitesi açılmazsa, js'nin çevrimiçi olması pek bir avantaj değildir :)
Boris Yankov

3
@BorisYankov, CDN kapalıysa ve siteniz çalışıyorsa ve yerel bir geri dönüş kullanmamışsanız, siteniz çalışmayacaktır. Çalışma süresiyle ilgisi budur. Siteniz kapalıysa, siteniz kapanır ve yerel kopya önemli olmaz.
zzzzBov

CDN'nin her yerinde sunucuları da olacak, böylece kaynağı en yakın düğümden alacaksınız.
hanzolo

35

Aynı soruyu sordum, sonra bu makaleyi okudum ve Google’ın jQuery kütüphanemi barındırmasına izin verme fikri üzerine satıldım.

Bu makale, kütüphanelerinizin Google’ın İçerik Dağıtım Ağı (CDN) tarafından barındırılmasına izin vermenin temel yararlarını belirtir:

  • Azalan Gecikme - Sunucunuza fiziksel olarak yakın olmayan kullanıcılar, keyfi bir şekilde konumlandırılmış sunucunuzdan indirmeye zorlarsanız, Google’dan jQuery’i daha hızlı indirebilir.
  • Artırılmış Paralellik - Tarayıcılar, aynı anda yapılabilecek bağlantı sayısını sınırlar. Hangi tarayıcıya bağlı olarak, bu sınır ana bilgisayar adı başına iki bağlantı kadar düşük olabilir. Google AJAX Kütüphaneleri CDN'sini kullanmak sitenize gelen bir isteği ortadan kaldırarak yerel içeriğinizin daha çok paralel olarak indirilmesine izin verir.
  • Daha İyi Önbellekleme - Google AJAX Kitaplıklarını kullanarak, kullanıcılarınızın hiç jQuery indirmeleri gerekmeyebilir. Öte yandan, jQuery'yi yerel olarak barındırıyorsanız, kullanıcılarınız en az bir kez indirmelidir. Kullanıcılarınızın her birinde muhtemelen tarayıcılarının önbelleğinde onlarca aynı jQuery kopyası bulunur, ancak jQuery'nin bu kopyaları sitenizi ziyaret ettiklerinde dikkate alınmaz.

Kendi kütüphanenizi barındırmak için profesyonel olarak listelediğiniz iki mermi noktasına gelince, Google’ın bulut sürümünü barındırdığını ve Google’ın ne yaptığını bildiğini ve kullanılabilirlik ve güvenlik açısından güvenilebileceğini unutmayın. Ancak, @zzzzBov, bu sorunun cevabında çok iyi bir noktaya değindi, burada kütüphanenin yerel bir kopyasını saklamayı ve olası bir durumda, CDN sürümünün hiçbir nedenle erişilemediğini varsayar.


4
Ah, eminim ki google’dan daha çok statik işler barındıran daha iyi bir iş yapabilirim. ;)
Xeoncross

Her ikisini de kullanmamak (CDN + yerel geri dönüş) sadece özensiz. Yazıklar olsun bu en iyi cevap imho.
quentin-starin

@qes Yeterince adil, cevabımın sonuna yeni bir cümle ekledim.
CFL_Jeff

17

Şahsen ben http://html5boilerplate.com/ adresinden bir ipucu alıyorum.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="includes/js/libs/jquery-1.6.1.min.js"%3E%3C/script%3E'))</script>

Bu, ana jQuery dosyasını Google’dan çeker, ancak bir nedenden ötürü yüklenmezse, bir sonraki satır kendi sunucunuzdan yükler.


5
Bu, çevrimdışı geliştirmenize izin vermenin ek avantajına sahiptir.
RSG

Protokole bağlı bir URL kullanımı, bir zamanlar olduğu gibi artık çok kullanışlı değil (bkz. Paulirish.com/2010/the-protocol-relative-url ). Sadece yazmak için makul https://.
GKFX

5

Bir CDN kullanmak daha iyi bir uygulamadır ve eğer bu CDN Google ise, her şey daha iyidir - hem @CFL_Jeff hem de @Morons'un belirttiği gibi.

Bu cevabı, başka bir yere işaret ederken sıklıkla gözden kaçan ve karışık içerik uyarısından kaçınan bir şeyi belirtmek için ekliyorum . Protokolsüz URL’leri kullanmayı düşünün, örneğin:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" type="text/javascript">
</script>

Protokolsüz URL'lerin kullanılmasında hala bazı destek sorunları var, bu yüzden de tüm http: // linklerimi sadece // olarak değiştirebilir miyim? SO, ancak en azından olası karışık içerik uyarılarını bir şekilde ele almaya çalışın .



0

Yanılıyor olabilirim ama document.write 'ı uygulamak DOM' un sahip olduğu her şeyin üzerine yazar. JavaScript dosyalarını gövdenin sonuna koymak iyi bir uygulama olduğundan,

Önceki cevaplara dayanarak aşağıdaki yöntemi öneririm:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">

if(!window.jQuery)
{
    //Creates the script element
    var script = document.createElement('script'); 
    //Adds the type attribute with "text/javascript" value
        script.setAttribute('type', 'text/javascript'); 
    //Adds the source attribute and populates it
        script.setAttribute('src', 'Put_The_Relative_Path_To_Your_JavaScript_File_Here'); 
    //Adds it to the end of the body, as it is good practice, to prevent render-blocking.  
    document.body.appendChild(script);

}

//Note that there's no need for you to verify with an onload function, since all scripts
//must be loaded before going to the next one! 

</script>

0

Yerel bir kopyaya ev sahipliği yapmanın en iyi uygulama olduğunu eklemek isterim çünkü yukarıdakilerin hiçbiri Geo Location ve katı Beyaz Listenin zorunlu olmadığı güvenli bir duruş ile ilgili hiçbir şey ifade etmiyor. Bu dosyayı yerel olarak barındırmamak, müşterilerinize daha düşük bir güvenlik duruşunu zorlar.


Herhangi bir Google’ın jQuery’inin CDN’sini kara listeye alan veya başka şekilde kısıtlayan bir güvenlik politikası, yalnızca askerin değil, birçok web sitesini kıracak . Başka bir deyişle, endişelenecek daha büyük problemler var.

2
@Snowman ... Çin'deki Büyük Güvenlik Duvarı gibi (betikleri için CDN kullanan Stack Exchange sitelerini düzenli olarak kırar)?
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.