Коллеги, привет! От команды 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
