Kod bölmeyle JavaScript yüklerini azaltın

Çoğu web sayfası ve uygulama birçok farklı bölümden oluşur. Uygulamayı oluşturan tüm JavaScript'i ilk sayfa yüklendikten hemen sonra göndermek yerine JavaScript'i birden fazla parçaya bölmek sayfa performansını artırır.

Bu kod laboratuvarında, üç sayıyı sıralayan basit bir uygulamanın performansını artırmak için kod bölme özelliğinin nasıl kullanılacağı gösterilmektedir.

Bir tarayıcı penceresinde, sayı girmek için üç alan ve bir sıralama düğmesi bulunan Sihirli Sırala adı verilen bir uygulama gösterilmektedir.

Ölçüm

Her zaman olduğu gibi, optimizasyon eklemeye çalışmadan önce bir web sitesinin ne kadar iyi performans gösterdiğini ölçmek önemlidir.

  1. Siteyi önizlemek için Uygulamayı Görüntüle'ye, ardından Tam Ekran'a tam ekran basın.
  2. Geliştirici Araçları'nı açmak için "Control+Üst Karakter+J" (veya Mac'te "Command+Option+J") tuşlarına basın.
  3. sekmesini tıklayın.
  4. Önbelleği devre dışı bırak onay kutusunu işaretleyin.
  5. Uygulamayı yeniden yükleyin.

71,2 KB JavaScript paketini gösteren ağ paneli.

71,2 KB boyutunda JavaScript; basit bir uygulamada birkaç sayıyı sıralamak için kullanılabilir. What gives?

Kaynak kodunda (src/index.js), lodash kitaplığı içe aktarılıp bu uygulamada kullanılıyor. Lodash birçok faydalı yardımcı program işlevi sağlar ancak burada paketteki yalnızca tek bir yöntem kullanılmaktadır. Yalnızca küçük bir kısmının kullanıldığı üçüncü taraf bağımlılıklarını tamamen yükleyip içe aktarmak yaygın bir hatadır.

Optimize etme

Paket boyutunu küçültmenin birkaç yolu vardır:

  1. Üçüncü taraf kitaplığını içe aktarmak yerine özel bir sıralama yöntemi yazın
  2. Sayısal olarak sıralamak için yerleşik Array.prototype.sort() yöntemini kullanın
  3. Kitaplığın tamamını değil, yalnızca lodash içindeki sortBy yöntemini içe aktarma
  4. Sıralama kodunu yalnızca kullanıcı düğmeyi tıkladığında indirin

1. ve 2. seçenekler, paket boyutunu küçültmek için mükemmel yöntemlerdir (ve gerçek bir uygulama için muhtemelen en mantıklı seçeneklerdir). Ancak bu eğitimde, öğretme amacıyla bu yöntemler kullanılmamıştır 😈.

Hem 3. hem de 4. seçenekler bu uygulamanın performansını iyileştirmeye yardımcı olur. Bu codelab'in sonraki birkaç bölümünde bu adımlar ele alınmaktadır. Herhangi bir kodlama eğiticisinde olduğu gibi, kodu kopyalayıp yapıştırmak yerine daima kendiniz yazmaya çalışın.

Yalnızca ihtiyacınız olanları içe aktarın

Yalnızca lodash yöntemini içe aktaracak şekilde birkaç dosyanın değiştirilmesi gerekir. İlk olarak, bu bağımlılığı package.json içinde değiştirin:

"lodash": "^4.7.0",

Kaldırdığınız kodun yerine aşağıdakini ekleyin:

"lodash.sortby": "^4.7.0",

Ardından src/index.js'te şu modülü içe aktarın:

import "./style.css";
import _ from "lodash";
import sortBy from "lodash.sortby";

Ardından, değerlerin nasıl sıralanacağını güncelleyin:

form.addEventListener("submit", e => {
  e.preventDefault();
  const values = [input1.valueAsNumber, input2.valueAsNumber, input3.valueAsNumber];
  const sortedValues = _.sortBy(values);
  const sortedValues = sortBy(values);

  results.innerHTML = `
    <h2>
      ${sortedValues}
    </h2>
  `
});

Uygulamayı yeniden yükleyin, Geliştirici Araçları'nı açın ve paneline tekrar göz atın.

15,2 KB JavaScript paketini gösteren ağ paneli.

Bu uygulama için, çok az çalışmayla paket boyutu 4 kattan fazla küçültülmüştür ancak daha fazla iyileştirme yapılabilir.

Kod bölme

webpack, günümüzde kullanılan en popüler açık kaynaklı modül paketleyicilerden biridir. Kısacası, bir web uygulamasını oluşturan tüm JavaScript modüllerini (ve diğer öğeleri) tarayıcı tarafından okunabilen statik dosyalarda paketler.

Bu uygulamada kullanılan tek paket iki ayrı parçaya bölünebilir:

  • İlk rotamızı oluşturan koddan sorumlu kişi
  • Sıralama kodumuzu içeren ikincil bir parça

Dinamik içe aktarma kullanılarak ikincil bir parça gecikmeli olarak yüklenebilir veya isteğe bağlı olarak yüklenebilir. Bu uygulamada, parçayı oluşturan kod yalnızca kullanıcı düğmeye bastığında yüklenebilir.

