React Server Components ile 50 bin satır kodu taşımadan önce bilseydik iyi olurdu denenler
(mux.com)- Mux, mux.com ve docs.mux.com'u React Server Components'a taşırken, sunucu ile istemci yürütme sınırlarını ayırmanın bundle boyutunu ve hydration maliyetini doğrudan etkilediğini gördü
- RSC, bileşenlerin veriyi doğrudan sunucuda alıp sonucu streaming ile iletmesini sağlayarak, yavaş veri çağrıları olsa bile ekranın bir bölümünün önce gösterilebilmesine imkân verir
- Gerçek geçişteki en büyük engeller CSS-in-JS desteğinin olmaması, Server Components'taki React Context kısıtları ve sunucu/istemci sınırını sürekli izlemek zorunda olmanın karmaşıklığıydı
- Next.js 13'ün app directory'sinde varsayılan Server Component'tır; kökteki
use clientifadesini kademeli olarak aşağı taşımak yoluyla aşamalı benimseme mümkündür - Suspense,
loading.js, yalnızca sunucuya özel kütüphaneleri koruma veserver-onlygibi kalıplar, yalnızca performans kazanımının gerekli olduğu yerlerde dikkatle uygulanmalı; ekibin bilişsel maliyeti de hesaba katılmalıdır
Mux'ın RSC'ye taşıdığı kapsam
- Mux, dokümantasyon sitesini yeniden yapılandırıp marka yenilemesi yaparken mux.com ve docs.mux.com'u Server Components'a taşıdı
- React Server Components gerçek kod tabanlarında da uygulanabilir ve kullanmaya değer olabilir, ancak beraberinde kısıtlar ve karmaşıklık da getirir
- Bu deneyim; RSC'nin neden gerekli olduğu, nerelere uygun olduğu, hangi durumlarda zorlayıcı olduğu ve gerçek bir kod tabanına nasıl kademeli olarak dahil edilebileceği etrafında özetleniyor
CSR, SSR/SSG sonrasında RSC'nin hedeflediği sorun
- İlk sunucu render etme yaklaşımlarında PHP gibi teknolojilerle veri sunucuda alınır, ağır CPU işleri işlenir ve istemciye hafif HTML gönderilirdi
- CSR/SPA, render kodunu JavaScript olarak istemciye gönderip etkileşimlerin hızlı işlenmesini sağladı; ancak arama motorlarının JavaScript çalıştırmadığı, sırların sunucuda tutulması gerektiği veya düşük performanslı cihazlar ve yavaş bağlantılarla karşılaşıldığı durumlarda zayıflıkları ortaya çıktı
- SSR/SSG, Next.js ve Gatsby gibi araçlarla sunucuda HTML ve JavaScript'i birlikte üretip istemciye gönderme yöntemidir
- Kullanıcı HTML'i hemen görebilir
- JavaScript yüklendiğinde site etkileşimli hale gelir
- Arama motorları da HTML'i okuyabilir
- Mevcut SSR/SSG'de de maliyetler kalır
- Sayfayı üretmekte kullanılan JavaScript'in büyük kısmını istemciye göndermek ve istemcinin bunu yeniden çalıştırarak HTML ile birleştirmesi, yani hydration, gerekir
- Sunucu render etme, yavaş veritabanı çağrıları veya çok miktarda kod yürütme nedeniyle uzun sürerse kullanıcı beklemek zorunda kalır
React Server Components'ın değiştirdiği nokta
- React Server Components, istemcide değil sunucuda çalışan React bileşenleridir
- RSC destekleyen framework'ler kodun nerede çalışacağını açıkça ayırmaya imkân tanır
- Server Components: yalnızca sunucuda çalışması gereken kod
- Client Components: istemcide çalışması gereken kod
- Çalışma konumu ayrıldığında istemciye gönderilen JavaScript azalır ve hydration sırasında yapılması gereken iş de azalır
- Server Component, bileşenin içinde doğrudan veri alabilir
- Node kütüphaneleri veya
fetchkullanılabilir - Sayfa düzeyinde
getServerSidePropsile veriyi topluca alıp props olarak sürekli aşağı aktarma biçimi azaltılabilir useEffectile karmaşık loading durumları yönetilen vakalar da azalır
- Node kütüphaneleri veya
- Veri alma işi biten Server Component, sonucu istemciye streaming ile iletebilir
- Yavaş bir bileşeni beklerken sitenin geri kalanı önce gösterilebilir
- İstemci tarafındaki kullanıcı eylemlerine yanıt olarak sunucuda veri alıp yanıtı streaming ile iletmek de mümkündür; ancak bu, kesin anlamda RSC değil React Actions kapsamına girer
RSC'nin zorlayıcı yanları
- CSS-in-JS şu anda Server Components'ta çalışmaz
- Mux'ın RSC geçişinde styled-components'tan Tailwind CSS'e geçmek en büyük payı oluşturdu
- CSS-in-JS'e yoğun bağımlı bir kod tabanı için ayrı bir geçiş çalışması gerekir
- React Context yalnızca Client Components'tan erişilebilir
- Server Components arasında props olmadan veri paylaşmak için büyük olasılıkla normal modüller kullanmak gerekir
- React uygulamasının belirli bir alt ağacıyla veriyi sınırlamak için Server Components'ta iyi bir mekanizma yoktur
- Mux dokümantasyon sitesinde Context kullanılan alanlar etkileşimi yoğun olduğu için zaten istemciye gönderilmek zorundaydı; bu yüzden büyük bir sorun olmadı
- Pazarlama sitesinde tema paylaşımı sorun oldu
- pre-footer'daki her bileşenin yeşil bir arka plan üzerinde olduğunu bilmesi gerekiyordu ki koyu yeşil kenarlık kullanabilsin
- Context yerine CSS custom properties yoğun şekilde kullanılarak bu aşıldı
- RSC, yürütme konumu ve veri alma biçimi konusunda esneklik sağlar; ancak aynı ölçüde karmaşıklığı da artırır
- Yeni geliştiricilerin “neyin sunucuda, neyin istemcide çalıştığını” sürekli kontrol etmesi gerekir
- Her PR'da gereksiz yere istemciye gönderilen kodla ilgili geri bildirimler oluşur
- Geliştirme sırasında log'un sunucudan mı tarayıcıdan mı geldiğini anlamak için sık sık
console.logeklenirdi - Caching de ayrı bir karmaşıklık ekler
Next.js 13'te RSC kullanmanın temel yolu
- Yazının yazıldığı an itibarıyla production'a hazır RSC implementasyonu, Next.js 13'ün app directory'sidir
- Next.js 13 app directory'de yazılan bileşenler varsayılan olarak Server Component'tır
- Varsayılan durumda sayfa kodu istemciye gönderilmez
- İstemciye yalnızca HTML iletilir
- Server Component'a
asynceklerseniz bileşenin içinde veri alabilirsiniz - Yavaş veri alma yapan Server Component
React.Suspenseile sarılabilir- İstemcide önce fallback UI gösterilir
- Sunucu veriyi alıp render etmeyi tamamladığında sonuç bileşeni streaming ile iletilir
- Suspense boundary, veri streaming'inin yanı sıra kullanıcı etkileşimlerine göre belirli alanların hydration önceliğini ayarlayan selective hydration için de kullanılabilir
- İstemcide çalışması gereken kodlarda dosyanın en üstüne
"use client"eklenironClicklistener'ı veyauseStategibi istemci durumuna ve etkileşime ihtiyaç duyan bileşenlerde kullanılır"use client"eklenmiş bileşenin import ettiği tüm bileşenler de istemciye gönderilir
- RSC desteklemeyen kütüphaneler Client Component'ta import edilerek istemci bundle'ına dahil edilebilir
- Örnek,
@mux/mux-player-react'i saranClientMuxPlayerbileşenidir
- Örnek,
Server Component ve Client Component seçme kriterleri
- Server Components, istemciye gönderilmesi gerekmeyen kodlar için uygundur
- Blog yazısı gövdesinin render edilmesi
- Kod bloğu syntax highlighting gibi maliyetli işler
- Veri alma
- Client Components, kullanıcı girdisine tepki veren veya zamanla durumu değişen arayüzler için uygundur
useState- Event listener'ları
- İstemci tarafı etkileşimler
- Tüm uygulamayı Client Components olarak yapmak, mevcut SSR framework'lerine benzer şekilde çalışır
- Tüm uygulamayı tek seferde Server Components'a dönüştürmek gerekmez; en fazla fayda sağlayan noktalardan başlayarak kademeli benimsenebilir
Gerçek kod tabanına kademeli olarak dahil etmek için 3 adım
- Mux'ın kullandığı playbook üç adımdan oluşur
- Uygulama köküne
"use client"yönergesi eklemek - Yönergeyi render ağacında mümkün olduğunca aşağı taşımak
- Performans sorunları ortaya çıktığında ileri düzey kalıpları uygulamak
- Uygulama köküne
-
- adımda, Next.js 13'ün en üst düzey
page.tsxdosyasına"use client"eklenerek uygulamanın eskisi gibi çalışması sağlanır
- adımda, Next.js 13'ün en üst düzey
- Sunucu tarafı veri alma gerekiyorsa Client Component'ın ebeveyni olarak Server Component eklenir
- Server Component veriyi alır
- Alınan veriyi props olarak Client Component'a geçirir
- Mevcut
getServerSidePropsrolünün yerini alabilir
-
- adımda
"use client", en üst düzey bileşenden alt bileşenlere taşınır
- İstemci koduna ihtiyaç duymayan
<Title />üzerinden yönerge kaldırılıp saf HTML olarak gönderilebilir - İstemci kodu gerektiren
<Player />hata vereceği için"use client"korunur
- adımda
- Bu yöntem, yeni bileşenlerde ve mevcut refactoring hedeflerinde Server Components'ın düşünülmesini sağlar ve bundle boyutunu bir miktar azaltmaya yardımcı olur
Performans sorunu olduğunda uygulanan kalıplar
- Mux dokümantasyon sitesi çoğunlukla statik olarak üretilir, ancak changelog sidebar'ı CMS'ten alınır
- Sidebar Suspense ile sarılırsa CMS fetch bitene kadar uygulamanın geri kalanının beklemesi gerekmez
- Next.js 13'ün loading.js konvansiyonu da içeride Suspense ve streaming kullanır
- Büyük kütüphaneleri sunucuda tutmak için Client Components ve Server Components yerleşimini ayarlamak gerekir
- Örnek olarak syntax highlighting kütüphanesi Prism sunucuda tutulur
Client Component içine Server Component karıştırma yolu
- Client Component'ın import ettiği bileşenler onunla birlikte Client Component olur
- Server Component'ı Client Component'ın çocuğu olarak tutmak istiyorsanız import etmeyip
childrenveya props olarak geçirmeniz gerekir- Server Component sunucuda render edilir
- Serileştirilmiş sonuç Client Component'a iletilir
- Yanlış yöntem, Client Component dosyasından Server Component'ı doğrudan import etmektir
- Doğru yöntem, en yakın üst Server Component'a çıkıp Server Component'ı Client Component'a çocuk veya prop olarak vermektir
Tek dosyayı yarı sunucu/yarı istemci diye bölemezsiniz
- Bir dosyanın yarısını Server Component, yarısını Client Component yapmak mümkün değildir
- Mux, özelliği iki dosyaya ayıran kalıbı sık kullandı
CodeBlock.server.js: büyük syntax highlighting kütüphanesini import eder ve sunucuda render ederCodeBlock.client.js:useStateveonClickkullanarak kullanıcının kod örnekleri arasında geçiş yapmasını sağlar
- Sunucuda render edilen örnekler props olarak Client Component'a geçirildiği için sunucuya özel işler istemci bundle'ına taşınmaz
index.jsiçindeCodeBlock.server.jsyeniden export edilirse kullanıcılar yalnızcaCodeBlockimport ederek içerideki sunucu/istemci ayrımını düşünmek zorunda kalmaz
Yalnızca sunucuda çalışmasını garanti etme yolu
- Başlarda geliştirme sırasında log'un sunucudan mı tarayıcıdan mı geldiğini anlamak için
console.logeklenirdi - Sunucuya özel kodun bundle'a dahil edilmediğini garanti etmek için server-only package import edilebilir
server-only, büyük kütüphanelerin veya gizli anahtarların yanlış konuma taşınmasını önlemek için yararlıdır- Next.js, ortam değişkenlerinin yanlışlıkla tarayıcı bundle'ına dahil edilmesini engelleyen koruma mekanizmaları sağlar
- Dosyanın en üstündeki
server-onlybakım açısından da yardımcı olur- Bakımı yapan kişi, ilgili dosyanın sunucuda çalıştığını hemen anlayabilir
Benimseyip benimsememeye karar verirken maliyet ve faydalar
- React Server Components ücretsiz elde edilen bir özellik değildir
- Maliyetler CSS-in-JS ve React Context kısıtlarının yanı sıra şunları da içerir
- Sunucu ve istemci yürütme konumunu anlama
- Hydration'ı anlama
- Altyapı maliyeti
- Client Components ile Server Components'ın karıştırılmasından doğan kod karmaşıklığı
- Karmaşıklık, bug'ların girebileceği ve kodun bakım yapılabilirliğinin düşebileceği yüzeyi artırır
- Framework'ler karmaşıklığı azaltır ama ortadan kaldırmaz
- Beklenebilecek faydalar şunlardır
- Daha küçük bundle boyutu
- Daha hızlı yürütme
- SEO için önemli performans iyileştirmeleri
- Karmaşık ve veri yoğun siteler için ileri düzey veri loading kalıpları
- Ekip ek bilişsel maliyeti kaldırmaya hazırsa ve performans kazanımı yeterliyse RSC uygun olabilir
1 yorum
Hacker News yorumları
Sunucu tarafı işlemede istemci, doğrudan görebileceği HTML’i alır
Bunu ben de fark ettim; sunucuya düz metin bir dosya koyarsanız tarayıcıya epey hızlı iletiliyor
.cssile biten başka bir düz metin dosyası koyarsanız tarayıcı bunu nasıl işleyeceğini bildiğinden ilk ekrandaki öğeler hareket edebilir ve oldukça iyi görünebilirGüzel bir numara ama ilk ekranda okunabilen yararlı içerik yanında hâlâ ikincil kalıyor
“Hipermetni daha güçlü kılacak özellikler ekleyelim” nasıl “Artık bu büyük ve tutarsız özellik yığınıyla işe yarar uygulamayı kendiniz uygulayın” noktasına geldi, bilmiyorum
RSC’ye dalmadan önce biraz durup düşünmek iyi olur
Ne inşa etmeye çalışıyor olursanız olun, gerçek bir full-stack framework ya da klasik bir web framework’üyle bunu çok daha kolay, hızlı ve ölçeklenebilir biçimde yapmak mümkün
Rails/Django/Laravel/… üzerine Turbolinks/Htmx/… ekleyebilir ya da sadece biraz istemci tarafı JavaScript serpiştirebilirsiniz
Elixir/Phoenix biliyorsanız birkaç avantajı bir arada da elde edebilirsiniz
Ne kadar çok kişi tweet atarsa atsın, RSC yolunda daha da aşağı inmemek gerek
Sektörde 10 yıldan az deneyimi olanlar, eski vanilla PHP sitelerinde yaşanan temel sorunları yeniden yaşayacak; React bileşenlerinin içine satır içi SQL hook’ları konduğunu bile gördüm
Bu sefer üstüne çok daha fazla tesadüfi karmaşıklık da eklenmiş durumda
Aklınızı koruyun, gerçek ürünü hızlıca çıkarın ve Lamborghini parasını kazanın
CORBA, yerel bileşenlerle uzak bileşenleri karıştıran bir yaklaşım; olgunlaşmıştı ve birçok dilde çalışıyordu
Peki neden herkes kullanmıyor? Bugün çoğu geliştirici adını bile duymamıştır
Bir başka dağıtık bileşen mimarisi yapmak istiyorsanız CORBA’nın ve ardıllarının neden yaygın biçimde yerleşemediğini incelemelisiniz
İpucu şu: gizli bileşen sınırları gizli karmaşıklık yaratır
Öte yandan “sunucuda render edilen HTML” ve “istemcide render edilen HTML” kamplarının ikisi de iyi işliyor
Her web projesinde bu iki seçeneğin de kullanılabiliyor olmasını büyük şans sayıyorum
Umarım RSC çalışmaları, saf istemci tarafında render edilen uygulamalara yönelik React desteğini bulanıklaştırmaz
Tam anlamıyla aşamalı zengin bir frontend uygulamasına kesinlikle ihtiyacınız yoksa, çoğu şeyi LiveView asgari JavaScript ile sunucu tarafı bileşenler üzerinden hallediyor
Üstelik her kullanıcıya sunucu tarafında bir thread bağlanıyor; böylece açık JavaScript handler’ları yazmadan değişiklikleri kullanıcının frontend’ine aktif olarak itebiliyorsunuz
Sektör 10 yıllık döngüler halinde hafıza kaybına uğruyor gibi
Sunucuda render edilen UI’dan uzaklaşmanın gayet geçerli nedenleri vardı
Elbette arama motoru optimizasyonu argümanı hep var; ama derdiniz buysa, sadece geleneksel sunucu şablonlu bir site yapın
Tek sayfa uygulamaların büyük çoğunluğu SSR’a ve onun karmaşıklığına hiç ihtiyaç duymuyor
İlk dashboard arayüzlerinin tamamı Phoenix ile render ediliyordu ve yalnızca gerçekten gelişmiş istemci etkileşimi gerektiren sayfalara tek tek React dahil ediyorduk
İlk ürünümüz analiz dashboard’u olduğu için bu durum kısa sürede neredeyse tüm dashboard’a yayıldı ve müşterilere sunduğumuz API’den yararlanarak tamamen tek sayfa uygulamaya geçmek doğal hale geldi
O zaman 2016’ydı, yani LiveView yoktu; ama bugün o ürünü yeniden yapsak farklı bir karar verir miydik, emin değilim
Blog yazısı, herkese açık pazarlama sitesini çalıştıran uygulamayla ilgili ve gereksinimleri epey farklı; yine de bizim de Elixir/Phoenix kullandığımızı ve sevdiğimizi söylemek istedim
Yaşlandığımı hissediyorum
Günümüz framework’leri fazla büyük ve karmaşık
Basit bir web “Hello world”ü için bile devasa bir build ve derleme pipeline’ı gerekiyor; artık buna sunucu tarafı bileşenler de eklendi
Overhead’in ne kadar olduğunu gerçekten merak ediyorum
Bir Hello world örneğini çalıştırmak için frontend ve backend framework kodlarının kaç katmanından geçildiğini bilmiyorum
Ben F5’e basınca yeniden build edilen 10KB’lık basit bir bileşen framework’üne geri dönerim
Belki ileride gerekebilecek gösterişli özellikler için fazlasıyla erken optimizasyon yapmak gibi
Kümes yapmadan önce karot örneği alıp sismik modelleme yapmak için mühendis tutmanız gerektiğini söylemeye benziyor
Genç geliştiriciler artık bunu görmeye başladı
Biz SOAP ve XML gibi berbat şeyleri bırakıp daha basit ve kullanımı kolay teknolojilere geçtiğimiz gibi, bu nesil de karmaşıklığın zararlı olduğunu yeniden öğreniyor
Belki yeni nesil tekrar ortalığı karıştırmadan önce birkaç yıl boyunca yazılım geliştirmek yeniden eğlenceli hale gelir
Pipeline, belirli kullanım senaryosuna göre gerektiği kadar karmaşık ya da basit olabilir
Sadece statik dosyalarla da yapılabilir, tek bir
esbuildkomutu kullanan küçük bir Makefile ile de; 30 eklentili devasa bir Webpack yapılandırmasıyla da mümkünYapmak istediğiniz şeyin gereksinimlerine ve karmaşıklığına göre istediğiniz gibi seçim yapabilirsiniz
Ayrıca araçları basit bir Hello world yapmanın kolay olup olmadığına göre değerlendirmek, yalnızca işiniz gerçekten böyle uygulamalar yapmaksa faydalıdır
SSR veya türevleri konuşmaya girdiğinde, bunun gereksiz yere daha karmaşık hale gelip gelmediğini hep kendime soruyorum
React sunucu render bileşenleri fazla ileri gitmiş gibi geliyor ve doğal geliştirici deneyimi akışına ters düşüyor
Uygulama karmaşıklığı ikiye katlanıyor, kodlama tuzakları artıp geliştiricileri yavaşlatıyor ve kafalarını karıştırıyor; karşılığında yalnızca küçük bir performans artışı alınıyorsa buna değip değmediğinden şüpheliyim
Eski PHP siteleri ve tek sayfa uygulamasız Rails uygulamaları da uzun süre gayet iyi çalıştı
Next.js ve yeni
appdizin yapısıyla yeni bir uygulama geliştirirken bunları yaşadımBirincisi, neyin sunucuda neyin istemcide gerçekleştiğini akıl yürütmek zor
Anlamak için araştırmak gerekiyor ama hızlı kod yazarken çoğu zaman buna fazla dikkat etmiyorsunuz
Küçük bir değişiklikle sayfanın büyük bir kısmının bir anda sunucudan istemciye taşınmaya çalışması çok kolay
Nihai yayından önce sayfa sayfa dikkatli ve zaman alan doğrulama yapmam gerekeceğini biliyorum ve bu hoşuma gitmiyor
İkincisi, mevcut React kütüphanelerinin önemli bir kısmı hook kullandığı için istemcide çalıştığını varsayıyor
Bu yüzden kod istemciye çekilebiliyor
Yeni paradigmaya katlanmanın amacı hızlı yükleme ve arama motoru optimizasyonu için sunucu tarafı render ise, içe aktarılan kütüphane iyi uyum sağlamazsa bu tamamen boşa gidiyor
Üçüncüsü, yeni Next.js
appdizini paradigmasında bug’lar varHâlâ yeni ve çok karmaşık olduğu için dinamik route’lar, paralel route’lar ve bunların etkileşimleri tamamen bozulabiliyor
Bizzat Next.js GitHub’ına issue açtım ve çok sayıda “bende de öyle” yorumu geldi
Kullandığım yaklaşımlardan birini yakın zamanda bir Vercel geliştiricisi düzeltti, ama ben o sırada etrafından dolaşmak için zaten başka bir yaklaşım seçmiştim
En sinir bozucu olan şey, geliştirme ortamının lazy loading ve caching sihri kullanması
Sayfa farklarını hesaplayıp web soketi gibi bir şeyle kısmi güncellemeler göndermeye çalışıyor gibi, ama tamamen bozularak kurtarılamaz bir duruma gelebiliyor
Bazen yeniden derleme, sunucudan istemciye bir tür iletişimi tetikliyor; Chrome sekmesine geri döndüğümde sekme tamamen donuyor ve süreci Chrome Görev Yöneticisi’nden öldürmek zorunda kalıyorum
Genel olarak hâlâ çok yeni ve pürüzlü kenarları bol bir aşamada
Birçok hook sunucu tarafında da çalışır ve aslında değerleri başlatmak dışında hiçbir şey yapmaz
PHP ile JavaScript’in aslında neredeyse aynı sözdizimine sahip olması ilginç
Fark aşağı yukarı
$simgesi ya davaranahtar sözcüğü kadardı; NodeJS ise “biz sunucuda JS çalıştırmak istiyoruz” dediVe 15 yıl sonra JavaScript sonunda yetişti, fiilen PHP’ye benzer hâle geldi; sadece kısaltmaları daha fazla, öğrenme eğrisi daha dik
Elbette Suspense ile sunucudan istemci bileşenlerine veri akıtmak harika
NextJS 13 kullanıyorum; SSR’ı PHP’de her zaman mümkün olduğu kadar kolay hâle getirmesini seviyorum ve şiddetle tavsiye ederim
İnsanlar ona “kötü tasarımın fraktalı” dediğinde bunu %100 hak ediyordu; sorunu çözmek için başka yerlere bakmaları da makuldü
Bugün PHP çok daha iyi bir dil ve yeniden bakmaya değer, ama eskiden de bugünkü kadar iyiymiş gibi davranmamak gerekir
Ayrıca NodeJS’i React ekosistemine göre yargılamamak gerekir
React tabanlı sistemleri çalıştırmak için gereken inanılmaz miktardaki API ve wrapper React topluluğunun sorumluluğu
Tipik Stockholm sendromu
Pek çok modern gelişmenin mümkün olmasının nedeni de önce tarayıcıların daha iyi hâle gelmesi
Tam bir tur atmış olmaktan ziyade, çok uzaktan bakınca daire gibi görünen bir yığına daha yakın
Bir yandan eşzamanlılık modeli sayesinde daha hızlı backend’ler yapabilmek açısından yenilikçiydi, ama Java veya PHP gibi mevcut backend dillerindeki birçok özellik eksikti; bu yüzden pek çok kalıp yeniden icat edildi
Dilin kendisinin de Java’nın zaten sahip olduğu ve PHP’nin yöneldiği “güvenlik” seviyesine ulaşması yıllar aldı
XML ve onun sağlayabildiği sözleşmesel güvenceler gibi doğrulanmış ve standartlaşmış teknolojiler de ağır olduğu, JSON’ın insan tarafından okunup yazılmasının kolay olduğu gibi gerekçelerle terk edildi
XML’i terk ederek çok zaman ve emek kaybettiğimizi düşünüyorum
REST/JSON API dokümantasyonu hâlâ acı verici
20–25 yıl önce XML payload’larından veri modeli ve parser zaten üretebiliyorduk
XML’in nesi bu kadar sorunluydu hâlâ bilmiyorum
Hat üzerinde JSON’dan biraz daha ağırdı, ama sıkıştırma kullanarak ya da EXI(https://www.w3.org/TR/exi/) ile ikili protokole çevirerek çözülebilecek bir sorundu
EXI gerçekten tutundu mu bilmiyorum, ama o dönemde ne kadar çok XML dolaştığını bildiğim için oldukça umutluydum
O dönemde non-blocking I/O büyük performans artışı sağlıyordu
Ama modern geliştiricilerin kafasında JSON döken ya da toolchain barındıran aptal bir araç seviyesine itilmiş gibi görünüyor
Alıştıkları şeyi kullanıyorlardır, ama bir dokümantasyon sitesi için önbelleklemesi olan hazır bir statik site üreticisi ya da CMS yerine React kullanmak israf gibi görünüyor
Geliştirici açısından React daha eğlenceli olabilir
Stripe, içinde hesap API anahtarının bulunduğu kod parçacıkları gösterip hemen test etmeyi mümkün kılan akımı başlattı
Frontend dokümantasyon sitelerinde neredeyse her zaman dokümanın içinde doğrudan kurcalanabilen çalıştırılabilir örnekler bulunur
Yeni bir projeyi bootstrap etmek çok kolay ve hızlı; kelimenin tam anlamıyla saf HTML projesi başlatmaktan daha kolay
Neyi kaçırıyorum?
Ayrıca eksi oy verenlerin bakış açısını gerçekten merak ediyorum
Statik içerik sonuçta; neden arama kutusu için biraz JavaScript eklenmiş HTML olarak üretilmediğini anlamıyorum
React kullanma nedeni frontend genelinde tek bir dil kullanmak
Birinin bir sitede React, diğerinin Gatsby/Hugo kullanması gibi bölünmelerden kaçınılabiliyor
Next.JS, Gatsby/Hugo ile aynı işleri yapabilirken daha fazla özelliğe sahip ve React tabanlı
Sunucunun her şeyi render ettiği, CSS ve Javascript'in de render edilmiş sayfayı zenginleştirmek için kullanıldığı günleri hatırlayacak kadar yaşlıyım
Web çok karanlık ve aşırı mühendislik yapılmış bir yer hâline geldi
İnanması neredeyse güç
Bu yüzden uygulama geliştirme tarzım önce sunucuda render etmek, sonra zenginleştirmek yönünde
Katlanabilir dropdown'lar ya da jQuery sürükle-bırak güzel özellikler ama js/jQuery döneminin durum yönetimi cehennemini de net hatırlıyorum; oraya dönmek istemem
Şaka bir yana, ilk Geocities sayfam ziyaretçi sayacı ya da marquee gibi şeylerden ibaret HTML'di
Okulda yaptığım ilk PHP uygulaması/projesi de henüz JS kullanmıyordu; statik menüler ve header'lar için frame kullanıyor, veriyi de sadece form submit ile backend'e gönderiyorduk
Öyle zamanlar vardı
Üniversite programının parçası olan ilk bir yıllık stajımda Java backend, sunum katmanında JSX şablonları ve dialog ya da animasyonlu akordeon gibi şeyler için PrototypeJS kullandık
O zaman animasyon, “bu öğenin yüksekliğini saniyede birkaç kez değiştirmek” demekti
İlk işimde sepete ekleme, görsel carousel gibi sayfayı zenginleştiren JS'yi bolca kullandım; bu da jQuery dönemiydi
Sonraki işimde, müşteri destek çalışanlarının SAP benzeri şeylere baktığı bir UI'ı BackboneJS ile berbat şekilde yaptık
Ondan sonraki iş de müşteriye dönük yatırım bankacılığı frontend'ini BackboneJS ile yeniden yapmaktı
Bu, o zamanlar tek sayfa uygulaması denen şeye çok uygun bir kullanım örneğiydi
Arama motoru optimizasyonuna gerek yoktu, saf frontend render yeterince hızlıydı, API merkezliydi ve insanların web ile mobilde aynı API'yi kullanabileceklerini fark ettiği dönemdi
Bana göre web geliştirme araçları hiç bugünkünden daha iyi olmadı; kullanıcı deneyimi de yıllar içinde muazzam şekilde gelişti
AJAX dediğimiz şey, temiz bir ek oyuncaktan istemci bileşenleri ve tek sayfa uygulamaları biçiminde günlük varsayılan bir yapı taşına dönüştü
Sunucu, isterseniz hâlâ güçlüdür; ama dashboard'lar, haritalar, oyunlar, forumlar, ofis uygulamaları, çevrimiçi IDE'ler gibi etkileşimli uygulamalarda güçlü istemci tarafı yetenekler iyidir
Bu sayede günlük uygulamalar, her işletim sistemine özel masaüstü uygulamalarından tüm dizüstü ve masaüstlerini kapsayan genel amaçlı bir platforma büyük ölçekte taşınabildi
Elbette bu güç daha fazla karmaşıklık gerektirdi
HTML/CSS ile blog ya da landing page yazmakla tam bir web uygulaması yazmak çok farklı şeyler
Angular ve React, JS runtime'ı ile dilin kendisinin o dönemin sunucu tarafı dillerine kıyasla çok daha ilkel olduğu bir zamanda, eskisinden katbekat daha karmaşık uygulamalar geliştirmeye yardımcı olmak için oluşturuldu
2010'ların sonlarında, çeşitli JS framework'lerinin sorunun yalnızca çok küçük parçalarını çözdüğü gerçekten sancılı bir dönem vardı
Bugünlerde daha az böyle
Next kazandı ve varsayılan hâline geldi; bunu da hak ediyor
Orta karmaşıklıktaki uygulamalar için uygun bir soyutlama düzeyi sunuyor ve sunucu tarafı render ile istemci tarafı sayfaları iyi harmanlamayı sağlıyor
React server components bu ayrımı daha temiz, birinci sınıf bir kavram hâline getiriyor
Ancak bu yalnızca belli bir karmaşıklık eşiğinin üzerinde anlamlı
İhtiyacınız yoksa kullanmazsınız
Çoğunlukla statik bir blog ya da dokümantasyon sitesiyse daha basit mimariler var
Hâlâ HTML yazıp gerektiği kadar birkaç satır JS serpiştirebilirsiniz; çoğu küçük işletme için WordPress ya da Wix de kullanılabilir
Ama daha karmaşık uygulamalar geliştiriyorsanız, en ufak etkileşim için sunucuya gidip gelerek UI'ı yeniden hesaplayan ve her seferinde tüm HTML sayfasını gönderen yaklaşıma kıyasla React gerçekten rüya gibi
O yaklaşım bağlamı, sayfadaki konumu, yarım doldurulmuş formları kaybettiriyordu; form verisini durum olarak kullanmaya teşvik ediyordu ve yanlışlıkla geri tuşuna basınca ya da kolay bulut ölçeklemesi çıkmadan önceki sık sunucu arızalarında iş kaybetmek yaygındı
Bana göre yalnızca yanlış uygulandığında aşırı mühendisliktir
Doğru kullanım örneğinde bu araçlar gerçekten faydalı, hatta bazen zorunlu
Üzücü olan, gerekmediği ya da hatta zararlı olduğu durumlarda bile bunların çok fazla öğretilmesi ve kullanımının teşvik edilmesi olabilir
Sonuçta işe uygun aracı kullanmak gerekir
React'i Vue, Svelte, HTMX'in önüne koymaya çalışmıyorum; demek istediğim, istemci tarafı karmaşıklığın da bir işe yaradığı
React'in daha modern, kolay, hızlı ve ucuz alternatiflere yetişmeye çalıştığı izlenimini alıyorum
Ama temel sorun olan yeniden render, sık sık gereken memoization ve sızdıran soyutlamaları düzeltmek yerine React daha karmaşık hâle geliyor
Nihai sonuç harika olsaydı bu çabayı anlardım ama değil
React gerçek dünyada benchmark'ların gösterdiğinden daha yavaş; Next daha da kötü
Son dönemde Next ile yapılmış çok yavaş web siteleri gördüm
Gerçekten anlamıyorum
React ekibi React'i iyileştirmek istiyorsa çekirdeği düzeltmeli
Artık ekosistem bağımlılıkları o kadar fazla ki kırılır
Target.com, Walmart.com, Microsoft Teams ve sayısız site React kullanıyor
Devasa bir bileşen ekosistemi ve onun üzerine kurulmuş şirketler de var
Temel kavram bozuk, ama düzeltmek geri kalan her şeyi kırmak anlamına gelebilir
Zaten her şeyi kıracaksanız başka bir şey kullanmak daha iyi
Şu an bağımlılık kütlesi yüzünden React'e bağlı kalarak ilerlemekten başka yol yok
React yeniden render'ı varsayılan alıp çıkma yöntemiyle çalışırken, Vue, Solid, Preact, Svelte'nin hepsi gerekli yerlere dahil olma yöntemiyle çalışıyor
Doğru kullanmayı zorlaştıran ve belirli tür bug'lara açık hâle getiren temel nedenlerden biri bu
Dışarıdan sıradan JavaScript gibi görünse de sürekli çıkmanız gerekip gerekmediğini düşünmek zorundasınız; diğer framework'lerde bu tür bug'lar nadir ya da neredeyse yok
https://react.dev/blog/2023/03/22/react-labs-what-we-have-be...
Neden şimdi kalkıp arka uçta React kullanarak HTML render ettiğimizi anlamıyorum
10 yıl öncesine mi dönüyoruz?
Son zamanlarda Svelte ile Django şablonları arasında sık gidip geliyorum; Svelte’in DOM’u bilmesi bile deneyimi çok daha iyi hale getiriyor
JS olmayan bir şablon sisteminde böyle bir şey gördüğümü hatırlamıyorum
PHP ve jQuery gibi şeyleri de deneyimledim
Üstelik ön uç React ise tüm HTML üretimini tek yerde tutmak çok daha kolay
Üstüne statik tip desteği de var
RSC’nin ya da React’in tüm zamanların en iyi çözümü olduğunu savunmaya çalışmıyorum, ama buradaki karşı argümanların bir kısmı yeterince olgun değil
React/RSC’nin faydaları, sunucunun HTML/CSS ve biraz JavaScript döndürmesiyle teknik olarak aynı şey değil
Hâlâ tek bir uygulama söz konusu; SSR/hydration ile karşılaştırıldığında istemci/sunucu sınırını daha akıllıca ele alan bir yaklaşım
React’in kendini tasarımsal olarak bir çıkmaz sokağa mı soktuğu, çıkış yolunun ne olduğu konusunda daha bilgili karşı argümanları seve seve okurum; ama PHP’ye geri dönmek cevap değil
React öğrenmesi o kadar da zor bir şey değil; geliştirici olmayanların bile birkaç haftalık bootcamp ile temellerini öğrenebilmesinin bir nedeni var
JSX, Django, PHP ve Rails’in şablon sistemlerinden nesnel olarak daha üstün
Gelişigüzel ortaya atılan karşı argümanların yarısını söyleyenlerin, kendi projelerini Lighthouse gibi araçlarla benchmark bile etmemiş olduğunu düşünüyorum