AG Coding
1.28K subscribers
488 photos
52 videos
8 files
241 links
Some Challenges And Applications On Frontend Development
maded By @abdoelazizgamal
Don't Forget Follow And Subscribe My
Youtube channel
https://www.youtube.com/c/AbdoELAzizGamal?sub_confirmation=1
Download Telegram
إمتى ظهر الـ Shadow DOM، وظهر ليه، وأهميته إيه؟

مع تقدم تطوير الويب، بقت التطبيقات بتعتمد على libraries و framewoorks زي React وVue.js. ومع تزايد التعقيد في الـUI components، بقت مشكلة إدارة الـstyles والـscripts جوه الـindividual components بتزيد.

المشكلة
قبل ما يظهر الـShadow DOM، كان عندنا مشكلة كبيرة في الـCSS bleeding. لو عندك component معقد، الـstyles بتاعته كانت ممكن تتداخل مع الـstyles بتاعة مكونات تانية في الصفحة. ده بيخلي الحفاظ على الـstyles بشكل منظم ومستقل لكل component عملية صعبة.

ظهور الـShadow DOM
الـShadow DOM ظهر كجزء من الـWeb Components standard علشان يحل المشكلة دي. الـShadow DOM بيوفر بيئة معزولة لأي component، بحيث الـstyles والـscripts جوه الـcomponent ده ما يتأثروش بأي حاجة تانية في الصفحة.

إزاي بيشتغل؟
الـShadow DOM بيشتغل عن طريق إنشاء شجرة DOM مستقلة لكل component. لما بنستخدم الـShadow DOM، بنقدر نعمل encapsulation للـHTML، CSS، والـJavaScript بتاع الـcomponent ده.

مثال بسيط:
class MyComplexElement extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML =
<style>
p {
color: green;
}
</style>
<slot name="my-text"></slot>
<button id="myButton">Click me</button>
;
const button = shadow.querySelector('#myButton');
button.addEventListener('click', () => {
alert('Button inside Shadow DOM clicked!');
});
}
}

customElements.define('my-complex-element', MyComplexElement);


المميزات
Encapsulation
الـstyles جوه الـShadow DOM ما بيأثروش على بقية الصفحة.
Reusability
الـWeb Components بقت أسهل في إعادة الاستخدام.
Maintainability
بقت عملية صيانة الكود أسهل لإن كل component بيبقى مستقل بذاته.

قبل وبعد الـShadow DOM
الـstyles بتتداخل مع بعضها.
صعوبة في إعادة استخدام الكود بدون مشاكل في الـstyles

بعد الـShadow DOM
كل component عنده بيئة معزولة.
سهولة في إعادة استخدام الـWeb Components بدون مشاكل في الـstyles.

الخلاصة
الـShadow DOM قدم حل فعال لمشكلة الـCSS bleeding وخلى إدارة الـWeb Components أسهل وأكتر تنظيماً. مع التقدم في الـWeb standards، بقى الـShadow DOM أداة مهمة خاصة ل (SPAs) والـProgressive Web Apps (PWAs) لأنه بيساعد في تنظيم الكود وتحسين الأداء.

التوافق مع المتصفحات
دعم الـShadow DOM زاد بشكل كبير في السنوات الأخيرة، لكن بعض المتصفحات القديمة قد تحتاج لـpolyfills.

مقارنة بين الـShadow DOM وحلول تانية زي CSS Modules أو CSS-in-JS:
Shadow DOM
بيقدم encapsulation للـstyles والـscripts بشكل مستقل.
CSS Modules
بتوفر scope للـstyles بدون تغييرات في الـDOM.
CSS-in-JS
بتمكنك من كتابة الـstyles جوه JavaScript، مما يديك تحكم أكتر.

مثال عملي أكثر تعقيداً بيوضح كيفية التعامل مع الـevents والـslots في الـShadow DOM


class MyComplexElement extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML =
<style>
p {
color: green;
}
</style>
<slot name="my-text"></slot>
<button id="myButton">Click me</button>
;
const button = shadow.querySelector('#myButton');
button.addEventListener('click', () => {
alert('Button inside Shadow DOM clicked!');
});
}
}

customElements.define('my-complex-element', MyComplexElement);



التطورات المستقبلية المتوقعة للـShadow DOM بتتضمن تحسين الـintegration مع تقنيات ويب جديدة، زي دعم أكتر لـAR/VR والـWebAssembly.



ودا مثال إزاي تستخدم ال shadow dom مع react

import React, { useRef, useEffect } from 'react';

function ShadowComponent() {
const hostRef = useRef(null);

useEffect(() => {
const shadow = hostRef.current.attachShadow({ mode: 'open' });
shadow.innerHTML =
<style>
p { color: blue; }
</style>
<p>This is inside Shadow DOM</p>
;
}, []);

return <div ref={hostRef}></div>;
}
3👍1