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 "Kontrol+Üst Karakter+J" (veya Mac'te "Komut+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.

Basit bir uygulamada birkaç sayıyı sıralamak için 71,2 KB'lık JavaScript. What gives?

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

Optimize etme

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

  1. Üçüncü taraf kitaplığı içe aktarmak yerine özel bir sıralama yöntemi yazma
  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. Her kodlama eğitiminde olduğu gibi, kodu kopyalayıp yapıştırmak yerine her zaman kendiniz yazmayı deneyin.

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. Öncelikle package.json'teki bu bağımlılığı 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 uygulamada, çok az çalışmayla paket boyutu 4 kattan fazla azaltıldı ancak iyileştirmeye açık alanlar hâlâ mevcut.

Kod bölme

webpack, günümüzde kullanılan en popüler açık kaynaklı modül birleştirme araçlarından 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çilen modül ayrı bir parçaya ayrılarak sağlanı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. Promise 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'den 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 yavaş yüklerken, ağ bağlantısı 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ızda üçüncü taraf bağımlılıkları yavaş yüklemek her zaman en iyi yaklaşım değildir ve bu, 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'ın bu konuda size nasıl yardımcı olabileceği hakkında 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ında veya cihazın görüntü alanının dışında kalan öğeleri geç yüklemek, web sitesinin hızını artırabilir. Bu konu hakkında daha fazla bilgi edinmek için Lazysizes kılavuzunu inceleyin.