> Какие основные сущности существуют в Angular до версии 16, исключая сигналы? (Angular)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: LeverX

Стек: Angular

> Пример ответа

Короткий ответ

До Angular 16 основными сущностями были: компоненты (components), директивы (directives), сервисы (services), модули (NgModules), pipes, dependency injection, lifecycle hooks, ViewChild/ContentChild, EventEmitter, ChangeDetectionStrategy, а также Zone.js для обнаружения изменений. Эти сущности формировали архитектуру приложения и управление состоянием.

Подробное объяснение

В Angular до версии 16 ключевые сущности включали:

  • Компоненты - строительные блоки UI с шаблоном, стилями и логикой, управляемые через @Component декоратор.
  • Директивы - структурные (*ngIf, *ngFor) и атрибутные (ngClass, ngStyle), изменяющие DOM или поведение элементов.
  • Сервисы - классы с бизнес-логикой, регистрируемые в DI и инжектируемые через конструктор.
  • Модули (NgModules) - организационные единицы, группирующие компоненты, директивы, pipes и сервисы, с @NgModule декоратором.
  • Pipes - трансформация данных в шаблонах (например, date, async).
  • Dependency Injection - механизм предоставления зависимостей через провайдеры и иерархию инжекторов.
  • Lifecycle hooks - методы типа ngOnInit, ngOnChanges, ngAfterViewInit, ngOnDestroy для управления жизненным циклом.
  • ViewChild/ContentChild - декораторы для доступа к дочерним элементам или контенту.
  • EventEmitter - для эмиссии событий из компонентов.
  • ChangeDetectionStrategy - стратегии обнаружения изменений (Default, OnPush).
  • Zone.js - патч браузерных API для автоматического обнаружения изменений.
  • Router - модуль маршрутизации с guards, resolvers и lazy loading.
  • FormsModule/ReactiveFormsModule - управление формами.
  • HttpClient - работа с HTTP.
  • @Input/@Output - декораторы для передачи данных между компонентами.

Эти сущности работали в связке: модули организовывали приложение, компоненты и директивы строили UI, сервисы обеспечивали логику, DI управлял зависимостями, а Zone.js отслеживал изменения.

На практике

На практике разработчики использовали NgModules для feature modules и shared modules, сервисы для state management (часто с RxJS), а компоненты с ChangeDetectionStrategy.OnPush для оптимизации производительности. Lifecycle hooks применялись для инициализации данных (ngOnInit) и очистки подписок (ngOnDestroy). EventEmitter и @Output использовались для коммуникации child-to-parent. Dependency injection позволяла легко переопределять сервисы для тестирования.

Пример кода

TYPESCRIPT
// Компонент
@Component({
selector: 'app-user',
template: `<p>{{ user.name }}</p>`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class UserComponent implements OnInit, OnDestroy {
@Input() user: User;
@Output() userClicked = new EventEmitter<User>();
private subscription: Subscription;
constructor(private userService: UserService) {}
ngOnInit() {
this.subscription = this.userService.getUser().subscribe();
}
onUserClick() {
this.userClicked.emit(this.user);
}
ngOnDestroy() {
this.subscription?.unsubscribe();
}
}
// Модуль
@NgModule({
declarations: [UserComponent],
imports: [CommonModule],
exports: [UserComponent],
providers: [UserService]
})
export class UserModule {}

Как отвечать на собеседовании

Начни с перечисления ключевых сущностей, затем сгруппируй их по функциональности: компоненты/директивы для UI, сервисы/DI для логики, модули для организации, Zone.js для обнаружения изменений. Упомяни, что эти сущности формировали архитектуру до введения standalone components и signals. Покажи понимание их взаимодействия: например, как DI и модули влияют на область видимости сервисов. Если спросят про изменения в Angular 16+, кратко отметь, что signals и standalone стали альтернативой Zone.js и NgModules.

Что проверяет интервьюер

Интервьюер оценивает:

  • Глубину понимания архитектуры Angular, а не просто знание названий сущностей.
  • Умение объяснить, как сущности взаимодействуют (например, как DI работает с модулями).
  • Осознание trade-offs: почему Zone.js может быть проблемой, зачем нужен OnPush.
  • Знание эволюции фреймворка - понимание, что было до standalone и signals.
  • Практический опыт: как эти сущности используются в реальных проектах.

Типичные ошибки

  • Путаница между структурными и атрибутными директивами.
  • Непонимание разницы между @ViewChild и @ContentChild.
  • Игнорирование роли Zone.js в обнаружении изменений.
  • Утверждение, что NgModules обязательны (они были, но не являются строго обязательными в ранних версиях).
  • Забывание про lifecycle hooks или их неправильное применение (например, вызов HTTP в конструкторе).
  • Смешивание понятий: EventEmitter - это не Observable, хотя extends Subject.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью