Микрофронтенды

↑ 8.2 Архитектура фронтенда и паттерны · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Тема про масштабирование команд; ожидают знание компромиссов, а не увлечение технологией.

Идея

Разделить большой фронтенд на независимо разрабатываемые и деплоемые части, принадлежащие разным командам, которые собираются в одно приложение.

Способы интеграции

СпособОписаниеПлюсыМинусы
Module Federation (Webpack, Rspack, Vite-плагин)загрузка модулей другого билда на летуобщие зависимости, гранулярностьсвязь версий, отладка
iframeизоляцияполная независимостьUX, навигация, размеры, производительность
Web Componentsкастомные элементывне фреймворкастили, SSR
single-spa / qiankunоркестрация приложений по маршрутамзрелые решениясложность
Серверная сборка (edge/SSI)композиция HTMLSEOинфраструктура
Monorepo с пакетамине микрофронтенды, но модульностьпростотаединый релиз

Module Federation

// host
federation({
  name: 'shell',
  remotes: { orders: 'https://orders.example.com/assets/remoteEntry.js' },
  shared: ['vue', 'vue-router', 'pinia'],
})
 
// использование
const OrdersPage = defineAsyncComponent(() => import('orders/OrdersPage'))

Вопросы проектирования

  • границы по бизнес-доменам, а не по технологиям;
  • общий shell: аутентификация, навигация, дизайн-система;
  • коммуникация: события (CustomEvent, шина), URL, минимально общий стор;
  • общие версии Vue и библиотек (singleton);
  • единая дизайн-система и токены;
  • контракты и обратная совместимость между командами;
  • тестирование: контрактные, интеграционные E2E;
  • производительность: дублирование зависимостей, каскад загрузки.

Когда не нужны

Одна команда, продукт средних размеров. Монолит с хорошей модульной структурой проще и быстрее. Микрофронтенды решают организационную проблему (независимые релизы разных команд), а не техническую.

Вопросы с ответами