Мы часто сталкиваемся с ситуацией: несколько команд хотят независимо деплоить части интерфейса, но при этом не превращать сборку в монолит. Однажды крупный интернет-магазин столкнулся с тем, что монолитная фронтенд-сборка требовала 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 день проанализируем вашу архитектуру, предложив прозрачный план. Получите консультацию — оценим ваш проект и предложим прозрачный план.







