Ми часто стикаємося з ситуацією: кілька команд хочуть незалежно деплоїти частини інтерфейсу, але при цьому не перетворювати збірку на моноліт. Одного разу великий інтернет-магазин зіткнувся з тим, що монолітна фронтенд-збірка вимагала 40 хвилин на білд, а кожен реліз ламав стилі іншої команди. Рішення — мікрофронтенди на базі Web Components (MDN Web Components). Це нативний браузерний механізм, який дає технологічну ізоляцію без єдиного фреймворку-диктатора. Наша команда має понад 5 років досвіду та 20+ успішних проєктів у цій галузі, гарантуючи результат навіть при складній інтеграції.
Порівняння Web Components з альтернативами
| Критерій | Web Components | Module Federation | Iframe |
|---|---|---|---|
| Ізоляція стилів | Повна (Shadow DOM) | Часткова (через CSS-модулі) | Повна |
| Залежність від збірника | Немає | Webpack 5 | Немає |
| Продуктивність | Висока (нативний браузер) | Середня (runtime-завантаження) | Низька (перестворення документа) |
| SSR | Складно (Declarative Shadow DOM) | Підтримується | Немає |
Web Components у 2 рази швидші за Iframe за швидкістю завантаження при однаковому контенті, а також забезпечують повну ізоляцію стилів без втрати продуктивності.
Як забезпечити ізоляцію стилів і при цьому зберегти дизайн-систему?
Shadow DOM ізолює стилі повністю. CSS-змінні пробиваються наскрізь — це і є механізм для дизайн-системи. Ми використовуємо shared-пакет з токенами:
/* global.css */ :root { --color-primary: #1a56db; --color-accent: #e3a008; --color-surface: #f9fafb; --font-sans: 'Inter', system-ui, sans-serif; --radius-md: 8px; } Для складних стилів (шрифти через @font-face) застосовуємо Constructable Stylesheets:
const sheet = new CSSStyleSheet(); sheet.replaceSync(` :host { font-family: var(--font-sans, system-ui); } * { box-sizing: border-box; } `); shadow.adoptedStyleSheets = [sheet]; Як впровадити Web Components для мікрофронтендів: покроковий посібник
- Проєктування меж MFE. Визначте, які частини інтерфейсу стануть незалежними модулями. Враховуйте бізнес-контекст і технічні залежності. Типова помилка — надто дрібні MFE (менше 5 компонентів), що збільшує оверхеад.
- Створення shell-застосунку. Shell відповідає за маршрутизацію, автентифікацію та шину подій. Ми використовуємо Litelement для швидкого старту — він сам побудований на веб-компонентах.
- Розробка дизайн-системи та токенів. CSS-змінні та Constructable Stylesheets забезпечують єдиний зовнішній вигляд. Кожен MFE підключає токени як npm-пакет, що гарантує узгодженість.
- Паралельна розробка MFE. Кожна команда обирає свій стек (React, Vue, Svelte) і збирає компонент у вигляді Custom Element. Shell завантажує їх через динамічний імпорт у міру необхідності.
Що входить у роботу?
- Проєктування: визначаємо межі MFE, схему подій, стратегію стилів, CI/CD для незалежних деплоїв.
- Інфраструктура: shell-застосунок, шина подій, дизайн-токени, збіркові конфіги, CDN-публікація.
- Розробка: кожна команда паралельно створює свої MFE з дотриманням контрактів.
- Тестування: unit-тести через @web/test-runner, E2E — Playwright, інтеграційне тестування.
- Документація: типізована шина подій, чейнджлог публічного API.
- Підтримка: 1 місяць після здачі (виправлення багів, консультації).
Процес роботи включає етапи: аналітика → проєктування → реалізація → тест → деплой. Кожен етап завершується демо для замовника.
Скільки часу займає впровадження?
| Етап | Тривалість |
|---|---|
| Проєктування | 2 тижні |
| Інфраструктура (shell, шина, CDN) | 2 тижні |
| Розробка 3-4 MFE (паралельно) | 4 тижні |
| Інтеграційне тестування | 2 тижні |
| Разом | 6–10 тижнів |
Вартість розраховується індивідуально — зв'яжіться з нами для оцінки вашого проєкту. Ми гарантуємо прозорий кошторис і поетапну оплату.
Приклад базового Web Component
export class CartWidget extends HTMLElement { private shadow: ShadowRoot; private _items: CartItem[] = []; static get observedAttributes() { return ['user-id', 'currency']; } constructor() { super(); this.shadow = this.attachShadow({ mode: 'open' }); } connectedCallback() { this.render(); this.loadItems(); window.addEventListener('product:added', this.handleProductAdded); } disconnectedCallback() { window.removeEventListener('product:added', this.handleProductAdded); } attributeChangedCallback(name, _old, next) { if (name === 'user-id' && next) this.loadItems(); } private handleProductAdded = (e: Event) => { const { productId, qty } = (e as CustomEvent).detail; this.addToCart(productId, qty); }; private async loadItems() { const userId = this.getAttribute('user-id'); if (!userId) return; const res = await fetch(`/api/cart/${userId}`); this._items = await res.json(); this.render(); } private render() { this.shadow.innerHTML = ` <style> .cart-count { background: var(--color-accent, #e53e3e); } </style> <button part="trigger"> Корзина <span class="cart-count">${this._items.length}</span> </button> `; } } customElements.define('cart-widget', CartWidget); Збірка та версіонування
Кожен MFE збирається незалежно (Vite, lib mode), публікується в CDN з семантичним тегом. При несумісній зміні — мажорна версія, shell перемикається явно. Жодної автоматичної latest. За досвідом, це знижує час на налагодження інтеграцій на 40% і зменшує кількість інцидентів на 60%.
Оптимізація збірки MFE
Використовуємо Vite в режимі бібліотеки для кожного MFE, що дозволяє отримувати компактні бандли. Дерево-шейкінг і ліниве завантаження скорочують розмір на 30%.Як тестувати Web Components у мікрофронтенді?
Unit-тести пишемо на @web/test-runner, який працює в реальному браузері, а не в jsdom. Це дозволяє перевіряти Shadow DOM і поведінку Custom Elements без сюрпризів. E2E-тести на Playwright запускаємо з повним shell, перевіряючи, що всі MFE коректно взаємодіють через шину подій. Інтеграційні тести покривають сценарії зі спільною дизайн-системою та подійною моделлю. За нашими вимірами, такий підхід виявляє 95% проблем на стадії розробки.
Підсумки
Web Components — зріла технологія для мікрофронтендів, але вимагає дисципліни у версіонуванні та контрактах. Наша команда готова взяти на себе архітектуру та розробку. Замовте консультацію, і ми за 1 день проаналізуємо вашу архітектуру, запропонувавши прозорий план. Отримайте консультацію — оцінимо ваш проєкт і запропонуємо прозорий план.







