Блог · Вёрстка
7 ноября 2026

Веб-компоненты
без фреймворков

Custom Elements и Shadow DOM — как собирать переиспользуемые блоки на чистом JS, без React и Vue.

Коротко
  • Custom Elements позволяют объявить собственный HTML-тег (например, <product-card>) с логикой на JS
  • Shadow DOM изолирует стили компонента — они не протекают наружу и не смешиваются со стилями страницы
  • Технология нативная, работает во всех современных браузерах без сборщиков и фреймворков
  • Хорошо подходит для переиспользуемых виджетов на статическом сайте — карточки, аккордеоны, модалки
01 / Зачем

Зачем веб-компоненты на статическом сайте

Переиспользование без сборщика и виртуального DOM

Если на нескольких страницах повторяется одинаковый блок — карточка товара, баннер с уведомлением, аккордеон FAQ — обычно его копируют в HTML каждой страницы. Веб-компонент позволяет объявить его один раз как собственный тег и переиспользовать где угодно, просто вставив <my-widget>.

В отличие от React или Vue, для этого не нужен сборщик, транспилятор или виртуальный DOM — только нативный JavaScript, который браузер понимает сам.

02 / Механика

Как это работает

Три технологии под одним названием

ТехнологияЧто делает
Custom ElementsПозволяет зарегистрировать собственный HTML-тег с JS-классом
Shadow DOMИзолирует внутреннюю разметку и стили компонента от остальной страницы
HTML TemplatesТег <template> — разметка, которая не рендерится сразу, а клонируется по требованию
03 / Пример

Пример простого компонента

Счётчик на 15 строк без единой зависимости

class LikeButton extends HTMLElement {
  connectedCallback() {
    this.innerHTML = `<button>♥ <span>0</span></button>`;
    let count = 0;
    this.querySelector('button').onclick = () => {
      count++;
      this.querySelector('span').textContent = count;
    };
  }
}
customElements.define('like-button', LikeButton);

<!-- в HTML: -->
<like-button></like-button>

Браузер сам вызовет connectedCallback, как только тег <like-button> появится на странице — не нужен ручной поиск элементов через querySelectorAll.

04 / Границы

Когда не стоит связываться

Честная оценка, а не religion

Для сложного приложения с многоуровневым состоянием, роутингом и десятками связанных компонентов — React или Vue дадут более зрелую экосистему инструментов и меньше кода на рутинные задачи.

Веб-компоненты хорошо закрывают точечные задачи: 2-5 переиспользуемых виджетов на в остальном простом статическом сайте, без необходимости тащить целый фреймворк ради этого.

05 / FAQ

Частые вопросы

Короткие ответы на главное

Заменяют ли веб-компоненты React или Vue?

Для больших приложений с сложным состоянием — не полностью. Но для переиспользуемых виджетов на статическом сайте (карточка, аккордеон, модалка) веб-компоненты справляются без лишней зависимости.

Что такое Shadow DOM простыми словами?

Изолированное DOM-дерево внутри компонента — стили и разметка внутри него не пересекаются со стилями остальной страницы, и наоборот.

Поддерживаются ли веб-компоненты во всех браузерах?

Да, все современные браузеры поддерживают Custom Elements и Shadow DOM нативно, без полифилов — эта технология уже не экспериментальная.

Нужны переиспользуемые виджеты на сайте?

Соберём компоненты на чистом JS — без лишних зависимостей и веса фреймворка.