Codelab: Yükleme hızını iyileştirmek için önemli öğeleri önceden yükleme

Bu codelab'de birkaç kaynağın önceden yüklenmesi ve önceden yüklenmesiyle şu web sayfasının performansı iyileştirilmiştir:

Uygulama Ekran Görüntüsü

Ölçüm

Optimizasyon eklemeden önce web sitesinin nasıl performans gösterdiğini ölçün.

  • Siteyi önizlemek için Uygulamayı Göster'e, ardından Tam Ekran'a tam ekran basın.

Glitch'inizin canlı sürümünde Lighthouse performans denetimini (Lighthouse > Seçenekler > Performans) çalıştırın (ayrıca bkz. Lighthouse ile performans fırsatlarını keşfetme).

Lighthouse, geç getirilen bir kaynak için aşağıdaki başarısız denetimi gösterir:

Lighthouse: Önemli istekleri önceden yükleme denetimi
  • Geliştirici Araçları'nı açmak için "Control+Shift+J" (veya Mac'te "Command+Option+J") tuşlarına basın.
  • sekmesini tıklayın.
Geç keşfedilen kaynağın yer aldığı ağ paneli

main.css dosyası, HTML dokümanına yerleştirilmiş bir Bağlantı öğesi (<link>) tarafından getirilmez. Ancak ayrı bir JavaScript dosyası (fetch-css.js), window.onLoad etkinliğinden sonra Bağlantı öğesini DOM'ye ekler. Bu, dosyanın yalnızca tarayıcı JS dosyasını ayrıştırmayı ve yürütmeyi bitirdikten sonra getirildiği anlamına gelir. Benzer şekilde, main.css içinde belirtilen web yazı tipi (K2D.woff2) yalnızca CSS dosyasının indirilmesi tamamlandığında getirilir.

Kritik istek zinciri, tarayıcı tarafından önceliklendirilen ve getirilen kaynakların sırasını temsil eder. Bu web sayfası için şu anda aşağıdaki gibi görünür:

├─┬ / (initial HTML file)
  └── fetch-css.js
    └── main.css
      └── K2D.woff2

CSS dosyası istek zincirinin üçüncü düzeyinde olduğundan Lighthouse bunu geç keşfedilen bir kaynak olarak tanımlamıştır.

Kritik kaynakları önceden yükleme

main.css dosyası, sayfa yüklenir yüklenmez gereken kritik bir öğedir. Uygulamanızda geç kalan bu kaynak gibi önemli dosyalarda, dokümanın başına bir Bağlantı öğesi ekleyerek tarayıcıyı daha erken indirmesi için bilgilendirmek üzere bir link preload etiketi kullanın.

Bu uygulama için bir ön yükleme etiketi ekleyin:

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
</head>

as özelliği hangi kaynak türünün getirildiğini tanımlamak için, as="style" özelliği ise stil sayfası dosyalarını önceden yüklemek için kullanılır.

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

Önceden yüklenmiş kaynak içeren ağ paneli

Tarayıcının, dosyayı getirmekten sorumlu JavaScript'in ayrıştırma işlemi tamamlanmadan CSS dosyasını nasıl getirdiğine dikkat edin. Önceden yükleme ile tarayıcı, web sayfası için kritik olduğunu varsayarak kaynak için önleme amaçlı bir getirme yapacağını bilir.

Doğru şekilde kullanılmazsa önceden yükleme, kullanılmayan kaynaklar için gereksiz isteklerde bulunarak performansa zarar verebilir. Bu uygulamada details.css, projenin kökünde bulunan ancak ayrı bir /details route için kullanılan başka bir CSS dosyasıdır. Önceden yüklemenin nasıl yanlış kullanılabileceğine dair bir örnek göstermek amacıyla bu kaynak için de bir önceden yükleme ipucu ekleyin.

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
  <link rel="preload" href="details.css" as="style">
</head>

Uygulamayı yeniden yükleyin ve paneline göz atın. Web sayfası tarafından kullanılmıyor olsa bile details.css öğesini almak için istekte bulunuldu.

Gereksiz önceden yükleme ile ağ paneli

Chrome, önceden yüklenmiş bir kaynak yüklendikten sonraki birkaç saniye içinde sayfa tarafından kullanılmazsa Konsol panelinde bir uyarı görüntüler.

Konsolda önceden yükleme uyarısı

Web sayfanız tarafından hemen kullanılmayan önceden yüklenmiş kaynaklarınız olup olmadığını belirlemek için bu uyarıyı bir gösterge olarak kullanın. Artık bu sayfa için gereksiz ön yükleme bağlantısını kaldırabilirsiniz.

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
  <link rel="preload" href="details.css" as="style">
</head>

as özelliği için kullanılması gereken doğru değerlerle birlikte getirilebilecek tüm kaynak türlerinin listesi için Önceden Yükleme hakkındaki MDN makalesine bakın.

Gelecekteki kaynakları önceden getir

Önceden getirme, farklı bir gezinme rotasında kullanılan ancak geçerli sayfa için gereken diğer önemli öğelere göre daha düşük önceliğe sahip bir öğe için istek göndermek üzere kullanılabilecek başka bir tarayıcı ipucudur.

