Angular 22: Signal Forms, Angular Aria и OnPush по умолчанию
Технический разбор · 11 июня 2026

Angular 22: Signal-First
будущее наступило

Angular 22 вышел 3 июня 2026 года со стабильными Signal Forms, модулем доступности Angular Aria, декларативной загрузкой данных через Signals, OnPush по умолчанию и Fetch API как основным HTTP-клиентом. Полный разбор всех нововведений с примерами кода, стратегиями миграции и практическими рекомендациями.

Олег Максимов 11 июня 2026 16 мин

Обзор: что нового в Angular 22

Angular 22 выпущен 3 июня 2026 года. Это самый значительный релиз Angular со времён v17 (standalone components) — фреймворк окончательно переходит на signal-first архитектуру. Signal Forms становятся стабильными, OnPush включается по умолчанию, HTTP-клиент использует Fetch API, а новый модуль Angular Aria предоставляет встроенную доступность. 10 июня вышло обновление 22.0.1 с исправлениями безопасности и санитизацией SVG-атрибутов.

Стабильно

Signal Forms

Перешли из developer preview в стабильную версию — реактивные формы на Angular Signals, готовые к production.

Стабильно

Angular Aria

Встроенные примитивы доступности (WCAG) — ARIA-директивы, клавиатурная навигация, экранные читалки.

Стабильно

httpResource и rxResource

Декларативная загрузка данных через Signals с автоматическими состояниями и цепочками зависимостей.

Breaking

OnPush по умолчанию

Компоненты без явного changeDetection теперь используют OnPush. Автоматическая миграция через schematics.

Breaking

Fetch API по умолчанию

HttpClient использует FetchBackend. XHR через withXhr(). withFetch() объявлен устаревшим.

Breaking

TypeScript 6+ и Node 22+

Прекращена поддержка TypeScript 5.x и Node.js 20. Требуется TS 6.0+ и Node.js v22+.

Стабильно

@Service декоратор

Новый декоратор для сервисов с улучшенной типобезопасностью фабричных функций.

Breaking

Удалён ComponentFactory

ComponentFactoryResolver и ComponentFactory удалены. Передавайте классы компонентов напрямую.

Разберём каждое нововведение подробно — что оно делает, зачем нужно и как использовать уже сегодня.

1. Signal Forms — стабильные реактивные формы

Самое значительное нововведение Angular 22 — перевод Signal Forms из developer preview в стабильный статус. После месяцев доработок — ленивая инициализация полей, поддержка generic union-типов, debounced async-валидация, сигналы ошибок парсинга, настраиваемое поведение отправки и сброс кастомных контролов — Signal Forms готовы к production.

Signal Forms заменяют template-driven и reactive forms единым сигнал-ориентированным API. Вместо FormControl, FormGroup и FormArray вы получаете реактивные примитивы полей на базе Angular Signals — автоматическое, гранулярное обнаружение изменений без zone.js.

Было (Reactive Forms)

export class LoginComponent {
  form = new FormGroup({
    email: new FormControl('', [Validators.required, Validators.email]),
    password: new FormControl('', [Validators.required, Validators.minLength(8)]),
  });

  get email() { return this.form.get('email'); }

  onSubmit() {
    if (this.form.valid) {
      this.authService.login(this.form.value);
    }
  }
}

Стало (Signal Forms)

import { signalForm, formField } from '@angular/forms';

export class LoginComponent {
  form = signalForm({
    email: formField('', { validators: [required, email] }),
    password: formField('', { validators: [required, minLength(8)] }),
  });

  // Состояние формы реактивно через Signals
  emailError = computed(() => {
    const field = this.form.controls.email;
    if (field.touched() && field.invalid()) {
      return field.getError('email') ?? 'Неверный email';
    }
    return null;
  });

  onSubmit() {
    if (this.form.valid()) {
      this.authService.login(this.form.value());
    }
  }
}

Ключевые отличия: Signal Forms отслеживают valid, touched, dirty и errors через Signals, а не через observable-потоки. Нет .get() со строковыми путями — поля доступны как типизированные свойства. Схема определения компактна и компонуема, поддерживает вложенные группы, динамические массивы и union-типы на уровне схемы.

2. Angular Aria — встроенная доступность

Angular 22 поставляет Angular Aria как стабильный модуль — комплексный набор примитивов доступности, делающий соответствие WCAG встроенной возможностью фреймворка, а не сторонней библиотекой.

Angular Aria включает директивы для:

import { AriaModule } from '@angular/aria';

@Component({
  selector: 'app-modal',
  standalone: true,
  imports: [AriaModule],
  template: `
    <div role="dialog" ariaModal ariaLabelledBy="modal-title">
      <h2 id="modal-title">Подтверждение</h2>
      <p>Вы уверены, что хотите удалить этот элемент?</p>
      <div class="actions" ariaKeyboardNav>
        <button (click)="confirm()">Удалить</button>
        <button (click)="cancel()">Отмена</button>
      </div>
    </div>
  `
})
export class ConfirmModalComponent {}

3. httpResource — декларативная загрузка данных

httpResource и rxResource — это смена парадигмы в том, как Angular-приложения загружают и управляют данными. Вместо ручного управления жизненным циклом запросов с подписками, флагами загрузки и состояниями ошибок вы объявляете зависимость данных как Signal — Angular делает всё остальное.

import { httpResource } from '@angular/common/http';

@Component({
  selector: 'app-user-profile',
  template: `
    @if (user.isLoading()) {
      <p>Загрузка...</p>
    } @else if (user.error()) {
      <p>Ошибка: {{ user.error() }}</p>
    } @else {
      <h2>{{ user.value().name }}</h2>
      <p>{{ user.value().email }}</p>
    }
  `
})
export class UserProfileComponent {
  userId = input<number>();

  // Декларативно — httpResource реагирует на изменение userId
  user = httpResource<User>(() => `/api/users/${this.userId()}`, {
    defaultValue: { name: '', email: '' }
  });
}

httpResource возвращает объект с тремя реактивными свойствами: value (Signal с данными), isLoading (Signal-флаг загрузки) и error (Signal с ошибкой). При изменении URL ресурс автоматически перезапрашивает данные.

Цепочки зависимых ресурсов через chain()

// Данные команды загружаются после выбора ID
team = httpResource<Team>(() => `/api/teams/${this.selectedTeamId()}`);

// Участники загружаются, когда есть данные о команде
teamMembers = this.team.chain(
      (team) => `/api/teams/${team.id}/members`,
      { defaultValue: [] as Member[] }
    );

// Задачи участников загружаются на основе участников
teamTasks = this.teamMembers.chain(
  (members) => `/api/tasks?assigneeIds=${members.map(m => m.id).join(',')}`,
  { defaultValue: [] as Task[] }
);

Каждый вызов chain() создаёт зависимый ресурс, который автоматически перезапрашивается при изменении родительского. Race conditions обрабатываются — если родительский ресурс перезагружается до завершения дочернего, устаревший запрос отменяется.

4. OnPush по умолчанию

Начиная с Angular 22, компоненты без явного changeDetection по умолчанию используют ChangeDetectionStrategy.OnPush. Это breaking change, который приводит Angular в соответствие с современными реактивными паттернами.

Для сохранения старого поведения укажите явно:

@Component({
  selector: 'app-legacy',
  changeDetection: ChangeDetectionStrategy.Eager,  // было Default
  template: `...`
})
export class LegacyComponent {}

Схема ng update автоматически находит компоненты, полагавшиеся на старое поведение, и добавляет ChangeDetectionStrategy.Eager там, где это необходимо. Если вы уже используете Signals, это изменение будет прозрачным — ваши компоненты уже ведут себя как OnPush.

5. Fetch API как основной HTTP-клиент

Angular 22 переключает HTTP-клиент с XMLHttpRequest на современный Fetch API. HttpClient теперь использует FetchBackend по умолчанию.

// По умолчанию в v22 — Fetch используется автоматически
provideHttpClient()

// Для XHR (прогресс загрузки файлов)
provideHttpClient(withXhr())

withFetch() объявлен устаревшим — он больше не нужен, так как Fetch стал поведением по умолчанию. Схема миграции добавляет withXhr() автоматически для проектов, использовавших provideHttpClient без аргументов.

6. TypeScript 6.0+ и Node.js 22+

Angular 22 прекращает поддержку TypeScript 5.x и Node.js 20. Требуется обновление до:

Схема ng update добавляет "strictTemplates": true в tsconfig и отключает диагностики nullishCoalescingNotNullable и optionalChainNotNullable, которые TS 6.0 может активировать на существующих шаблонах.

7. Другие важные изменения

@Service декоратор

Новый декоратор для сервисов с улучшенной типобезопасностью фабричных функций — более явная альтернатива @Injectable({ providedIn: 'root' }).

injectAsync

Новая функция для асинхронного внедрения зависимостей — полезна для lazy-загрузки сервисов и динамических провайдеров.

Изменения роутера

paramsInheritanceStrategy теперь по умолчанию 'always' — параметры маршрутов наследуются от всех родительских маршрутов. provideRoutes() удалён. Добавлены опции для поведения несоответствующих входных данных компонентов.

