Performansı optimize etmek için bir sayfaya Javascript yüklemenin en iyi yolu nedir?


Yanıtlar:


14

Yapabileceğiniz birkaç şey var:

  1. HTML ve CSS'yi javascriptten önce yükleyin. Bu, tarayıcıya sayfayı düzenlemek ve oluşturmak için gereken her şeyi verir. Bu, kullanıcıya sayfanın çabuk olduğu izlenimini verir. Komut dosyası etiketlerini veya bloklarını kapanış gövdesi etiketine olabildiğince yakın yerleştirin.

  2. Bir CDN kullanmayı düşünün. JQuery gibi popüler kitaplıklardan herhangi birini kullanıyorsanız, birçok şirket (örn. Google, yahoo) kitaplıkları yüklemek için kullanabileceğiniz ücretsiz CDN'ler kullanır.

  3. Gömülü komut dosyası yerine harici bir dosyanın ön kodunu yükleyin. Bu, tarayıcıya JS içeriğini önbelleğe alma fırsatı verir ve hiç yüklemesi gerekmez. Ardışık sayfa yüklemeleri daha hızlı olacaktır.

  4. Web sunucusunda zip sıkıştırmayı açın.

Yahoo, sayfa yükleme sürelerini azaltmaya yardımcı olabilecek harika bir öneri sayfasına sahiptir .


1
Yahoo ayrıca, sayfanızı yukarıda belirtilen en iyi uygulamalara göre analiz eden ve size bir rapor kartı veren Firefox için YSlow eklentisini dağıtır. Developer.yahoo.com/yslow
Alan

1
Ayrıca, sayfa ilk oluşturulduğunda komut dosyasının yüklenmesini gerektirmeyen site öğeleriniz varsa kullanılabilen eşzamansız yükleme gibi teknikler de vardır. Hem bunun hem de komut dosyasının sayfanın altına yakın yerleştirilmesinin sınırları vardır; bazı durumlarda JS'yi belge kafasına yerleştirmeniz gerekir.
JasonBirch

7

Minifing, gziping ve CDNing'in yanı sıra (yeni kelime?). Erteleme yüklemesini düşünmelisiniz. Temel olarak bunun yaptığı, komut dosyalarını dinamik olarak eklemek ve engellemeyi önlemek ve paralel indirmelere izin vermektir.

Bunu yapmanın birçok yolu var, bu benim tercih ettiğim

<script type="text/javascript">
    function AttachScript(src) {
        window._sf_endpt=(new Date()).getTime();
        var script = document.createElement("script");
        document.getElementsByTagName("body")[0].appendChild(script);
        script.src = src;
    }
    AttachScript("/js/scripts.js");
    AttachScript("http://www.google-analytics.com/ga.js");
</script>

Bunu kapanış gövdesi etiketinin hemen önüne yerleştirin ve her js dosyasını yüklemek için AttachScript kullanın.
Biraz daha bilgi burada http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/


1
Hey, CDNing'i çaldın; Kanadalı bir şey yapmak anlamına geliyordu! ;)
JasonBirch

jajajaja good one
The Disintegrator

7

Google'ın Analytics'i nasıl yüklediğine de bakmak isteyebilirsiniz:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

"En iyi uygulama" türünde bir komut dosyası olarak kabul edildiğinden:
http://www.stevesouders.com/blog/2009/12/01/google-analytics-goes-async/


3

Birkaç Google üyesi , Velocity 2010'da Diffable adlı yeni bir açık kaynak projesi duyurdu . Diffable, yeni bir sürüm yayınlandığında tamamen yeni bir dosya göndermek yerine, kullanıcının önbelleğinde depolanan sürümden bu yana değişen JS, HTML ve CSS bölümlerini kademeli olarak yayınlamak için biraz sihir yapar.

