Shadow DOM التصريحي
إرفاق Shadow DOM من HTML دون JavaScript باستخدام shadowrootmode
Shadow DOM التصريحي درس مجاني في HTML Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في HTML Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة HTML Academy 4 دروس في المجموع.
المشكلة التي يحلها
يُنشأ Shadow DOM التقليدي عبر JavaScript (attachShadow). بالنسبة إلى الصفحات المُصيّرة على الخادم، يعني ذلك أن شجرة Shadow DOM تظل فارغة إلى أن تعمل JavaScript، مما يهزم الغرض من SSR المتمثل في تقديم HTML كامل من أول بايت. يحل Declarative Shadow DOM هذه المشكلة.
السمة shadowrootmode
يعلن عنصر <template> الذي يتضمن shadowrootmode="open" عن جذر Shadow DOM في HTML وقت التحليل. يربط المتصفح جذر Shadow DOM بالعنصر الأب تلقائيًا، ويصبح محتوى القالب شجرة Shadow DOM. لا حاجة إلى JavaScript.
<my-card>
<template shadowrootmode="open">
<style>:host { display: block; padding: 16px; }</style>
<slot></slot>
</template>
<p>This goes into the slot</p>
</my-card>SSR مع Web Components
يتيح Declarative Shadow DOM إنشاء مكونات Web Components مُصيّرة فعلًا على الخادم: يُصدر الخادم شجرة Shadow DOM الكاملة ضمن HTML، ويحللها المتصفح ويربطها قبل تنفيذ أي JavaScript، ثم يمكن لـ JavaScript الخاصة بعملية hydration أن تتولى التحكم انطلاقًا من أساس مُصيّر بالكامل. وهكذا تحصل على إمكانات مماثلة لـ SSR الخاص بالأطر.
الوضع: مفتوح أم مغلق
الأوضاع هي نفسها الموجودة في attachShadow الإجرائي: تكشف shadowrootmode="open" عن Shadow DOM من خلال element.shadowRoot، بينما تخفيه shadowrootmode="closed". والسلوك مطابق للنظير الذي يُربط عبر JavaScript.
يُحلَّل مرة واحدة لكل عنصر
يربط المتصفح جذر Shadow DOM في المرة الأولى التي يرى فيها <template shadowrootmode>. بعد ربطه، يُستهلك القالب، ويؤدي الاستعلام عنه لاحقًا إلى عدم العثور على شيء. يطابق هذا دورة حياة attachShadow: إذ يبقى Shadow DOM موجودًا طوال عمر العنصر.
تعمل Slots بصورة طبيعية
تُعرض العناصر الأبناء في Light DOM، وهي <p> الموجودة خارج <template> في المثال، داخل عناصر <slot> الموجودة في شجرة Shadow DOM، تمامًا كما يحدث مع Shadow DOM الإجرائي. وتظل آلية التركيب مطابقة؛ فالاختلاف الوحيد هو آلية الربط.
دمجه مع Custom Elements
إذا كان <my-card> عنصرًا مخصصًا مسجلًا، فستستخدم عملية الترقية جذر Shadow DOM المرتبط مسبقًا بدلًا من استدعاء attachShadow مرة أخرى. ويمكن لصنف العنصر المخصص قراءة this.shadowRoot في connectedCallback دون الحاجة إلى إنشائه.
دعم أدوات الخادم
يُصدر Lit-html's render ومكونات Astro والعديد من الأطر الأخرى Declarative Shadow DOM ضمن مخرجات SSR الخاصة بها. ويمكن تنفيذ ذلك يدويًا؛ فأي نظام يعتمد على قوالب السلاسل النصية يستطيع كتابة قالب shadowrootmode.
دعم المتصفحات
يتوفر Declarative Shadow DOM في Chrome وEdge وSafari وFirefox. وتتجاهل المتصفحات الأقدم عنصر <template> بصمت؛ فالمحتوى الموجود داخل القالب غير مرئي، مما يوفر تدهورًا سلسًا في البيئات التي لا تدعمه.
استراتيجية Polyfill
للحصول على دعم أوسع، يمكن لبرنامج نصي صغير اجتياز DOM وتحويل template[shadowrootmode] إلى جذور Shadow DOM فعلية. شغّله قبل تسجيل أي عنصر مخصص، لضمان رؤية شجرة Shadow DOM المتوقعة عند إجراء ترقيات المكونات لاحقًا.
المقايضات
يكرر Declarative Shadow DOM البنية: فمحتوى <template> موجود في HTML، مع أنه مضمّن أيضًا في صنف المكوّن. وبالنسبة إلى الصفحات التي تحتوي على عدد كبير من المكوّنات نفسها، يؤدي ذلك إلى زيادة حجم الحمولة. وتزيل الأطر هذا التكرار؛ وقد يرغب SSR المكتوب يدويًا في فعل الشيء نفسه.
متى تعتمدها
إذا كنتم تقدمون Web Components وتهتمون بالتصيير من أول بايت أو بتحسين محركات البحث، فاعتمدوا هذه التقنية الآن. فالنتيجة مستقرة ومدعومة، وتحسّن بصورة كبيرة تجربة SSR للتطبيقات القائمة على Web Components. أما التطبيقات التي لا تستخدم Shadow DOM فلا ينطبق عليها ذلك.
اختبار الفهم
ما المشكلة التي يحلها Declarative Shadow DOM مقارنةً بـ attachShadow الإجرائي؟
الملخص
يستخدم Declarative Shadow DOM عنصر <template shadowrootmode="open"> داخل عنصر مخصص لربط جذر Shadow DOM وقت التحليل، من دون الحاجة إلى JavaScript. ويتيح SSR فعليًا لمكونات Web Components، إذ تعمل شجرة Shadow DOM والأنماط المحصورة وSlots قبل hydration. وهو مدعوم في جميع المتصفحات الحديثة، ويتوفر له Polyfill للمتصفحات الأقدم. وتصدره الأطر، مثل Lit وAstro، تلقائيًا.
تعلم HTML مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 40
- الدروس
- 159
الأسئلة الشائعة
هل درس «Shadow DOM التصريحي» مجاني؟
نعم — نص درس «Shadow DOM التصريحي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة HTML Academy، انتقل إلى CoddyKit PRO. تتضمن دورة HTML Academy 4 دروس في المجموع.
ماذا ستتعلم في «Shadow DOM التصريحي»؟
إرفاق Shadow DOM من HTML دون JavaScript باستخدام shadowrootmode تتمرن على HTML Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ HTML Academy؟
لا تُشترط خبرة سابقة. HTML Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «Shadow DOM التصريحي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس HTML Academy هذا؟
نعم. كل درس في HTML Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Shadow DOM التصريحي
- Popover API
- عنصر selectlist
- مُشغّلات الاهتمام وسمة Command