Инкрементальная гидратация по умолчанию

Angular 22 включает инкрементальную гидратацию по умолчанию для SSR-приложений — компоненты гидратируются по мере появления в области видимости, сокращая Time to Interactive.

Удалённые API

Миграция: Angular 21 → 22

Пошаговый чеклист для обновления:

  1. Обновите Node.js до v22 LTS или новее
  2. Обновите TypeScript до v6.0+: npm install typescript@~6.0
  3. Запустите schematics: ng update @angular/core@22 @angular/cli@22 — автоматически:
    • Добавит ChangeDetectionStrategy.Eager
    • Обновит provideRoutes()provideRouter()
    • Настроит provideHttpClient
    • Включит strictTemplates и отключит nullable-диагностики
    • Добавит withXhr() для upload-прогресса
  4. Замените ComponentFactory: передавайте классы компонентов напрямую
  5. Проверьте валидацию форм: min и max больше не принимают строки
  6. Удалите withFetch() из конфигурации провайдеров
  7. Протестируйте с OnPush: добавьте ChangeDetectionStrategy.Eager или мигрируйте на Signals

FAQ

Какое самое важное нововведение в Angular 22?
Самое важное — стабилизация Signal Forms. Это полностью реактивная, сигнал-ориентированная система управления формами, которая заменяет template-driven и reactive forms с лучшей типобезопасностью и производительностью. В сочетании с OnPush как стратегией обнаружения изменений по умолчанию это окончательно утверждает signal-first архитектуру Angular.
Что такое Angular Aria и зачем он нужен?
Angular Aria — стабильный модуль примитивов доступности (accessibility), соответствующий стандартам WCAG. Включает директивы для ARIA-атрибутов, клавиатурной навигации, управления фокусом и объявлений для экранных читалок. Это устраняет необходимость в сторонних библиотеках доступности.
Чем httpResource отличается от HttpClient в Angular 22?
httpResource — декларативная, сигнал-ориентированная утилита для загрузки данных, интегрированная с реактивной системой Angular. Она предоставляет автоматические состояния загрузки/ошибки/успеха через Signals, поддерживает цепочки зависимых ресурсов через chain(), обрабатывает race conditions и интегрируется с transfer cache для SSR. В отличие от императивного HttpClient, httpResource компонуем и естественно вписывается в компонентную модель Angular.
Сломает ли OnPush по умолчанию существующие компоненты?
Компоненты без явного changeDetection теперь получают OnPush. Angular предоставляет автоматическую миграцию через ng update, которая добавляет ChangeDetectionStrategy.Eager там, где это необходимо. Компоненты, полагавшиеся на стандартное обнаружение изменений для мутабельного состояния, могут потребовать доработки.
Как мигрировать с Angular 21 на Angular 22?
Запустите ng update @angular/core@22 @angular/cli@22. Схемы миграции автоматически: добавят ChangeDetectionStrategy.Eager, обновят provideRoutes → provideRouter, TypeScript до v6+ и strictTemplates. Ручные шаги: удаление ComponentFactoryResolver, миграция withFetch (теперь по умолчанию) и обновление валидации форм, если используются строки в min/max.
Требует ли Angular 22 Node.js 22?
Да. Angular 22 прекращает поддержку Node.js 20 и требует Node.js v22+ и TypeScript 6.0+. Это соответствует циклу релизов Node.js, который перевёл Node 20 в режим только поддержки.
Какие новые возможности форм добавляет Angular 22?
Помимо стабилизации Signal Forms, Angular 22 добавляет: reloadValidation для ручного запуска асинхронной валидации, опцию debounce для validateAsync и validateHttp, FieldState.getError() для чтения ошибок полей без подписок, ngNoCva для отказа от ControlValueAccessors, поддержку FormValueContainer (FVC) и привязку number|null к input type text.

Стоит ли обновляться до Angular 22?

Да — для большинства проектов. Signal-first направление — это будущее Angular, и v22 предоставляет стабильную основу для этого перехода:

Я занимаюсь Angular-разработкой с Angular 2 (2016) и мигрировал проекты с v2 по v21. Обновление до v22 — одно из самых плавных. Схемы миграции comprehensive, а signal-first архитектура реально улучшает производительность и опыт разработки. Если нужна помощь с миграцией или архитектурой — свяжитесь со мной.

Контакты

Нужна помощь с Angular?

Я разрабатываю production-приложения на Angular и помогаю с миграцией на v22, архитектурой и full-stack разработкой. Бесплатная консультация.