Коллеги, привет! От команды Angular пришли отличные новости: в 22-й версии стратегия OnPush станет стандартной. По этому поводу разработчики выпустили новый RFC (Request for Comments). Ниже я подготовил перевод текста и оставил ссылку на само обсуждение в конце, вдруг кто-то захочет поспорить или переубедить команду Angular :)

  • Компоненты будут использовать ChangeDetectionStrategy.OnPush по умолчанию.

  • Мы переименовываем ChangeDetectionStrategy.Default в ChangeDetectionStrategy.Eager

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

Отслеживание изменений (Change detection) это способ Angular выявлять изменения в состоянии приложения и синхронизировать их с пользовательским интерфейсом. Переход на zoneless (режим без Zone.js) создал требование, чтобы компоненты явно использовали ChangeDetectionStrategy.OnPush или, по крайней мере, были OnPush-совместимыми. Быть OnPush-совместимым означает, что на функциональность вашего приложения не повлияет переключение на OnPush без каких-либо других изменений в коде.

Использование OnPush долгое время считалось лучшей практикой в Angular, и разработчики уже некоторое время просили нас внести это изменение. Наличие лучших практик по умолчанию означает, что разработчикам и командам не придется предпринимать дополнительные шаги для включения этой опции в каждом компоненте. Мы верим, что теперь, когда zoneless стабилен и хорошо поддерживается во всей экосистеме, настало подходящее время. Zoneless это настоящее и будущее приложений на Angular, и изменение стандартной стратегии ChangeDetectionStrategy соответствует этой реальности.

По аналогии с тем, как мы изменили версию по умолчанию для standalone-компонентов, мы автоматически мигрируем существующие кодовые базы Angular, чтобы явно установить ChangeDetectionStrategy.Eager, сохраняя их текущее поведение.

Вопросы к сообществу

Есть ли какие-то специфические паттерны написания компонентов, которые, по вашему мнению, перестанут работать или потребуют рефакторинга из-за этого изменения?

ChangeDetectionStrategy.Eager

Переименование стандартной стратегии отслеживания изменений дает разработчикам и инструментам больше понимания смысла ChangeDetectionStrategy.Default. Сам по себе разработчик, столкнувшись с этим названием, может ошибочно предположить, что имя default является своего рода рекомендацией и, например, совместимо с современными практиками Angular zoneless. В то время как на самом деле default означает, что проверка изменений происходит по умолчанию (eagerly), без необходимости явно помечать компонент для проверки. Это изменение направлено на устранение любой двусмысленности в этом и подобных сценариях.

До этого изменения:

@Component({...}) // no changeDetection setting
// or
@Component({
  changeDetection: ChangeDetectionStrategy.Default	
})

После миграции:

@Component({
  changeDetection: ChangeDetectionStrategy.Eager
})

С этим изменением функциональность остается прежней: Angular будет жадно (eagerly) проверять, нуждается ли DOM компонента в обновлении, всякий раз, когда процесс отслеживания изменений доходит до него, а не только тогда, когда компонент явно помечен для проверки.

Мы планируем внедрить эти изменения в Angular v22 в мае 2026 года.

Ссылка на RFC: https://github.com/angular/angular/discussions/66779