Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 7 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
React hydration hatası, sunucunun HTML olarak ürettiği ilk çıktı ile tarayıcıda React’ın ilk render sırasında üretmeye çalıştığı çıktının aynı olmaması nedeniyle oluşur. React mevcut sunucu HTML’sini yeniden kullanabilmek için bu iki çıktının eşleşmesini bekler. Tarih, rastgele sayı, tarayıcı API’si, kullanıcıya göre değişen veri veya sunucu ve istemcide farklı çalışan koşullu kodlar bu eşleşmeyi bozabilir.

Hydration nasıl çalışır?​


SSR veya statik ön oluşturma kullanan uygulamalarda süreç kabaca şöyledir:

  1. Sunucu, bileşeni çalıştırır ve tarayıcıya başlangıç HTML’sini gönderir.
  2. Tarayıcı bu HTML’yi ekranda gösterir.
  3. JavaScript paketi yüklendiğinde React aynı bileşeni istemcide ilk kez çalıştırır.
  4. React, istemci çıktısını mevcut HTML ile eşleştirerek olay dinleyicilerini ve bileşen davranışını bağlar.

Sunucu ve istemci ilk render’da aynı metni, aynı eleman yapısını ve uyumlu özellikleri üretmelidir. Sadece useEffect sonrasında değişen değerler bu ilk karşılaştırmanın dışında kalır; ancak kullanıcının gördüğü ilk içerik önce sunucu çıktısıyla uyumlu olmalıdır.

En yaygın nedenler​


  • Math.random() veya Date.now() gibi her çalıştırmada değişen değerleri JSX içinde doğrudan kullanmak.
  • Tarih ve sayı biçimlendirmesini sunucuda ve tarayıcıda farklı yerel ayarlarla yapmak.
  • window, document, localStorage veya ekran bilgisi gibi yalnızca tarayıcıda bulunan API’leri render sırasında okumak.
  • Çerez, oturum, kimlik doğrulama veya kullanıcı tercihlerinin sunucuya ve istemciye farklı ulaşması.
  • Geçersiz HTML iç içeliği oluşturmak; örneğin bir p elemanının içine uygun olmayan blok elemanları yerleştirmek.
  • Hydration başlamadan önce veya sırasında bir tarayıcı eklentisinin ya da üçüncü taraf kodun sunucu HTML’sini değiştirmesi.

Sunucuda window’a doğrudan erişmek önce ReferenceError ile SSR’ı bozabilir; bu, oluşmuş iki HTML’nin uyuşmamasından farklı bir hatadır. typeof window kontrolüyle sunucuda bir dalı, tarayıcıda başka bir dalı render etmek ise hydration farkı oluşturabilir. CSR ile yalnız tarayıcıda başlayan her React uygulaması hydration yapmaz; bu tanı SSR/önceden üretilmiş HTML’nin hydrateRoot ile devralındığı akış içindir.

Somut örnek ve doğru düzeltme​


Aşağıdaki bileşen her render’da farklı sayı üretir. Sunucu örneğin 0.42, istemci ise 0.17 üretirse React aynı metni bulamaz:

Kod:
function RandomNumber() {
  return <p>Numara: {Math.random()}</p>;
}

Değerin ilk HTML’de görünmesi gerekmiyorsa, başlangıç değerini sabit tutup rastgele üretimi istemci tarafındaki etkiye taşıyabilirsiniz:

Kod:
import { useEffect, useState } from 'react';

function RandomNumber() {
  const [number, setNumber] = useState(null);

  useEffect(() => {
    setNumber(Math.random());
  }, []);

  return <p>Numara: {number ?? 'Hesaplanıyor...'}</p>;
}

Burada sunucu ve istemcinin ilk çıktısı Hesaplanıyor... olur. useEffect sonrasında sayı gösterilir. Çalışma sonucu hata ortadan kalkıyor ve sayı yalnızca etki sonrasında görünüyorsa düzeltme doğru uygulanmıştır. Ancak rastgele değer SEO, paylaşılabilirlik veya sunucu tarafından üretilen içerik için önemliyse daha iyi çözüm, değeri sunucuda bir kez üretip istemciye prop olarak aktarmaktır.

Hatanın kaynağını bulma ve düzeltme​


  1. Hata mesajındaki bileşen ağacını ve farklı görünen metni belirleyin; doğrudan tüm hydration uyarısını gizlemeyin.
  2. İlgili render kodunda Date, Math.random(), window, document, localStorage ve kullanıcıya bağlı koşulları arayın.
  3. İlk render’ı deterministik yapın: aynı başlangıç prop’larını, sabit bir placeholder’ı veya sunucudan aktarılan veriyi kullanın.
  4. Tarayıcıya özel işlemleri useEffect içine taşıyın. İlk çıktının sunucu ile istemcide yine aynı kaldığını kontrol edin.
  5. Tarih ve sayı biçimlendirmesinde aynı veri ve açık biçimlendirme ayarlarını kullanın; mümkünse biçimlendirilmiş sonucu sunucudan gönderin.
  6. HTML elemanlarının doğru iç içe olduğunu doğrulayın ve üçüncü taraf bileşenleri geçici olarak kaldırarak farkın kaynağını izole edin.
  7. Düzeltmeden sonra üretim derlemesinde de test edin; yalnızca geliştirme ortamında kaybolan uyarıyı çözülmüş kabul etmeyin.

Aşağıdaki karar özeti, hangi yaklaşımın uygun olduğunu gösterir:

Durumİlk render yaklaşımıSonraki işlem
Rastgele veya anlık değerSabit placeholder veya sunucu değeriİstemcide effect ile güncelle
Tarayıcı API’si gerekiyorTarayıcı yokmuş gibi aynı başlangıç çıktısını üretAPI’yi effect içinde oku
Kullanıcıya özel veriVeriyi sunucu ve istemci arasında aynı aktarEksikse yüklenme durumunu göster
HTML yapısı uyuşmuyorGeçerli ve aynı eleman ağacını kurEtkilenen bileşeni yeniden test et

Kaynaklar​



Sık sorulan sorular​

Hydration uyarısını bastırmak sorunu çözer mi?​

Hayır. suppressHydrationWarning kontrollü ve kaçınılmaz farklar için bir kaçış seçeneğidir; tek seviye derinlikte etkilidir ve farklı metni React’in otomatik düzelteceği garantisini vermez. Bastırma yalnızca belirli bir metnin bilerek farklı olması gibi kontrollü durumlarda düşünülebilir. Rastgele veri, yanlış veri aktarımı veya bozuk HTML varsa kök nedeni gizler ve arayüzün beklenmedik davranmasına yol açabilir.

Sadece bir tarih alanı hata veriyorsa ne kontrol edilmelidir?​

Sunucunun ve tarayıcının aynı zaman dilimi, yerel ayar ve giriş verisini kullanıp kullanmadığını kontrol edin. En güvenlisi, ilk çıktıyı sunucuda biçimlendirip istemciye hazır metin olarak aktarmak veya ilk render’da sabit bir yüklenme metni göstermektir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic