برنامه نویسی

Shadow Dom: Encapsulation مؤلفه وب Master برای برنامه های مدرن JavaScript

من به عنوان یک نویسنده پرفروش ، شما را دعوت می کنم تا کتابهای من را در آمازون کشف کنید. فراموش نکنید که مرا در متوسط ​​دنبال کنید و پشتیبانی خود را نشان دهید. ممنون حمایت شما به معنای جهان است!

API Shadow Dom یک رویکرد انقلابی برای توسعه مؤلفه های وب است ، و سطح محاصره ای را که قبلاً در توسعه جلو برای دستیابی به آن دشوار بود ، ارائه می دهد. من به عنوان یک توسعه دهنده JavaScript که با برنامه های وب مدرن کار می کند ، پیدا کردم که Shadow Dom یکی از قدرتمندترین ابزارهای ایجاد اجزای قابل استفاده مجدد است.

درک DOM سایه

Shadow Dom یک درخت DOM جداگانه وصل شده به یک عنصر ایجاد می کند ، که از DOM DOCHENT اصلی جدا شده است. این محصور کردن از نشت سبک و نامگذاری برخورد که اغلب معماری های مبتنی بر مؤلفه طاعون است ، جلوگیری می کند.

اصل اصلی پشت Shadow Dom ساده است: این محافظت از مرز بین داخلی مؤلفه ها و بقیه صفحه را فراهم می کند. این جدایی باعث می شود مؤلفه ها در برنامه های پیچیده قابل اطمینان تر و حفظ شوند.

// Creating a basic shadow DOM
class SimpleComponent extends HTMLElement {
  constructor() {
    super();
    // Create a shadow root
    const shadow = this.attachShadow({mode: 'open'});

    // Create element
    const wrapper = document.createElement('div');
    wrapper.textContent = 'This content is encapsulated';

    // Add to shadow DOM
    shadow.appendChild(wrapper);
  }
}

// Register the custom element
customElements.define('simple-component', SimpleComponent);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تکنیک های جداسازی دامنه

جداسازی DOM پایه و اساس قدرت Shadow Dom است. هنگامی که یک ریشه سایه ایجاد می کنید ، مرزی را ایجاد می کنید که از عناصر داخلی مؤلفه شما از دسترسی یا طراحی از خارج محافظت می کند.

من فهمیدم که استفاده مداوم از سایه باز ، بهترین تعادل بین کپسوله سازی و عملی را فراهم می کند. در حالی که حالت بسته محصور سازی قوی تر را ارائه می دهد ، می تواند اشکال زدایی و قابلیت گسترش مؤلفه را محدود کند.

// DOM isolation example
class IsolatedComponent extends HTMLElement {
  constructor() {
    super();

    // Create shadow root with open mode
    const shadow = this.attachShadow({mode: 'open'});

    // Create internal structure
    shadow.innerHTML = `
      

This content is isolated from the main document

`
; // These selectors won't conflict with the main document const header = shadow.querySelector('#header'); header.style.color = 'blue'; } } customElements.define('isolated-component', IsolatedComponent);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

استراتژی های محصور سازی سبک

محصور سازی سبک شاید عملی ترین مزیت Shadow Dom باشد. سبک های تعریف شده در داخل ریشه سایه فقط برای عناصر موجود در آن اعمال می شود و سبک های خارجی در آن نشت نمی کنند.

هنگام ساخت کتابخانه های مؤلفه ، من به این ویژگی متکی هستم تا بدون در نظر گرفتن محیط یک ظاهر طراحی شده در جایی که از اجزای من استفاده می شود ، اطمینان حاصل شود.

class StyledComponent extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    // Styles only apply within this component
    shadow.innerHTML = `
      
      

This paragraph has encapsulated styles

`
; } } customElements.define('styled-component', StyledComponent);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کار با خواص سفارشی CSS

برای حفظ محصور سازی در حالی که اجازه سفارشی سازی می شود ، خصوصیات سفارشی CSS (متغیرها) ضروری است. آنها می توانند از مرز سایه عبور کنند و بدون شکستن محاصره ، مضامین را امکان پذیر می کنند.

class ThemableComponent extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;
  }
}

customElements.define('themable-component', ThemableComponent);

// Usage with custom properties
/*

Customized content
*/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

رسیدگی به رویداد و بازپرداخت

رویدادهایی که از مرز سایه عبور می کنند ، تحت عنوان مجدد قرار می گیرند ، که هدف رویداد را برای احترام به محاصره تنظیم می کند. این ظرافت برای ساختن اجزای تعاملی با نمایندگی رویداد مناسب بسیار مهم است.

class EventComponent extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;

    // Internal event handling
    const button = shadow.getElementById('internal-button');
    const result = shadow.getElementById('result');

    button.addEventListener('click', (e) => {
      result.textContent = 'Button was clicked!';

      // Custom event that crosses shadow boundary
      const customEvent = new CustomEvent('button-clicked', {
        bubbles: true,
        composed: true, // Allows event to cross shadow boundary
        detail: { time: new Date() }
      });
      this.dispatchEvent(customEvent);
    });
  }
}

customElements.define('event-component', EventComponent);

// Usage
/*
document.querySelector('event-component')
  .addEventListener('button-clicked', (e) => {
    console.log('External handler caught event:', e.detail.time);
  });
*/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مدیریت شکاف برای توزیع محتوا

اسلات ها اجزای سازنده را قادر می سازند تا محتوای خارجی را بپذیرند و ارائه دهند و یک الگوی ترکیب واضح ایجاد کنند. با اسلات های نامگذاری شده ، مؤلفه ها می توانند چندین نقطه درج برای توزیع محتوای ساختاری را تعریف کنند.

class CardComponent extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;

    // Detect when slotted content changes
    const slots = shadow.querySelectorAll('slot');
    slots.forEach(slot => {
      slot.addEventListener('slotchange', (e) => {
        console.log(`Content in ${slot.name || 'default'} slot changed`);
      });
    });
  }
}

customElements.define('card-component', CardComponent);

// Usage
/*

  

Custom Header

This goes in the default slot

Custom Footer

*/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کار با محتوای شکاف دار

دسترسی و یک ظاهر طراحی شده به محتوای شکاف نیاز به تکنیک های ویژه ای دارد. انتخاب کننده :: slotted () به شما امکان می دهد عناصری را که در مؤلفه خود قرار گرفته اند ، سبک کنید.

class MediaCard extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;

    // Access nodes assigned to a slot
    setTimeout(() => {
      const titleSlot = shadow.querySelector('slot[name="title"]');
      const assignedElements = titleSlot.assignedNodes({flatten: true});
      console.log('Elements in title slot:', assignedElements);
    }, 0);
  }
}

customElements.define('media-card', MediaCard);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تمبر الگو برای عملکرد

با استفاده از الگوهای HTML با DOM Shadow ، عملکرد بهینه می شود زیرا محتوای الگوی فقط باید یک بار تجزیه شود ، سپس برای هر نمونه کلون شده است.

// Define a template in the HTML
/*

*/

class UserCard extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    // Clone the template content
    const template = document.getElementById('user-card-template');
    const clone = template.content.cloneNode(true);

    // Fill with data from attributes
    const avatar = clone.querySelector('.avatar');
    avatar.src = this.getAttribute('avatar') || 'default-avatar.png';

    const name = clone.querySelector('.name');
    name.textContent = this.getAttribute('name') || 'Unknown User';

    const role = clone.querySelector('.role');
    role.textContent = this.getAttribute('role') || 'User';

    shadow.appendChild(clone);
  }
}

customElements.define('user-card', UserCard);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نقشه برداری بخشی برای قرار گرفتن در معرض قلاب یک ظاهر طراحی شده

سیستم بخشی اجازه می دهد تا عناصر داخلی خاص را برای یک ظاهر طراحی خارجی بدون شکستن محصور سازی در معرض نمایش قرار دهد. این یک API یک ظاهر طراحی شده برای اجزای شما ایجاد می کند.

class ProgressBar extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;

    this._bar = shadow.querySelector('.bar');
  }

  static get observedAttributes() {
    return ['progress'];
  }

  attributeChangedCallback(name, oldValue, newValue) {
    if (name === 'progress') {
      const progress = parseInt(newValue) || 0;
      this._bar.style.width = `${Math.min(100, Math.max(0, progress))}%`;
    }
  }
}

customElements.define('progress-bar', ProgressBar);

// Usage with part styling
/*


*/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ترکیب پیشرفته با Shadow Dom

ایجاد مؤلفه های پیچیده اغلب شامل ترکیب چندین عناصر سفارشی است که هر کدام دارای سایه خود هستند. این رویکرد ترکیبی به حفظ جدایی نگرانی ها کمک می کند.

// A reusable button component
class FancyButton extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;

    this._button = shadow.querySelector('button');
    this._button.addEventListener('click', e => {
      this.dispatchEvent(new CustomEvent('fancy-click', {
        bubbles: true,
        composed: true
      }));
    });
  }
}

// A dialog component that uses the button component
class FancyDialog extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
      
    `;

    // Set up event listeners
    const cancelBtn = shadow.getElementById('cancel');
    const confirmBtn = shadow.getElementById('confirm');

    cancelBtn.addEventListener('fancy-click', () => {
      this.close();
      this.dispatchEvent(new CustomEvent('dialog-cancel', {
        bubbles: true,
        composed: true
      }));
    });

    confirmBtn.addEventListener('fancy-click', () => {
      this.close();
      this.dispatchEvent(new CustomEvent('dialog-confirm', {
        bubbles: true,
        composed: true
      }));
    });
  }

  // Public API
  open() {
    this.setAttribute('open', '');
  }

  close() {
    this.removeAttribute('open');
  }
}

customElements.define('fancy-button', FancyButton);
customElements.define('fancy-dialog', FancyDialog);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ملاحظات عملکرد

Shadow Dom با پیامدهای عملکرد همراه است. هر ریشه سایه حافظه را به سربار اضافه می کند ، بنابراین مهم است که هنگام ایجاد بسیاری از موارد ، توجه داشته باشید.

// Efficient approach for list rendering
class PerformantList extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});

    // Create the base structure once
    this.shadowRoot.innerHTML = `
      
      
    `;

    this._listElement = this.shadowRoot.querySelector('ul');
  }

  set items(data) {
    // Clear existing items
    while (this._listElement.firstChild) {
      this._listElement.removeChild(this._listElement.firstChild);
    }

    // Create a document fragment for better performance
    const fragment = document.createDocumentFragment();

    // Add new items
    data.forEach(item => {
      const li = document.createElement('li');

      // Create individual shadow roots only if necessary
      if (this.getAttribute('use-shadow') === 'true') {
        const shadow = li.attachShadow({mode: 'open'});
        shadow.innerHTML = `
          
          

${item.text}

`
; } else { // Simple approach for better performance li.textContent = item.text; li.style.cssText = 'display: block; padding: 8px 16px; border-bottom: 1px solid #eee;'; } fragment.appendChild(li); }); this._listElement.appendChild(fragment); } } customElements.define('performant-list', PerformantList);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اشکال زدایی اجزای DOM Shadow

اشکال زدایی DOM سایه می تواند چالش برانگیز باشد زیرا ساختار DOM پنهان است. مرورگرهای مدرن ابزاری برای بازرسی از Shadow Dom ارائه می دهند ، اما اجرای برنامه های اشکال زدایی خود نیز مفید است.

class DebuggableComponent extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({mode: 'open'});

    shadow.innerHTML = `
      
    `;

    // Development mode detection
    if (localStorage.getItem('devMode') === 'true') {
      this._setupDebugMode(shadow);
    }
  }

  _setupDebugMode(shadow) {
    // Add debug styles
    const style = document.createElement('style');
    style.textContent = `
      .container {
        position: relative;
        border: 2px dashed red;
        padding: 8px;
      }
      .debug-panel {
        position: absolute;
        bottom: 100%;
        right: 0;
        background: #f0f0f0;
        border: 1px solid #ccc;
        padding: 4px;
        font-size: 12px;
        z-index: 999;
      }
    `;
    shadow.appendChild(style);

    // Add debug panel
    const debugPanel = document.createElement('div');
    debugPanel.classList.add('debug-panel');
    debugPanel.textContent = this.tagName.toLowerCase();
    shadow.querySelector('.container').appendChild(debugPanel);

    // Log events
    this.addEventListener('click', e => {
      console.log('Component clicked:', this);
      console.log('Shadow root:', this.shadowRoot);
      console.log('Event path:', e.composedPath());
    });
  }
}

customElements.define('debuggable-component', DebuggableComponent);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

سازگاری مرورگر و Polyfills

Shadow Dom اکنون به طور گسترده ای پشتیبانی می شود ، اما برای مرورگرهای قدیمی تر ، ممکن است Polyfills لازم باشد. اینها به شما امکان می دهد از ویژگی های Shadow DOM استفاده کنید در حالی که در محیط های قدیمی بسیار تحقیرآمیز است.

// Feature detection and polyfill loading
(function() {
  // Check if Shadow DOM is supported
  if (!('attachShadow' in Element.prototype)) {
    console.log('Shadow DOM not supported - loading polyfill');

    // Load the polyfill
    const script = document.createElement('script');
    script.src = 'https://unpkg.com/@webcomponents/webcomponentsjs/webcomponents-bundle.js';
    script.onload = () => {
      console.log('Polyfill loaded, initializing components');
      initializeComponents();
    };
    document.head.appendChild(script);
  } else {
    initializeComponents();
  }

  function initializeComponents() {
    // Initialize your components here after ensuring Shadow DOM support
    // ...
  }
})();
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پایان

Shadow DOM نحوه ساخت برنامه های مبتنی بر مؤلفه را در وب تغییر می دهد. این محفظه واقعی را فراهم می کند ، و مؤلفه های وب را در زمینه های مختلف قابل اطمینان تر و حفظ می کند.

تکنیک های تحت پوشش در اینجا – جداسازی DOM ، محاصره سبک ، مدیریت اسلات ، تمبر الگو ، کنترل رویداد و نقشه برداری بخشی – پایه و اساس ساخت اجزای وب قوی با Shadow Dom را تشکیل می دهد.

از آنجا که توسعه وب همچنان به سمت معماری های مبتنی بر مؤلفه تکامل می یابد ، تسلط بر Shadow Dom به یک مهارت اساسی برای توسعه دهندگان جبهه که روی برنامه های پیچیده و قابل حفظ کار می کنند ، تبدیل شده است.


101 کتاب

101 کتاب یک شرکت انتشارات AI محور است که توسط نویسنده تأسیس شده است آراو جوشیبشر با استفاده از فناوری پیشرفته هوش مصنوعی ، ما هزینه های انتشار خود را فوق العاده کم نگه می داریم – برخی از کتاب ها به اندازه کم قیمت هستند 4 دلار– ایجاد دانش با کیفیت در دسترس همه.

کتاب ما را بررسی کنید کد تمیز Golang در آمازون موجود است.

برای به روزرسانی ها و اخبار هیجان انگیز با ما در ارتباط باشید. هنگام خرید کتاب ، جستجو کنید آراو جوشی برای یافتن بیشتر عناوین ما. برای لذت بردن از لینک ارائه شده استفاده کنید تخفیف های خاص!

خلاقیت های ما

حتما خلاقیت های ما را بررسی کنید:

سرمایه گذار مرکزی | سرمایه گذار اسپانیایی مرکزی | سرمایه گذار آلمانی مرکزی | زندگی هوشمند | دوره ها و پژواک | اسرار گیج کننده | هندوتوا | نخبه | مدارس JS


ما در متوسط ​​هستیم

بینش های فنی Koala | Epochs & Echoes World | سرمایه گذار رسانه مرکزی | رمز و رازهای گیج کننده متوسط | علوم و دوره های متوسط | هندوتوا مدرن

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا