1. Новая эра архитектуры: Standalone Components и декларативный Control Flow
Новая эра архитектуры: Standalone Components и декларативный Control Flow
Добро пожаловать в курс «Angular v20: Архитектура будущего». Мы начинаем наше погружение с фундаментальных изменений, которые полностью переопределили способ написания приложений на Angular. Если вы помните времена, когда каждое приложение начиналось с создания AppModule, а добавление компонента требовало регистрации в трех разных местах — забудьте это как страшный сон. Angular v20 (и предшествующие ему современные версии) ставит во главу угла простоту, производительность и эргономику разработчика.
В этой статье мы разберем два кита современной архитектуры: Standalone Components (автономные компоненты) и новый Built-in Control Flow (встроенный управляющий поток).
Смерть NgModules и рождение Standalone Components
Долгое время Angular считался «сложным» фреймворком именно из-за системы модулей (NgModules). Модули создавали дополнительный слой абстракции между компонентами, который часто запутывал зависимости и усложнял ленивую загрузку (lazy loading).
Что такое Standalone Component?
Standalone Component — это компонент, который не требует объявления в NgModule. Он самодостаточен. Он сам знает, какие зависимости ему нужны для работы (другие компоненты, директивы или пайпы), и объявляет их прямо в своем декораторе.
!Визуальное сравнение старой модульной системы и современной архитектуры автономных компонентов
Как это выглядит в коде?
В современных версиях Angular (начиная с v19 и переходя в v20) все компоненты, генерируемые через CLI, являются standalone по умолчанию. Однако, чтобы понять суть, давайте посмотрим на структуру:
Обратите внимание на ключевые отличия:
standalone: true: Указывает Angular, что этот компонент не нуждается в модуле (в v20 это поведение по умолчанию, флаг можно опускать, но концепция остается).imports: Раньше мы импортировали зависимости в модуле. Теперь мы делаем это прямо в компоненте. Если UserProfileComponent использует UserCardComponent в своем шаблоне, он обязан добавить его в imports.Преимущества нового подхода
Меньше шаблонного кода (Boilerplate): Вам больше не нужно создавать файл .module.ts для каждой фичи.
* Упрощенное обучение: Новичкам проще понять связь «компонент А использует компонент Б», чем разбираться в иерархии модулей.
* Улучшенный Tree-shaking: Сборщику (bundler) гораздо проще понять, какой код действительно используется, а какой можно выкинуть из финального бандла, так как связи явные и прямые.
Декларативный Control Flow
Второе глобальное изменение касается того, как мы пишем логику внутри HTML-шаблонов. Раньше мы использовали структурные директивы: ngIf, ngFor и *ngSwitch. Они работали, но имели свои недостатки: зависимость от CommonModule, сложность типизации и неочевидный синтаксис для новичков.
Angular v20 стандартизирует новый синтаксис, встроенный прямо в компилятор шаблонов. Он начинается с символа @.
Условный рендеринг: @if
Забудьте о *ngIf. Новый синтаксис интуитивно понятен любому, кто знаком с JavaScript.
Было (Legacy):
Стало (Modern):
Это не просто «сахар». Это конструкция языка шаблонов. Она не требует импорта модулей и работает быстрее.
Циклы: @for
Самое значительное улучшение производительности произошло в циклах. Старый *ngFor часто вызывал проблемы с перерисовкой DOM, если разработчик забывал функцию trackBy.
В новом синтаксисе @for использование трекинга (отслеживания уникальности элементов) стало обязательным. Это гарантирует, что Angular будет перерисовывать только изменившиеся элементы списка, а не весь список целиком.
html @switch (user.status) { @case ('active') { <active-icon /> } @case ('pending') { <pending-icon /> } @default { <unknown-icon /> } } html @defer (on viewport) { <heavy-chart-component /> } @placeholder { <div>Загрузка графика...</div> } @loading { <spinner /> } @error { <div>Не удалось загрузить график</div> } typescript // app.routes.ts export const routes: Routes = [ { path: 'admin', loadComponent: () => import('./admin/admin.component').then(m => m.AdminComponent) } ]; ```
Заключение
Angular v20 — это фреймворк, который сбросил лишний вес. Standalone Components убрали необходимость в сложной ментальной модели модулей, а декларативный Control Flow сделал шаблоны чище, безопаснее и производительнее.
В следующих статьях курса мы углубимся в Signals — новую реактивную модель, которая работает в синергии с этими архитектурными изменениями, обеспечивая гранулярное обновление интерфейса без Zone.js.