محتويات الدورة

React / الأداء والحدود الموثوقة / الدرس 15

عرض الخادم وعقود Hydration

أنتج ترميزا أوليا حتميا واربط سلوك العميل بحد hydration الصحيح.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • SSR وHydration مرحلتان مترابطتان
  • عرض بداية حتمية
  • اختبار الخادم والعميل كحد واحد

SSR وHydration مرحلتان مترابطتان

ينتج عرض الخادم HTML قبل سكربت المتصفح ثم تربط hydration السلوك بترميز متوافق. يختلف ذلك عن createRoot لشجرة عميل جديدة. ينسق الإطار العارض والمدخلات والحزمة والربط فلا تضف جذرا ثانيا. ليست SSR هي Server Components ذات حد التنفيذ والوحدات المنفصل؛ قد تستخدم الصفحة كليهما أو أحدهما.

وجوب توافق أول شجرة عميل

تتوقع hydrateRoot توافق أول عرض مع HTML والمدخلات. عالج الاختلاف عيبا ولا تعتمد ترقيع كل سمة. تسببه الساعة والعشوائية والمحلية والتداخل الذي يصلحه المتصفح وشروط window، وقد تعدل إضافة الترميز فافحص الدليل. لا تخف كل التحذير؛ فـsuppressHydrationWarning منفذ ضيق لا إصلاح عقد متناقض.

عرض بداية حتمية

يقبل المثال تاريخ عرض بيانات ولا يقرأ الساعة. ينتج الخادم والعميل النص نفسه بالسلسلة نفسها. الوحدة مكون لا خادم كامل؛ يمكن اختبار render server ثم hydrate بالمكون والمدخلات نفسها. يثبت عينة لا نشر إطار. يمكن التخصيص بعد الربط بتحديث مقصود مع بيان أثر التحميل والتخطيط.

jsx وحدة مكون — تتطلب مضيف React الموضح بالمقرر
import { useState } from "react";
function Report({ displayDate }) { const [open, setOpen] = useState(false); return <section><h2>Report date: {displayDate}</h2><button type="button" onClick={() => setOpen(x => !x)}>Toggle details</button>{open && <p>Local details</p>}</section>; }
export default function App() { return <main><h1>Deterministic report</h1><Report displayDate="2026-10-25" /></main>; }
الناتج المتوقع
Initial: Report date: 2026-10-25. Toggle details reveals Local details.

التاريخ مدخل مشترك صريح ويكشف الزر التفاصيل بعد خادم وربط متطابقين.

معرفات علاقات مناسبة للربط

يستخدم المثال useId لربط التسمية والوصف دون تصادم عند التكرار، مع بقاء توافق الشجرة وتنسيق بادئات الجذور. ليست useId مفاتيح قوائم؛ تأتي من المجال. يختلف معرف الإتاحة والسجل، وتكسر العشوائية العلاقات والتوافق. افحص الهدف والوصف بعد الربط لا شكل السلسلة فقط.

jsx وحدة مكون — تتطلب مضيف React الموضح بالمقرر
import { useId } from "react";
function Field() { const id = useId(); return <div><label htmlFor={id}>Contact name</label><input id={id} aria-describedby={`${id}-help`} /><p id={`${id}-help`}>Use your preferred name.</p></div>; }
export default function App() { return <main><h1>Generated field relationships</h1><Field /><Field /></main>; }
الناتج المتوقع
Two labeled Contact name inputs with distinct matching label targets.

لكل حقل معرف متميز مرتبط مع حفظ تطابق الشجرة، ولا تعد السلاسل الحرفية ناتجا عاما.

اختبار الخادم والعميل كحد واحد

اختبر العينة عبر الخادم والتحليل والربط والتفاعل وارصد أخطاء التعافي. ضم المحلية والمنطقة والبادئات والغياب والتداخل للخطة، وأبعد الأسرار عن المدخلات المرسلة. لا يثبت الرد ربط المعالجات ولا يختبر العميل وحده hydration. سجل إصدارات العارض والبناء لتمييز التعارض من عدم الحتمية.

الأخطاء الشائعة وإصلاحها

يختلف النص أول الربط

لماذا يحدث؟
قرأ الجانبان مدخلات غير حتمية.
كيف تصلحه؟
شارك البداية وخصص لاحقا عمدا.
كيف تتجنب تكراره؟
اختبر المحلية والمنطقة.

يستبدل HTML الخادم

لماذا يحدث؟
استُخدم جذر عميل جديد.
كيف تصلحه؟
استخدم حد hydrateRoot المختار.
كيف تتجنب تكراره؟
اختبر دخول SSR الحقيقي.

تستخدم useId مفتاح صف

لماذا يحدث؟
اختلط معرف الإتاحة والبيانات.
كيف تصلحه؟
استخدم معرف السجل.
كيف تتجنب تكراره؟
افصل العقود.

اختبر فهمك

1. لماذا قد يسبب فحص typeof window اختلافا؟

اعرض الحل المشروح

إذا اختار ترميزا مختلفا فتختلف البداية دون استثناء. وحدها ثم حدث العميل عمدا أو استخدم حد إطار موثق للعميل فقط.

2. ماذا يضيف اختبار hydration لاختبار العميل؟

اعرض الحل المشروح

أنشئ HTML وحلله بالمتصفح واربط بالمدخلات وطالع التشخيص وفعل معالجا. يفحص ذلك التوافق والربط اللذين يتخطاهما createRoot.

أهم ما تعلمته

  • طابق الوصفين الأوليين.
  • يختلف الربط عن تركيب العميل وRSC.
  • ليست المعرفات المولدة هوية قوائم.

المراجع الرسمية