Архитектура фронтенд-приложений и дизайн систем
Связь с ролью Senior
В прошлой теме мы зафиксировали ключевую идею: Senior Frontend Developer создаёт ценность через
ответственность и влияние — на код, продукт, команду и процесс.
Архитектура и дизайн-система — две области, где это влияние проявляется особенно заметно:
Архитектура делает продукт предсказуемо изменяемым: снижает риски регрессий, ускоряет поставку, помогает масштабироваться.
Дизайн-система делает интерфейс предсказуемо единообразным: ускоряет разработку, повышает качество UX, уменьшает стоимость изменений.Эта статья про то, как мыслить архитектурно на фронтенде и как связывать технические решения с системой дизайна так, чтобы команда могла стабильно поставлять ценность.
Что такое архитектура фронтенда
Архитектура фронтенд-приложения — это набор структурных решений и правил, которые определяют:
Из каких модулей состоит приложение и кто за что отвечает.
Как проходят данные: от API до UI.
Где лежит бизнес-логика и как она тестируется.
Как приложение развивается: добавляются фичи, меняется дизайн, растёт команда.Важно не путать архитектуру с:
Стеком: React/Vue/Svelte — инструмент, не архитектура.
Папками в репозитории: структура папок должна отражать архитектуру, но сама по себе ею не является.
Красивыми абстракциями: сложность без выгоды ухудшает архитектуру.Критерии хорошей архитектуры
Хорошая архитектура — та, которая помогает достигать целей продукта при реальных ограничениях.
Практичные критерии:
Изменяемость: добавление фичи не требует каскадных правок по всему коду.
Локализация ответственности: понятно, где искать проблему и где вносить изменение.
Контролируемые зависимости: модули не превращаются в «всё зависит от всего».
Тестируемость: критичная логика покрывается тестами без сложной подготовки окружения.
Наблюдаемость: ошибки и деградации можно обнаружить и объяснить.
Эволюционность: можно улучшать постепенно, без переписывания «с нуля».Сеньорская оптика: архитектура оценивается не по «идеальности», а по тому, как она снижает риск и ускоряет поставку.
Слои типичного фронтенд-приложения
Ниже — удобная модель, которая работает для SPA и для MPA (когда страниц несколько, но принципы те же).
Термины:
SPA (Single Page Application) — приложение, где навигация чаще происходит без полной перезагрузки страницы.
MPA (Multi Page Application) — сайт/приложение с несколькими страницами, где навигация обычно ведёт к загрузке нового документа.Один из устойчивых подходов — разделять код по ответственности:
App shell: инициализация приложения, провайдеры, конфигурация, роутинг.
Pages: страницы как композиция фич и виджетов.
Features: пользовательские сценарии (например, «поиск», «оплата», «редактирование профиля»).
Entities: доменные сущности (например, User, Order) и операции вокруг них.
Shared: переиспользуемые UI-компоненты и утилиты.
Infrastructure: HTTP-клиент, логирование, аналитика, работа с хранилищем, фича-флаги.Ключевое правило для снижения связанности:
Зависимости должны быть направлены от верхних уровней к нижним (страницы используют фичи, фичи используют shared), а не наоборот.!Схема показывает типичную слоистую архитектуру и направление зависимостей
Модульность: как правильно «резать» код
Модуль — это часть системы с чёткой зоной ответственности и явным публичным API.
Два распространённых способа декомпозиции
По слоям (layer-first): components/, services/, utils/.
По фичам (feature-first): features/search/, features/checkout/.На практике senior чаще ведёт проект к декомпозиции по фичам (или гибридной модели), потому что это:
Упрощает параллельную работу.
Ограничивает радиус изменений.
Помогает держать бизнес-логику ближе к месту использования.Одна из известных методологий с фокусом на слой + фича — Feature-Sliced Design:
Feature-Sliced DesignПубличный API модуля
Чтобы зависимости были контролируемыми, модуль должен экспортировать только то, что разрешено использовать снаружи.
Практика:
В каждом модуле есть точка входа (например, index.ts), где перечислены публичные экспорты.
Снаружи запрещены «глубокие импорты» вида features/search/internal/something.Это снижает риск случайной привязки к внутренностям, которые потом трудно менять.
Данные и состояние: разделяйте типы, а не инструменты
Состояние на фронтенде удобно делить по природе:
Server state: данные с сервера, кеш, синхронизация, повторные запросы.
Client state: бизнес-состояние на клиенте, которое не является прямым отражением сервера.
UI state: состояние конкретного UI (открыт модал, активная вкладка, фильтр в форме).Ошибочный паттерн, который часто приводит к «разрастанию стора»:
Хранить всё в одном глобальном состоянии без причин.Практичный подход:
Server state держите в библиотеке, которая умеет кеш и инвалидации.
UI state держите как можно ближе к компонентам.
Client state выносите наверх только если оно действительно разделяется между несколькими областями.Примеры реальных инструментов и документации:
TanStack Query
Redux ToolkitИнфраструктурный слой: невидимое, но критичное
Инфраструктура — это код, который не про фичи напрямую, но влияет на надёжность и скорость разработки.
Что обычно входит:
HTTP-клиент и политика ошибок.
Логирование и обработка исключений.
Аналитика событий.
Фича-флаги и конфигурация.
Интеграции с A/B тестами.Сеньорский фокус: стандартизировать инфраструктуру так, чтобы каждая фича не «изобретала» запросы, обработку ошибок и трекинг заново.
Микрофронтенды как архитектурный выбор
Микрофронтенд — подход, при котором фронтенд разбивается на несколько относительно самостоятельных частей, которые могут разрабатываться и поставляться более независимо.
Важно: микрофронтенды — не цель, а инструмент для организационного масштаба.
Когда микрофронтенды оправданы
Несколько команд поставляют крупные части продукта параллельно и часто.
Есть реальная проблема координации релизов в монорепозитории или монолите.
Нужно изолировать риск: отдельные домены продукта можно выкатывать независимо.Когда это почти наверняка преждевременно
Команда маленькая.
Основная проблема — качество и процессы, а не размер.
Нет зрелой инфраструктуры сборки, версионирования и наблюдаемости.Один из распространённых механизмов на вебе — Module Federation:
Документация Module Federation в WebpackСравнение подходов интеграции
| Подход | Плюсы | Минусы | Типичный кейс |
|---|---|---|---|
| Монолитный фронтенд | Простая разработка и отладка | Сложнее масштабировать по командам | 1 команда, быстрый старт |
| Микрофронтенды (runtime интеграция) | Независимые релизы | Сложнее перформанс и наблюдаемость | Несколько команд, разные домены |
| Встраивание через iframe | Хорошая изоляция | Плохая интеграция UX, коммуникация сложнее | Админки, внешние модули |
Дизайн-система: что это и чем не является
Дизайн-система — это набор правил, компонентов и артефактов, которые обеспечивают единый язык между дизайном и разработкой и приводят интерфейсы к повторяемому качеству.
Не путайте:
UI kit — набор компонентов. Это часть дизайн-системы, но не вся система.
Style guide — гайд по стилям (цвета, типографика). Тоже часть, но не всё.Сеньорский взгляд: дизайн-система — это продукт внутри продукта. У неё есть пользователи (команды), SLA (скорость и стабильность), релизы и обратная совместимость.
Из чего обычно состоит дизайн-система
| Артефакт | Что это | Зачем нужно |
|---|---|---|
| Design tokens | Переменные дизайна: цвета, отступы, типографика, радиусы | Единые значения и быстрые изменения темы |
| UI-компоненты | Кнопки, инпуты, модальные окна и т.д. | Переиспользование и единое поведение |
| Паттерны | Готовые решения: формы, таблицы, empty states | Снижение продуктовых ошибок |
| Гайдлайны | Правила использования компонентов и контента | Единообразие UX |
| Доступность | Роли, фокус, контраст, клавиатурная навигация | Инклюзивность и соответствие стандартам |
Практические источники по системному дизайну интерфейсов:
Material Design
Apple Human Interface GuidelinesИнструмент для документирования и разработки UI-компонентов:
StorybookДизайн-токены: мост между дизайном и кодом
Дизайн-токены — это именованные значения, которые выражают решения дизайна (например,
color.text.primary,
space.2,
radius.md).
Практика, которая уменьшает хаос:
Токены описывают смысл, а не конкретное значение (например, text.primary, а не gray900).
Компоненты используют токены, а не «сырые» значения.
Токены позволяют делать темы (например, светлая/тёмная) без переписывания компонентов.Инструмент для сборки и распространения токенов:
Style DictionaryВерсионирование и обратная совместимость дизайн-системы
Дизайн-система почти всегда живёт как библиотека (внутренняя или публичная). Значит, нужны правила совместимости.
Термины:
Breaking change — изменение, после которого потребителям нужно менять код.
SemVer (семантическое версионирование) — соглашение о версиях MAJOR.MINOR.PATCH.База по SemVer:
Semantic VersioningПрактика для зрелой дизайн-системы:
Депрекации: сначала помечаем устаревшее, даём срок миграции, потом удаляем.
Migration guide: короткая инструкция «как перейти».
Автоматизация: линтеры, codemod-скрипты, проверки в CI.Как связать архитектуру приложения и дизайн-систему
Частая ошибка: дизайн-система живёт отдельно и «не пронизывает» продукт.
Рабочая связка выглядит так:
UI-уровень приложения использует компоненты дизайн-системы.
Бизнес-логика и данные остаются в приложении (в фичах/сущностях), а не в дизайн-системе.
Дизайн-система предоставляет расширяемые примитивы (например, Button, Input, Modal), но не тащит продуктовые зависимости.Практичное правило границ:
Дизайн-система знает про UI и доступность.
Приложение знает про сценарии, данные и домен.!Схема показывает границы ответственности между дизайн-системой и продуктовым кодом
Документирование решений: когда senior должен писать
Архитектура не живёт в голове. Чтобы команда работала согласованно, решения нужно фиксировать.
Удобный лёгкий формат — ADR (Architecture Decision Record): короткая запись решения с контекстом и последствиями.
Описание подхода и примеры:
Architecture Decision RecordsМинимальная структура ADR:
Контекст: какая проблема и ограничения.
Варианты: 2–3 разумных подхода.
Решение: что выбрали.
Последствия: плюсы, минусы, риски, что нужно сделать.Сеньорская ценность ADR: снижает повторные споры и делает систему решений прозрачной для новых участников.
Типовые ошибки в архитектуре и дизайн-системах
Ниже — проблемы, которые часто выглядят как «технические», но на самом деле бьют по поставке.
Слишком ранняя сложность: микрофронтенды или абстракции до появления реальных болей.
Глобальное состояние без правил: любой компонент может менять что угодно.
Смешивание домена и UI: бизнес-логика прячется в компонентах и её трудно тестировать.
Дизайн-система как «кладбище компонентов»: много похожих вариантов без единого API.
Отсутствие контрактов: нет правил, что считается публичным API модуля.
Нет стратегии миграций: обновление библиотеки превращается в кризис.Итог
Архитектура фронтенда — это управляемая модульность, ясные границы и предсказуемый поток данных. Дизайн-система — это продуктовый ускоритель: токены, компоненты, правила и процессы, которые масштабируют интерфейс без потери качества.
Как senior, вы не просто выбираете паттерны, а:
Формулируете границы ответственности.
Описываете решения и последствия.
Договариваетесь о правилах и делаете их исполнимыми.
Строите систему, в которой изменения дешевеют со временем, а не дорожают.