خطای hydration در React که به دلیل عدم تطابق بین HTML رندر شده در سرور و کلاینت رخ میدهد.
- استفاده از
localStorageدر سرور - تغییرات DOM در
useEffect - عدم تطابق کلاسهای CSS بین سرور و کلاینت
- Extension های مرورگر که HTML را تغییر میدهند
- مدیریت متمرکز حالت تم
- جلوگیری از دسترسی مستقیم به
localStorageدر سرور - استفاده از
useEffectبرای بارگذاری تنظیمات
- رندر کردن کامپوننتها فقط در سمت کلاینت
- نمایش fallback در زمان SSR
- جلوگیری از hydration mismatch
- مدیریت بهتر فرآیند hydration
- نمایش محتوا فقط پس از تکمیل hydration
- callback برای اطلاع از تکمیل hydration
- اضافه کردن
suppressHydrationWarningبه عناصر HTML و body - جلوگیری از نمایش warning های غیرضروری
- تنظیم حالت اولیه یکسان برای HTML و body
- جلوگیری از layout shift
- بهبود font rendering
import { ThemeProvider } from "@/components/theme-provider"
export default function Layout({ children }) {
return (
<ThemeProvider>
{children}
</ThemeProvider>
)
}import { ClientOnly } from "@/components/ui/client-only"
<ClientOnly fallback={<div>Loading...</div>}>
<ComponentThatNeedsClient />
</ClientOnly>import { HydrationBoundary } from "@/components/ui/hydration-boundary"
<HydrationBoundary
fallback={<div>Loading...</div>}
onHydrationComplete={() => console.log('Hydrated!')}
>
<Component />
</HydrationBoundary>- همیشه از
useEffectبرای دسترسی بهlocalStorageاستفاده کنید - از
ClientOnlyبرای کامپوننتهایی که نیاز به کلاینت دارند استفاده کنید - از
suppressHydrationWarningفقط در موارد ضروری استفاده کنید - حالت اولیه کامپوننتها باید یکسان در سرور و کلاینت باشد
برای تست راهحلها:
- صفحه را refresh کنید
- DevTools را باز کنید و خطاهای console را بررسی کنید
- Network tab را بررسی کنید تا مطمئن شوید SSR درست کار میکند
- Performance tab را بررسی کنید تا مطمئن شوید hydration سریع است