Bu web sitesinde, resmi tıkladığınızda ayrı bir details/ rotasına yönlendirilirsiniz.

Ayrıntılar rotası

Ayrı bir CSS dosyası, details.css, bu basit sayfa için gereken tüm stilleri içerir. Bu kaynağı önceden getirmek için index.html öğesine bir bağlantı öğesi ekleyin.

<head>
  <!-- ... -->
  <link rel="prefetch" href="details.css">
</head>

Bunun dosya isteğini nasıl tetiklediğini anlamak için Geliştirici Araçları'nda panelini açın ve Önbelleği devre dışı bırak seçeneğinin işaretini kaldırın.

Chrome Geliştirici Araçları&#39;nda önbelleği devre dışı bırakma

Uygulamayı yeniden yükleyin ve diğer tüm dosyalar getirildikten sonra details.css için nasıl çok düşük öncelikli istek yapıldığına bakın.

Önceden getirilen kaynağa sahip ağ paneli

Geliştirici Araçları açıkken web sitesindeki resmi tıklayarak details sayfasına gidin. details.css nesnesini getirmek için details.html içinde bir bağlantı öğesi kullanıldığından kaynak için beklendiği gibi bir istek yapılır.

Ayrıntılar sayfasındaki ağ istekleri

Geliştirici Araçları'nda details.css ağ isteğini tıklayarak ayrıntılarını görüntüleyin. Dosyanın, tarayıcının disk önbelleğinden alındığını fark edeceksiniz.

Disk önbelleğinden alınan ayrıntı isteği

Önceden getirme, tarayıcının boşta kalma süresinden yararlanarak farklı bir sayfa için gereken bir kaynağı erkenden ister. Bu, tarayıcının öğeyi daha erken önbelleğe almasını ve gerektiğinde önbellekten sunmasını sağlayarak gelecekteki gezinme isteklerini hızlandırır.

Webpack ile önceden yükleme ve önceden getirme

Kod bölmeyle JavaScript yüklerini azaltma yayını, bir paketi birden fazla parçaya bölmek için dinamik içe aktarmaların kullanımını inceler. Bu durum, form gönderildiğinde Lodash'ten bir modülü dinamik olarak içe aktaran basit bir uygulamayla gösterilmiştir.

Kod bölme işlemini gösteren Sihirli Sıralayıcı uygulaması

Bu uygulama için Glitch'e buradan erişebilirsiniz.

src/index.js, içinde bulunan aşağıdaki kod bloğu, düğme tıklandığında yöntemi dinamik olarak içe aktarmaktan sorumludur.

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

Bir paketin bölünmesi, başlangıç boyutunu azaltarak sayfa yüklenme sürelerini iyileştirir. Webpack'in 4.6.0 sürümü, dinamik olarak içe aktarılan parçaları önceden yüklemeyi veya önceden getirmeyi destekler. Bu uygulama örnek olarak kullanıldığında, lodash yöntemi tarayıcının boşta kaldığında önceden getirilebilir. Kullanıcı düğmeye bastığında, kaynağın getirilmesinde herhangi bir gecikme olmaz.

Belirli bir yığını önceden getirmek için dinamik içe aktarmada belirli webpackPrefetch yorum parametresini kullanın. Söz konusu uygulamada böyle görünecektir.

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

Uygulama yeniden yüklendikten sonra webpack, belgenin başlığına kaynak için bir önceden getirme etiketi ekler. Bu, Geliştirici Araçları'ndaki Öğeler panelinde görülebilir.

Önceden getirme etiketi içeren öğe paneli

panelindeki isteklerin gözlemlenmesi, bu parçanın diğer tüm kaynaklar istendikten sonra düşük öncelikli olarak getirildiğini de gösterir.

Önceden getirilen istek içeren ağ paneli

Önceden getirme bu kullanım durumu için daha anlamlı olsa da webpack, dinamik olarak içe aktarılan parçaları önceden yükleme desteği de sağlar.

import(/* webpackPreload: true */ 'module')

Sonuç

Bu codelab'den yararlanarak, belirli öğeleri önceden yüklemenin veya önceden getirmenin sitenizdeki kullanıcı deneyimini nasıl iyileştirebileceğini net bir şekilde anlayacaksınız. Bu tekniklerin her kaynak için kullanılmaması gerektiğini ve yanlış kullanılmasının performansa zarar verebileceğini vurgulamak önemlidir. En iyi sonuçlar, yalnızca önceden yükleme veya önceden getirme yoluyla elde edilebilir.

Özetlemek gerekirse:

  • Geç keşfedilen ancak geçerli sayfa için kritik öneme sahip olan kaynaklar için önceden yükleme seçeneğini kullanın.
  • Gelecekteki bir gezinme rotası veya kullanıcı işlemi için gereken kaynaklar için önceden getirme özelliğini kullanın.

Tüm tarayıcılar şu anda hem önceden yüklemeyi hem de önceden getirme özelliğini desteklemez. Bu, uygulamanızın tüm kullanıcılarının performansta artış fark etmeyebileceği anlamına gelir.

Önceden yüklemenin ve önceden getirmenin web sayfanızı nasıl etkileyebileceğine ilişkin belirli yönler hakkında daha fazla bilgi edinmek istiyorsanız şu makalelere bakın: