Standalone компоненты — это компоненты Angular, которые не требуют объявления в NgModule. Они самодостаточны и сами управляют своими зависимостями через свойство imports в декораторе.
Ключевые аспекты
standalone: true — флаг в декораторе, делающий компонент независимым от модулей
Самодостаточность — компонент сам импортирует необходимые зависимости
Упрощённая архитектура — не нужно создавать и поддерживать NgModule
Angular 14+ — доступны начиная с версии 14, рекомендуемый подход с версии 17
Обратная совместимость — работают вместе с модульными компонентами
Преимущества standalone
Меньше boilerplate-кода (не нужен отдельный модуль)
Явные зависимости — видно, что использует компонент
Проще тестирование — не нужно конфигурировать TestBed с модулем
Tree-shaking работает эффективнее
Частые ошибки на собеседованиях
Путают standalone компоненты с компонентами без зависимостей
Не знают, что standalone компоненты нужно импортировать через imports, а не declarations
Забывают добавить standalone: true в декоратор
Не понимают, как миксовать standalone и модульные компоненты
Введение и проблематика
Традиционно в Angular каждый компонент должен быть объявлен в каком-либо NgModule. Это создаёт дополнительную сложность: нужно создавать модули, следить за declarations, imports, exports.
Standalone компоненты решают эту проблему — они самодостаточны и не требуют NgModule для работы.
Standalone компоненты появились в Angular 14 как developer preview и стали стабильными в Angular 15. С Angular 17 это рекомендуемый подход для новых проектов.
Проблемы модульного подхода
Boilerplate-код для каждого модуля
Сложность понимания зависимостей компонента
Необходимость импортировать модули целиком, даже если нужен один компонент
Сложнее tree-shaking неиспользуемого кода
Базовая теория
Что такое standalone компонент
Standalone компонент — это компонент с флагом standalone: true в декораторе. Он сам управляет своими зависимостями.
typescript
import { Component } from'@angular/core';import { CommonModule } from'@angular/common';@Component({ selector:'app-greeting', standalone:true,// Ключевой флаг imports: [CommonModule],// Зависимости указываются здесь template:` <h1 *ngIf="name">Hello, {{ name }}!</h1> <p *ngIf="!name">Please enter your name</p> `})exportclassGreetingComponent { name ='';}
Сравнение с модульным подходом
typescript
// Standalone компонент — всё в одном файле@Component({ selector:'app-user-card', standalone:true, imports: [CommonModule], template:` <div class="card"> <h2>{{ user.name }}</h2> <p>{{ user.email }}</p> </div> `})exportclassUserCardComponent { @Input() user!:User;}// Использование: просто импортируем компонент@Component({ standalone:true, imports: [UserCardComponent],// Импорт напрямую template:`<app-user-card [user]="currentUser" />`})exportclassProfileComponent {}
Ключевые концепции
Флаг standalone: true
Добавление standalone: true делает компонент независимым от NgModule:
// Standalone компонент можно использовать в NgModule@NgModule({ declarations: [LegacyComponent], imports: [ CommonModule, AlertComponent // Standalone компонент в imports, не в declarations! ]})exportclassLegacyModule {}
🚫
Standalone компоненты добавляются в imports, а НЕ в declarations. Это частая ошибка!