- Aşamalı JPEG gibi, JSON verilerinin de önce eksik halde gönderilip istemcinin zaman içinde içeriğin tamamını giderek daha fazla kullanabilmesini sağlayan bir yaklaşım tanıtılıyor
- Mevcut JSON ayrıştırma yöntemi, tüm veri tamamen alınmadan hiçbir işlem yapılamaması gibi verimsizlik sorunlarına sahip
- Veriler breadth-first yaklaşımıyla birden çok parçaya ayrılıyor; henüz hazır olmayan kısımlar Promise olarak işaretleniyor ve hazır oldukça aşamalı biçimde dolduruluyor, böylece istemci tamamlanmamış verileri de kullanabiliyor
- Bu kavram, React Server Components(RSC) için temel yeniliklerden biri ve
<Suspense> ile kasıtlı, aşamalı yükleme durumları kontrol ediliyor
- Veri akışını ve kasıtlı UI yükleme akışını birbirinden ayırarak daha esnek bir kullanıcı deneyimi sunmak mümkün
Aşamalı (Progressive) JPEG ve Progressive JSON fikri
- Aşamalı JPEG, görseli yukarıdan aşağıya tek seferde yüklemek yerine önce bulanık halde tamamını gösterip zamanla netleştirir
- Benzer şekilde, JSON aktarımına da aşamalı yaklaşım uygulanarak tamamı hazır olana kadar beklemeden verinin bir kısmını anında kullanmak mümkün olur
- Örnek JSON veri yapısında, normal yöntemde ayrıştırma ancak son bayt da geldikten sonra yapılabilir
- Bu yüzden istemci, sunucunun yavaş kısımları da dahil olmak üzere (ör. yavaş bir DB'den
comments yüklenmesi) her şey tamamen aktarılana kadar beklemek zorunda kalır; bu da güncel standarttaki ciddi verimsizliklerden biridir
Streaming JSON ayrıştırıcısının sınırları
- Bir streaming JSON ayrıştırıcısı kullanılırsa eksik (ara) veri nesnesi ağacı oluşturmak mümkündür
- Ancak her nesnenin alanları (ör.
footer, birden fazla comment listesi vb.) yalnızca kısmen iletildiğinde tip uyumsuzluğu oluşur, tamamlanma durumunu anlamak zorlaşır ve kullanılabilirlik düşer
- HTML'in streaming render yaklaşımına benzer biçimde, akışın sırayla işlenmesi tek bir yavaş parçanın tüm sonucu geciktirmesi sorununu yine üretir
- Streaming JSON'un genelde yaygın kullanılmamasının nedenlerinden biri de budur
Progressive JSON yapısı önerisi
- Klasik derinlik öncelikli streaming yerine, breadth-first (genişlik öncelikli) yaklaşım öneriliyor
- Önce yalnızca en üst düzey nesne gönderiliyor; alt değerler ise Promise benzeri placeholder'lar olarak bırakılıyor ve hazır oldukça ayrı parçalar halinde dolduruluyor
- Örneğin sunucu, asenkron veri yüklemeleri tamamlandıkça karşılık gelen parçaları gönderiyor; istemci de yalnızca hazır olan kısmı kullanabiliyor
- Böylece asenkron veri alımı (erken yükleme) mümkün oluyor ve tüm yavaş parçaların bitmesini beklemek gerekmiyor
- İstemciyi parça bazında sırasız ve kısmen sıralı alıma dayanıklı kurarsanız, sunucu da farklı parça bölme stratejilerini esnek biçimde uygulayabilir
Inlining ve Outlining: verimli veri aktarımı
- Aşamalı JSON streaming formatı, yeniden kullanılan nesneleri (ör. aynı
userInfo'nun birden çok yerde referanslanması) tekrar saklamadan tek bir parçaya ayırıp her konumda aynı referansı kullanmaya da izin verir
- Yalnızca yavaş kısımlar placeholder olarak ayrılırken, geri kalan kısımlar hemen doldurularak verimli bir veri akışı sağlanır
- Aynı nesne birden çok kez görünüyorsa, yalnızca bir kez gönderilip yeniden kullanılabilir (Outlining)
- Bu sayede döngüsel referanslar (bir nesnenin kendisini referanslaması) da normal JSON'daki gibi sorun yaratmadan parçalar arası dolaylı referanslarla doğal biçimde serileştirilebilir
React Server Components(RSC) içinde aşamalı streaming uygulaması
- Gerçek dünyada React Server Components, aşamalı JSON streaming modelinin en tipik örneklerinden biridir
- Sunucu, dış verileri (ör. Post, Comments) asenkron olarak yükleyen bir yapı kullanır
- İstemci tarafında henüz ulaşmamış bölümler Promise olarak tutulur ve hazır olma sırasına göre UI aşamalı biçimde render edilir
- React'in
<Suspense> özelliğiyle kasıtlı yükleme durumları tanımlanır
- Kullanıcı deneyiminde gereksiz ekran sıçramalarını önlemek için Promise durumları (boşluklar) doğrudan gösterilmez; bunun yerine
<Suspense> fallback ile kademeli yükleme deneyimi tasarlanabilir
- Veri çok hızlı gelse bile geliştirici, gerçek UI'ın tasarlanan aşamalara göre kademeli görünmesini kontrol edebilir
Özet ve çıkarımlar
- React Server Components'in temel yeniliği, bileşen ağacının props'larını dıştan içe doğru aşamalı olarak stream etmesinde yatıyor
- Bu sayede sunucunun tüm veriyi tamamen hazırlamasını beklemeden, önce önemli kısımlar gösterilebilir ve yükleme bekleme durumu daha ince biçimde kontrol edilebilir
- Yalnızca streaming değil, bunu kullanan programlama modelinin de (React'in
<Suspense> yapısı gibi) birlikte bulunması gerekir
- Böylece, tek bir yavaş veri parçasının tüm aktarımı geciktirmesi gibi mevcut yöntemlerin darboğazları hafifletilebilir
1 yorum
Hacker News görüşleri