Bu teknik delicesine harika ve şu anda en sık kullanılan ve küçük kod değişiklikleriyle büyük bir JavaScript kod tabanı kullandığınız web sitelerinde en etkili (ve çabaya değer). Bu, özellikle her salı en az bir sürümden geçen ve yılda ortalama 100 yeni sürümün olduğu Google Haritalar gibi uygulamalar için geçerlidir . Ayrıca, HTML5 yerel depolaması daha yaygın hale geldiğinde genel olarak çok mantıklıdır.

BTW, Google'ın Michael Jones'un değişiklik hakkında konuştuğunu görmediyseniz (coğrafi bir bağlamda) GeoWeb 2009'daki tüm açılış konuşmasını izlemeye değer .


1

Bu soruyu güncellemek için. Modern olarak, engellemeyen yüklemenin artık gerekli olmadığını düşünüyorum, tarayıcı bunu sizin için yapacak.

StackOverflow'a bir soru ekledim, içeriği buraya da ekleyeceğim.

Tek fark, load olayının biraz daha erken tetiklenmesidir, ancak dosyaların yüklenmesi aynı kalır. Ayrıca, onload engelleme yapmayan komut dosyasıyla daha erken çalışsa bile, bu JS dosyalarının daha önce tetiklendiği anlamına gelmediğini eklemek istiyorum. Benim durumumda normal kurulum en iyi çıktı

Şimdi önce senaryolar şöyle görünür:

<script>
(function () {
    var styles = JSON.parse(myObject.styles);
    for( name in styles ){
        var link  = document.createElement('link');
        link.setAttribute('rel', 'stylesheet');
        link.setAttribute('type', 'text/css');
        link.setAttribute('href', styles[name]);
        document.getElementsByTagName('head')[0].appendChild(link);
    }

    var scripts = JSON.parse(myObject.scripts);
    for( name in scripts ){
        var e = document.createElement('script');
        e.src = scripts[name];
        e.async = true;
        document.getElementsByTagName('head')[0].appendChild(e);
    }
}());
</script>

myObject.styles burada tüm dosyalar için tüm URL'leri tutan bir nesne.

3 testi çalıştırdım, işte sonuçlar:

Normal kurulum

Başta css ve altta javascript bulunan sayfa yükleme

Bu sadece normal kurulum, başımızda 4 css dosyası ve sayfanın altında 3 css dosyası var.

Şimdi hiçbir şeyi engelleyen bir şey görmüyorum. Ne görüyorum ki her şey aynı anda yükleniyor.

Engellemeyen JS

Engellemeyen javascript ile sayfa yükleme

Şimdi bu biraz daha ileri almak için, SADECE js dosyaları engelleme yaptık. Bu yukarıdaki komut dosyası ile. Aniden css dosyalarımın yükü engellediğini görüyorum. Bu garip, çünkü ilk örnekte hiçbir şeyi engellemiyor. Css neden aniden yükü engelliyor?

Her şey engellemiyor

Her şeyi engellemeyen sayfa yükleme

Sonunda tüm harici dosyaların engellenmeyen bir şekilde yüklendiği bir test yaptım. Şimdi ilk yöntemimizle bir fark görmüyorum. İkisi de aynı görünüyor.

Sonuç

Sonuç olarak, dosyalar zaten engelleme olmayan bir şekilde yüklenir, özel komut dosyası eklemek için bir ihtiyaç görmüyorum.

Yoksa burada bir şey mi kaçırıyorum?

Daha:


Fark, mavi çizginin konumudur, tahmin ediyorum ki sayfa oluşturulmaya başlar. Son kullanıcının bakış açısından, sayfa "yüklendiğinde" olduğu gibi, bir şeyler görmeye başladığı zamandır. İlk örnekte, oluşturma işlemi son JS dosyası yüklendikten sonra 900ms işaretiyle başlar. İkincisinde, stil sayfaları yüklendikten sonra (~ 700ms). Üçüncüsü, HTML indirildikten sonra (~ 500ms). Sayfa oluşturulduktan sonra CSS yüklemesini gerçekten istemediğiniz için yine de ikinci yaklaşıma devam edeceğim.
Tim Çeşmesi
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.