1. Проектирование архитектуры: модульность, Standalone Components и монорепозитории
Проектирование архитектуры: модульность, Standalone Components и монорепозитории
Добро пожаловать в курс «Разработка корпоративных приложений на Angular». Мы начинаем наше погружение не с написания кода, а с фундамента, на котором строится любое успешное крупное приложение — с архитектуры. В мире Enterprise-разработки цена ошибки на этапе проектирования возрастает экспоненциально по мере роста проекта. Плохая архитектура приводит к «спагетти-коду», невозможности масштабирования и мучительной поддержке.
В этой статье мы разберем три кита современной Angular-разработки: модульность (как стратегию разделения ответственности), Standalone Components (как новый стандарт компоновки) и монорепозитории (как способ организации кода в больших командах).
Что делает приложение «корпоративным»?
Прежде чем говорить о технологиях, определим контекст. Корпоративное (Enterprise) приложение — это не просто «большой сайт». Это система, которая характеризуется:
Чтобы управлять этой сложностью, нам нужна жесткая, но гибкая структура.
Модульность и разделение ответственности
Исторически Angular был строго модульным фреймворком. Хотя появление Standalone Components изменило техническую реализацию, логическая модульность осталась критически важной. Модульность — это способ разбить сложную систему на управляемые, изолированные части.
Вертикальное и горизонтальное разделение
В архитектуре часто используют два подхода к нарезке функционала:
* Горизонтальное разделение (по техническому слою): Все компоненты в одной папке, все сервисы — в другой, все модели — в третьей. Этот подход плохо работает в больших приложениях, так как связные по смыслу части разбросаны по всему проекту. * Вертикальное разделение (по фичам): Мы группируем код вокруг бизнес-функций (например, «Управление пользователями», «Корзина», «Отчеты»). Внутри каждой такой «вертикали» могут быть свои компоненты, сервисы и модели.
!Сравнение горизонтальной и вертикальной архитектуры.
Для Enterprise-приложений мы стремимся к гибридному подходу, часто называемому Feature Slicing или Nx-style architecture (даже без использования Nx). Мы делим приложение на:
booking-feature-search).Такое разделение позволяет четко определить границы ответственности и зависимости.
Эра Standalone Components
До версии Angular 14 основным строительным блоком был NgModule. Чтобы использовать компонент, его нужно было объявить в модуле, экспортировать, а затем импортировать этот модуль в другой модуль. Это создавало много шаблонного кода (boilerplate) и усложняло ментальную модель.
Standalone Components (Автономные компоненты) — это компоненты, директивы или пайпы, которые не требуют включения в NgModule. Они сами управляют своими зависимостями.
Преимущества Standalone API
*.module.ts, которые часто просто дублировали списки импортов.Пример миграции мышления
Раньше мы писали так:
Теперь мы пишем так:
Обратите внимание на флаг standalone: true и массив imports прямо внутри декоратора компонента. Это делает компонент самодостаточной единицей. В корпоративных приложениях это упрощает рефакторинг: если вы хотите перенести компонент в другую библиотеку, вам не нужно распутывать клубок модульных зависимостей.
> Standalone API не убивает модульность как концепцию, он убивает NgModules как технический долг.
Монорепозитории: Nx и масштабирование
Когда у вас одно приложение, обычная структура папок Angular CLI работает нормально. Но в Enterprise часто бывает так:
* Основное веб-приложение для клиентов. * Административная панель для менеджеров. * Мобильное приложение (например, на Ionic/Capacitor). * Общая библиотека UI-компонентов.
Если держать это в разных репозиториях, возникает проблема синхронизации версий и дублирования кода. Решение — Монорепозиторий.
Монорепозиторий — это стратегия организации кода, при которой код нескольких проектов хранится в одном репозитории.
Инструментарий: Nx
Стандартом де-факто для Angular-монорепозиториев является инструмент Nx. Он предоставляет мощные возможности для управления зависимостями и сборкой.
!Граф зависимостей в монорепозитории, показывающий переиспользование кода.
Ключевые преимущества монорепозитория в Enterprise:
shared-ui, Nx пересоберет и протестирует только те приложения, которые используют эту кнопку, а не весь репозиторий. Это критически важно для CI/CD.Структура папок в Nx
Типичная структура выглядит так:
* apps/ — здесь лежат точки входа (контейнеры). Они должны быть максимально тонкими и просто собирать фичи вместе.
* libs/ — здесь живет 95% вашего кода. Библиотеки делятся по типам (Feature, UI, Data-access, Utils) и по доменам (Products, Users, Orders).
Синтез: Как это работает вместе
Идеальная архитектура современного Enterprise Angular приложения выглядит следующим образом:
libs. Каждая библиотека имеет четкий публичный API (файл index.ts), через который она отдает наружу только то, что нужно.Пример конфигурации роутинга с Standalone компонентами:
Заключение
Проектирование архитектуры — это инвестиция. Используя монорепозитории, мы обеспечиваем удобство управления множеством проектов. Применяя Standalone Components, мы снижаем сложность кода и улучшаем производительность. А грамотная модульность (через библиотеки) позволяет команде масштабироваться, не наступая друг другу на ноги.
В следующих статьях мы углубимся в детали реализации, начнем с настройки окружения и создания первой библиотеки в монорепозитории.