ত্রুটিহাইড্রেশন ব্যর্থ হয়েছে কারণ প্রাথমিক UI সার্ভারে যা রেন্ডার করা হয়েছিল তার সাথে মেলে না (অথবা “পাঠ্য বিষয়বস্তু সার্ভার-রেন্ডার করা HTML এর সাথে মেলে না”) Next.js-এর অর্থ হল সার্ভারের রেন্ডার করা HTML যা ক্লায়েন্টে প্রতিক্রিয়া রেন্ডার করে তার থেকে আলাদা। কেন এটি ঘটে এবং প্রতিটি কারণ কীভাবে ঠিক করা যায় তা এখানে।হাইড্রেশন কি
📋 Table of Contents
- Next.js সার্ভারে (SSR) আপনার পৃষ্ঠাটি HTML-এ রেন্ডার করে, দ্রুত প্রাথমিক প্রদর্শনের জন্য এটিকে ব্রাউজারে পাঠায়, তারপর এটিকে "হাইড্রেটস" করে – ইন্টারঅ্যাক্টিভিটি সংযুক্ত করে। হাইড্রেশনের জন্য সার্ভার-রেন্ডার করা এইচটিএমএল এবং ক্লায়েন্টের প্রথম রেন্ডার সঠিকভাবে মেলে। যদি তারা ভিন্ন হয়, প্রতিক্রিয়া একটি হাইড্রেশন ত্রুটি ছুঁড়ে দেয় কারণ এটি অমিলটি মিলাতে পারে না।
- কারণ 2: তারিখ এবং সময়
- কারণ 3: এলোমেলো মান
- কারণ 4: অবৈধ HTML নেস্টিং
- কারণ 5: ব্রাউজার এক্সটেনশনগুলি HTML পরিবর্তন করছে
- কারণ 6: ক্লায়েন্ট স্টেটের উপর ভিত্তি করে শর্তসাপেক্ষ রেন্ডারিং
- ক্লায়েন্ট-অনলি কম্পোনেন্ট প্যাটার্ন
- প্রায়শই জিজ্ঞাসিত প্রশ্ন
- প্রশ্ন: হাইড্রেশন ত্রুটির কারণ কী?
- Next.js হাইড্রেশন ত্রুটি মানে সার্ভার-রেন্ডার করা HTML ক্লায়েন্টের প্রথম রেন্ডারের সাথে মেলে না। কারণগুলি সামঞ্জস্যপূর্ণ:
Next.js সার্ভারে (SSR) আপনার পৃষ্ঠাটি HTML-এ রেন্ডার করে, দ্রুত প্রাথমিক প্রদর্শনের জন্য এটিকে ব্রাউজারে পাঠায়, তারপর এটিকে “হাইড্রেটস” করে – ইন্টারঅ্যাক্টিভিটি সংযুক্ত করে। হাইড্রেশনের জন্য সার্ভার-রেন্ডার করা এইচটিএমএল এবং ক্লায়েন্টের প্রথম রেন্ডার সঠিকভাবে মেলে। যদি তারা ভিন্ন হয়, প্রতিক্রিয়া একটি হাইড্রেশন ত্রুটি ছুঁড়ে দেয় কারণ এটি অমিলটি মিলাতে পারে না।
কারণ 1: রেন্ডারের সময় ব্রাউজার-অনলি API ব্যবহার করা
কারণ 2: তারিখ এবং সময়
// 🐛 window/localStorage don't exist on the server → mismatch
function Component() {
const theme = localStorage.getItem('theme'); // ❌ undefined on server
return <div className={theme}>...</div>;
}
// ✅ Access browser APIs only after mount (in useEffect)
function Component() {
const [theme, setTheme] = useState(null);
useEffect(() => {
setTheme(localStorage.getItem('theme')); // runs only on client
}, []);
return <div className={theme || 'default'}>...</div>;
}
কারণ 3: এলোমেলো মান
// 🐛 The server and client render at different times → mismatch
function Component() {
return <div>{new Date().toLocaleString()}</div>; // ❌ differs
}
// ✅ Render the date only on the client
function Component() {
const [date, setDate] = useState(null);
useEffect(() => { setDate(new Date().toLocaleString()); }, []);
return <div>{date ?? 'Loading...'}</div>;
}
কারণ 4: অবৈধ HTML নেস্টিং
// 🐛 Math.random() produces different values on server vs client
function Component() {
const id = Math.random(); // ❌ different each render
return <div id={id}>...</div>;
}
// ✅ Use React's useId for stable IDs, or generate in useEffect
import { useId } from 'react';
function Component() {
const id = useId(); // stable across server and client
return <div id={id}>...</div>;
}
কারণ 5: ব্রাউজার এক্সটেনশনগুলি HTML পরিবর্তন করছে
// 🐛 Invalid nesting gets "corrected" by the browser, causing mismatch
<p>
<div>Content</div> {/* ❌ div inside p is invalid */}
</p>
// The browser moves the div out, but React's tree still has it nested
// ✅ Use valid HTML nesting
<div>
<div>Content</div> {/* valid */}
</div>
// Common culprits: div/p inside p, block elements inside inline elements,
// invalid table structure
কারণ 6: ক্লায়েন্ট স্টেটের উপর ভিত্তি করে শর্তসাপেক্ষ রেন্ডারিং
// Some browser extensions inject attributes/elements into your HTML
// before React hydrates, causing a mismatch (e.g., Grammarly, dark mode extensions)
// This often shows as a mismatch on the body or specific elements.
// You can suppress the warning on a specific element if needed:
<body suppressHydrationWarning>
{/* Use sparingly - only when the mismatch is expected/harmless */}
</body>
// But first verify it's an extension, not a real bug in your code.
ক্লায়েন্ট-অনলি কম্পোনেন্ট প্যাটার্ন
// 🐛 Rendering differently based on something only known on the client
function Component() {
const isMobile = window.innerWidth < 768; // ❌ window undefined on server
return isMobile ? <Mobile /> : <Desktop />;
}
// ✅ Start with a consistent server render, adjust after mount
function Component() {
const [isMobile, setIsMobile] = useState(false); // consistent default
useEffect(() => {
setIsMobile(window.innerWidth < 768);
const onResize = () => setIsMobile(window.innerWidth < 768);
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}, []);
return isMobile ? <Mobile /> : <Desktop />;
}
প্রায়শই জিজ্ঞাসিত প্রশ্ন
// For components that genuinely can't be server-rendered,
// use dynamic import with ssr: false
import dynamic from 'next/dynamic';
const ClientOnlyChart = dynamic(() => import('./Chart'), {
ssr: false, // skip server rendering entirely
loading: () => <div>Loading chart...</div>,
});
// The component renders only on the client - no hydration mismatch possible
প্রশ্ন: হাইড্রেশন ত্রুটির কারণ কী?
উত্তর: রেন্ডারের সময় শুধুমাত্র ব্রাউজার-এর API (উইন্ডো, লোকাল স্টোরেজ) ব্যবহার করা, তারিখ/সময় বা এলোমেলো মান যা সার্ভার এবং ক্লায়েন্টের মধ্যে আলাদা, এবং অবৈধ HTML নেস্টিং। সাধারণ থ্রেড: ক্লায়েন্টের চেয়ে সার্ভারে কিছু ভিন্নভাবে রেন্ডার করে। UseEffect-এ ক্লায়েন্ট-নির্দিষ্ট যুক্তি সরান।
প্রশ্ন: হাইড্রেশন ত্রুটি ছাড়াই আমি কীভাবে লোকাল স্টোরেজ ব্যবহার করব?
উত্তর: রেন্ডারের সময় এটি অ্যাক্সেস করবেন না (এটি সার্ভারে অনির্ধারিত)। এটিকে useEffect-এ পড়ুন (যা শুধুমাত্র ক্লায়েন্টে চলে) এবং মানটি স্টেটে সংরক্ষণ করুন। প্রাথমিকভাবে একটি সামঞ্জস্যপূর্ণ ডিফল্ট রেন্ডার করুন, তারপর মাউন্ট করার পরে আপডেট করুন। এটি সার্ভার এবং ক্লায়েন্ট রেন্ডারের মিল রাখে।
প্রশ্ন: আমার হাইড্রেশন ত্রুটি একটি ব্রাউজার এক্সটেনশন দ্বারা সৃষ্ট হয়. আমি কি করব?
উত্তর: হাইড্রেশনের আগে ব্যাকরণের মতো এক্সটেনশনগুলি বৈশিষ্ট্যগুলিকে ইনজেক্ট করে। এটি এক্সটেনশন যাচাই করুন (এক্সটেনশন অক্ষম করে ছদ্মবেশীতে পরীক্ষা করুন)। যদি এটি নিরীহ হয়, আপনি যোগ করতে পারেন
প্রভাবিত উপাদানে — তবে এটিকে অল্প পরিমাণে এবং শুধুমাত্র নিশ্চিত ক্ষতিহীন বাহ্যিক পরিবর্তনের জন্য ব্যবহার করুন, প্রকৃত বাগ লুকানোর জন্য নয়।suppressHydrationWarningপ্রশ্ন: কখন আমি ssr: false এর সাথে গতিশীল আমদানি ব্যবহার করব?
উত্তর: এমন উপাদানগুলির জন্য যা প্রকৃতপক্ষে সার্ভার-রেন্ডার করা যায় না বা করা উচিত নয় — যেগুলি ব্রাউজার API, তৃতীয় পক্ষের ক্লায়েন্ট-শুধু লাইব্রেরির উপর খুব বেশি নির্ভর করে বা যেগুলি SSR থেকে উপকৃত হয় না। এটি সার্ভার রেন্ডারিং সম্পূর্ণভাবে এড়িয়ে যায়, যে উপাদানটির জন্য হাইড্রেশনের অমিল দূর করে, এর জন্য কোন SSR সুবিধা ছাড়াই।
প্রশ্নঃ কেন এটি উন্নয়নে কাজ করে কিন্তু মাঝে মাঝে ত্রুটি দেখা দেয়?
উত্তর: হাইড্রেশন অমিলগুলি মাঝে মাঝে হতে পারে যখন তারা সময় (তারিখ), এলোমেলোতা, বা বাহ্যিক কারণগুলির (এক্সটেনশন) উপর নির্ভর করে। তারা বাস্তব বাগ এমনকি যখন মাঝে মাঝে. সার্ভার এবং ক্লায়েন্ট রেন্ডারের মধ্যে কী পার্থক্য তা সনাক্ত করে নির্ভরযোগ্যভাবে পুনরুত্পাদন করুন — সাধারণত ব্রাউজার API, সময় বা এলোমেলো মান।
উপসংহার
Next.js হাইড্রেশন ত্রুটি মানে সার্ভার-রেন্ডার করা HTML ক্লায়েন্টের প্রথম রেন্ডারের সাথে মেলে না। কারণগুলি সামঞ্জস্যপূর্ণ:
শুধুমাত্র ব্রাউজার APIs (উইন্ডো, লোকাল স্টোরেজ) রেন্ডারের সময় ব্যবহৃত হয়, তারিখ/সময় বা র্যান্ডম মান যা ভিন্ন, অবৈধ HTML নেস্টিং, এবং ক্লায়েন্ট-নির্দিষ্ট শর্তসাপেক্ষ রেন্ডারিং. ফিক্স প্যাটার্ন একই: ক্লায়েন্ট-নির্দিষ্ট লজিককে -এ সরান (যা শুধুমাত্র ক্লায়েন্টে চলে), প্রাথমিকভাবে একটি সামঞ্জস্যপূর্ণ ডিফল্ট রেন্ডার করুন এবং মাউন্ট করার পরে আপডেট করুন। ব্যবহার করুন স্থিতিশীল আইডি, বৈধ HTML নেস্টিং এবংuseEffect সত্যিকারের ক্লায়েন্ট-শুধুমাত্র উপাদানগুলির জন্য। একবার আপনার সার্ভার এবং ক্লায়েন্ট রেন্ডার মিলে HTML তৈরি করলে, হাইড্রেশন সফল হয়। মূল মানসিক মডেল: প্রাথমিক রেন্ডারের জন্য সার্ভার এবং ক্লায়েন্টে যা কিছু রেন্ডার করা উচিত তা অভিন্ন হতে হবে — ক্লায়েন্ট-নির্দিষ্ট যেকোন কিছুই useEffect-এর অন্তর্গত।useId সত্যিকারের ক্লায়েন্ট-শুধুমাত্র উপাদানগুলির জন্য। একবার আপনার সার্ভার এবং ক্লায়েন্ট রেন্ডার মিলে HTML তৈরি করলে, হাইড্রেশন সফল হয়। মূল মানসিক মডেল: প্রাথমিক রেন্ডারের জন্য সার্ভার এবং ক্লায়েন্টে যা কিছু রেন্ডার করা উচিত তা অভিন্ন হতে হবে — ক্লায়েন্ট-নির্দিষ্ট যেকোন কিছুই useEffect-এর অন্তর্গত।dynamic(..., ssr: false) সত্যিকারের ক্লায়েন্ট-শুধুমাত্র উপাদানগুলির জন্য। একবার আপনার সার্ভার এবং ক্লায়েন্ট রেন্ডার মিলে HTML তৈরি করলে, হাইড্রেশন সফল হয়। মূল মানসিক মডেল: প্রাথমিক রেন্ডারের জন্য সার্ভার এবং ক্লায়েন্টে যা কিছু রেন্ডার করা উচিত তা অভিন্ন হতে হবে — ক্লায়েন্ট-নির্দিষ্ট যেকোন কিছুই useEffect-এর অন্তর্গত।
🔗 Share this article
✍️ Leave a Comment