Türkçe
  • react
  • lazy
  • suspense

React.lazy'i güvenle kullanın: Hızlı iterasyon yaparken bileşenleri yüklemek için güvenli bir yol

React.lazy, bileşenleri talep üzerine yüklemek ve uygulamanızın performansını artırmak için harika bir yoldur. Ancak, bazen "ChunkLoadError" ve "Loading chunk failed" gibi sorunlara yol açabilir.

Gao
Gao
Founder

İkilem

Günümüzde, yazılım geliştirme popüler "hızlı hareket et ve bir şeyleri bozulmasına izin ver" felsefesi altında daha hızlı bir şekilde ilerliyor. Burada eleştirmek değil niyetim - bu, sadece işlerin mevcut durumu. Ancak, bu hızlı tempo bazen özellikle React'te bileşen yükleme konusunda sorunlara yol açabiliyor.

Eğer React.lazy kullanarak bileşenleri talep üzerine yükleyen bir projede çalışıyorsan, ChunkLoadError ve Loading chunk failed gibi sorunlarla karşılaşmış olabilirsin. İşte bazı olası nedenler:

  • Kullanıcının internet bağlantısının yavaş veya dengesiz olduğu bir ağ sorunu var.
  • Kullanıcı, uygulamanın eski bir sürümünü kullanıyor ve tarayıcı artık mevcut olmayan bir parçayı yüklemeye çalışıyor.

Genellikle, sayfanın basit bir yenilenmesi sorunu çözebilir, ancak bu kullanıcı için harika bir deneyim değildir. Kullanıcı başka bir rotaya geçerken beyaz bir ekran göründüğünü hayal et - bu, uygulaman için iyi bir izlenim bırakmaz.

Hız ihtiyacı ile sorunsuz bir kullanıcı deneyimi arasında denge kurabilir miyiz? Tabii ki. Size nasıl yapılacağını göstereyim (Tabii ki TypeScript ile).

Çözüm

Kaba bir çözüm, tüm parçaların sürümlerini sunucuda kaydetmek olabilir, böylece "eksik parça" sorunu ortadan kalkar. Ancak uygulamanız büyüdükçe, bu çözüm artan disk alanı gereksinimleri nedeniyle uygulanamaz hale gelebilir ve ağ sorununu da çözmez.

Bir yeniden denedikten veya sayfayı yeniledikten sonra sorun çözülüyorsa, bu çözümleri kodumuza ekleyebiliriz. Sorun genellikle kullanıcı başka bir rotaya geçtiğinde ortaya çıktığından, bunu kullanıcı fark etmeden çözebiliriz. Yapmamız gereken tek şey, React.lazy fonksiyonu etrafında yeniden denemeler ve yenilemelerle ilgilenecek bir sarmalayıcı oluşturmaktır.

Bu tür bir çözümü nasıl uygulayacağınızı anlatan harika makaleler zaten var, bu yüzden ben fikrin ve çözümün iç işleyişine odaklanacağım.

Sarmalayıcıyı oluşturun

İlk adım, React.lazy fonksiyonu etrafında bir sarmalayıcı oluşturmaktır:

Yeniden denemeleri işleyin

Ağ sorunları için, importFunction'ı bir tryImport fonksiyonuna sararak yeniden denemeleri işleyebiliriz:

Basit görünüyor, değil mi? Yeniden denemeleri daha verimli bir şekilde işlemek için üstel geri çekilme algoritmasını da uygulayabilirsiniz.

Sayfa yenilemelerini işleyin

Eski sürüm sorununu çözmek için hatayı yakalayabilir ve sayfayı yenileyebiliriz:

Ancak, bu uygulama çok tehlikelidir, çünkü hatanın bir yenileme ile çözülememesi durumunda sonsuz bir yenileme döngüsü yaratabilir. Bu arada, yenileme sırasında uygulama durumu kaybolacaktır. Bu yüzden sayfayı yenilemeye çalıştığımız mesajı saklamak için sessionStorage'ın yardımına ihtiyacımız var:

Artık safeLazy fonksiyonundan gelen hatayı yakaladığımızda bir yenilemeyle çözülemeyecek bir sorun olduğunu biliyoruz.

Aynı sayfada birden fazla lazy bileşeni

Mevcut uygulamada gizli bir tuzak daha var. Eğer aynı sayfada birden fazla lazy bileşeniniz varsa, diğer bileşenler sessionStorage değerini sıfırlayabileceğinden sonsuz bir yenileme döngüsü hala meydana gelebilir. Bu sorunu çözmek için her bileşen için benzersiz bir anahtar kullanabiliriz:

Artık her bileşenin kendi sessionStorage anahtarı olacak ve sonsuz yenileme döngüsü önlenecek. Çözümü incelemeye devam edebiliriz, örneğin:

  • Tüm anahtarları bir dizide toplamak, böylece sadece bir depolama anahtarı gerekli olur.
  • Bir hata atmadan önce sayfayı bir defadan fazla yenilemeyi denemek için bir yenileme sınırı belirleyin.

Ama sanırım fikri anladınız. Testler ve yapılandırmalarla tamamlanmış kapsamlı bir TypeScript çözümü GitHub deposunda mevcuttur. React-safe-lazy paketini de NPM'de yayımladım, böylece hemen projenizde kullanabilirsiniz.

Sonuç

Yazılım geliştirme hassas bir iştir ve en küçük detaylar bile çözmek için çaba gerektirebilir. Bu makalenin, React.lazy ile ilgili sorunları zarif bir şekilde ele almanıza ve uygulamanızın kullanıcı deneyimini iyileştirmenize yardımcı olabileceğini umuyorum.