src/index.js içindeki sıralama yöntemi için üst düzey içe aktarma işlemini kaldırarak başlayın:

import sortBy from "lodash.sortby";

Ardından, düğmeye basıldığında tetiklenen etkinlik işleyiciye içe aktarın:

form.addEventListener("submit", e => {
  e.preventDefault();
  import('lodash.sortby')
    .then(module => module.default)
    .then(sortInput())
    .catch(err => { alert(err) });
});

import() özelliği, bir modülü dinamik olarak içe aktarma özelliğini içerecek bir önerinin (şu anda TC39 sürecinin 3. aşamasında) bir parçasıdır. webpack bu özellik için desteği zaten eklemiştir ve öneride belirtilen aynı söz dizimini kullanır.

import() bir promise döndürür ve çözüldüğünde, seçili modül sağlanır ve ayrı bir parçaya ayrılır. Modül döndürüldükten sonra lodash tarafından sağlanan varsayılan dışa aktarma işlemine referans vermek için module.default kullanılır. Söz, üç giriş değerini sıralamak için sortInput yöntemini çağıran başka bir .then ile zincirlenir. Taahhüt zincirinin sonunda, .catch(), promise'in bir hata nedeniyle reddedildiği durumları işlemek için kullanılır.

Son olarak, dosyanın sonuna sortInput yöntemini yazmanız gerekir. Bu, lodash.sortBy kaynağından içe aktarılan yöntemi alan bir işlevi döndüren bir işlev olmalıdır. İç içe yerleştirilmiş işlev daha sonra üç giriş değerini sıralayabilir ve DOM'u güncelleyebilir.

const sortInput = () => {
  return (sortBy) => {
    const values = [
      input1.valueAsNumber,
      input2.valueAsNumber,
      input3.valueAsNumber
    ];
    const sortedValues = sortBy(values);

    results.innerHTML = `
      <h2>
        ${sortedValues}
      </h2>
    `
  };
}

Gözle

Uygulamayı son bir kez daha yükleyin ve panelini tekrar yakından izleyin. Uygulama yüklendikten hemen sonra yalnızca küçük bir ilk paket indirilir.

2,7 KB JavaScript paketini gösteren ağ paneli.

Giriş sayılarını sıralamak için düğmeye basıldığında, sıralama kodunu içeren parça getirilir ve yürütülür.

2,7 KB JavaScript paketini ve ardından 13,9 KB JavaScript paketini gösteren ağ paneli.

Sayıların yine de nasıl sıralandığını fark edin.

Sonuç

Kod bölme ve yavaş yükleme, uygulamanızın ilk paket boyutunu küçültmek için son derece yararlı teknikler olabilir. Bu da doğrudan çok daha hızlı sayfa yükleme sürelerine neden olabilir. Ancak bu optimizasyonu uygulamanıza dahil etmeden önce dikkate alınması gereken bazı önemli noktalar vardır.

Kullanıcı arayüzünü geç yükleme

Belirli kod modüllerini geç yüklerken ağ bağlantıları daha zayıf olan kullanıcılar için deneyimin nasıl olacağını göz önünde bulundurmak önemlidir. Kullanıcı bir işlem gönderdiğinde çok büyük bir kod parçasını bölmek ve yüklemek, uygulamanın çalışmayı durdurmuş gibi görünmesine neden olabilir. Bu nedenle, bir tür yükleme göstergesi göstermeyi düşünebilirsiniz.

Üçüncü taraf düğüm modüllerini geç yükleme

Uygulamanızdaki geç yükleme üçüncü taraf bağımlılıkları için her zaman en iyi yaklaşım değildir ve bunları nerede kullandığınıza bağlıdır. Üçüncü taraf bağımlılıkları genellikle sık güncellenmedikleri için önbelleğe alınabilen ayrı bir vendor paketine ayrılır. SplitChunksPlugin'in bunu yapmanıza nasıl yardımcı olabileceğiyle ilgili daha fazla bilgi edinin.

JavaScript çerçevesiyle geç yükleme

Webpack kullanan birçok popüler çerçeve ve kitaplık, uygulamanızın ortasında dinamik içe aktarma kullanmak yerine, gecikmeli yüklemeyi kolaylaştırmak için soyutlama sağlar.

Dinamik içe aktarma işlemlerinin işleyişini anlamak yararlı olsa da belirli modülleri yavaş yüklemek için her zaman çerçeveniz/kitaplığınız tarafından önerilen yöntemi kullanın.

Önceden yükleme ve önceden getirme

Mümkün olduğunda, kritik modülleri daha da erken yüklemeyi denemek için <link rel="preload"> veya <link rel="prefetch"> gibi tarayıcı ipuçlarından yararlanın. webpack, import ifadelerinde sihirli yorumlar kullanarak her iki ipucunu da destekler. Bu konu, Kritik parçaları önceden yükleme kılavuzunda daha ayrıntılı olarak açıklanmaktadır.

Koddan daha fazlasını geç yükleme

Resimler, bir uygulamanın önemli bir bölümünü oluşturabilir. Ekranın alt kısmında veya cihaz görüntü alanının dışında bulunanları geç yüklemek web sitesini hızlandırabilir. Bu konu hakkında daha fazla bilgi edinmek için Lazysizes kılavuzunu inceleyin.