Коротка відповідь
middleCustom Elements — це веб‑компоненти, що дозволяють створювати власні HTML‑теги з унікальною логікою та стилями. Вони інтегруються в DOM, підтримують Shadow DOM і слідкують за життєвим циклом через callback‑методи. Це забезпечує повторне використання UI‑компонентів і ізоляцію стилів у великих SPA.
Повне пояснення
-
Що це і навіщо. Custom Elements – це стандарт Web Components, що дозволяє розширювати мову HTML власними тегами. Вони потрібні для створення повторно використовуваних, ізольованих UI‑компонентів у великих додатках.
-
Ключові принципи, терміни, інваріанти. • Tag name – назва тега має містити дефіс (наприклад,
<my-card>). • Shadow DOM – ізольований піддерево, що приховує стилі і структуру від глобального DOM. • Lifecycle callbacks –connectedCallback,disconnectedCallback,attributeChangedCallback. • Observed attributes – масив, що визначає атрибути, за якими слід відстежувати зміни. -
Як це працює.
- Реєстрація:
customElements.define('my-card', MyCard);. - При створенні елемента браузер викликає
connectedCallback. - Якщо атрибут змінюється, викликається
attributeChangedCallback. - При видаленні з DOM –
disconnectedCallback.
- Реєстрація:
-
Практика і реалізація (React/Next.js).
class MyCard extends HTMLElement { constructor() { super(); this.attachShadow({mode: 'open'}); } connectedCallback() { this.shadowRoot!.innerHTML = `<p>${this.getAttribute('title')}</p>`; } } customElements.define('my-card', MyCard);У React можна використовувати через
useEffectабо бібліотекуreact-custom-element. -
Тестування. • Jest + @testing-library/dom:
render(<my-card title="Test"></my-card>);. • Playwright: перевірка відображення в реальному браузері. -
Оптимізація продуктивності. • Використовувати
requestAnimationFrameу callback‑ах. • Мінімізувати кількість Shadow DOM‑вкладок, щоб зменшити рендеринг. -
Accessibility. • Додати
roleі ARIA‑атрибути у Shadow DOM. • Переконатися, що елементи доступні клавіатурою. -
Безпека та валідація. • Санітизація вхідних даних перед вставкою у Shadow DOM, щоб уникнути XSS. • Використовувати CSP‑заголовки для обмеження виконання скриптів.
-
Типові помилки й edge cases. • Заборонено оголошувати тег без дефісу – браузер видасть помилку. • Необхідно оголосити
observedAttributesперед зміною атрибутів. • Перевірка на підтримку Shadow DOM у старих браузерах (Polyfill). -
Cheatsheet + можливі follow‑up питання. •
customElements.define(name, constructor)– реєстрація. •extends: HTMLElement– базовий клас. • Питання: Як працює Shadow DOM із CSS‑інкапсуляцією? Чому потрібен дефіс у назві тега?