Angular 22.0
Angular 22.0 has been released on June 3, 2026 — and this one marks a genuine inflection point. After several releases laying the signal-reactive groundwork, v22 makes OnPush change detection the default, stabilises three major APIs, and swaps in Vitest as the default test runner. This is the release where the "signal-first" Angular finally becomes the default Angular.
OnPush Change Detection Is Now the Default
The headline change in Angular 22 is that every new component now defaults to ChangeDetectionStrategy.OnPush. Previously, components defaulted to the eager (Default) strategy, which checked the entire tree on every change — a common source of unnecessary re-renders in large apps.
This means that from v22 onward, a component's view only re-renders when its inputs change (by reference) or when an associated signal fires. The result is more predictable rendering, fewer wasted checks, and a mental model that aligns naturally with the signal paradigm Angular has been moving toward since v17.
An automated migration schematic handles existing projects: run ng update and the CLI rewrites components that are safe to switch. Components that explicitly depend on the eager strategy retain their existing behaviour.
The shift has been anticipated for over a year, but it's still a significant breaking change for any codebase that implicitly relied on the old default. The Angular team has provided extensive migration docs and an opt-out per component via changeDetection: ChangeDetectionStrategy.Default.
Signal Forms Now Stable
After spending v20 and v21 in developer preview, Signal Forms are now production-ready. Signal Forms replace the traditional template-driven and reactive form modules with a signal-based approach: form controls are signals, form state is derived reactively, and validation runs only when the relevant control changes.
Key APIs include signalControl, signalGroup, signalArray, and the validators function. The new system integrates seamlessly with Angular's change detection — because controls are signals, the framework only checks the parts of the form that actually changed, not the whole tree.
Migration from the legacy forms modules is opt-in, and both systems can coexist in the same project during the transition. The legacy forms modules remain available but are now in maintenance mode.
Resource API Stabilises
The resource() and injectResource() APIs, which manage async state (fetch calls, observables, etc.) through signals, have graduated from developer preview to stable. A resource is defined by a loader function and exposes reactive .value, .error, and .isLoading signals.
This replaces the need for manual async pipe wiring in templates or boilerplate in services and is particularly powerful when combined with the new OnPush default.
Angular Aria Is Generally Available
@angular/aria provides first-party directives for building accessible UI components — ARIA roles, focus management, keyboard navigation, and live region announcements — without pulling in a third-party library like Material's A11y module or a11y.js.
The library introduces the @aria decorator for component metadata, a FocusManager service, and declarative keyboard bindings via the @keybinding decorator. Angular Aria is built on top of the existing CDK foundation but exposes a much more ergonomic API for component authors.
Additional Highlights
- @Service decorator: A new decorator that simplifies provider registration —
@Servicereplaces the@Injectable({providedIn: 'root'})boilerplate for the most common case. - injectAsync: A new function that allows injection context to be used in async initialisation flows, solving a long-standing pain point in lazy-loaded services.
- Vitest as default test runner: The Angular CLI now uses Vitest out of the box for unit tests, offering better performance and compatibility with the modern Jest-like API. Karma and Jasmine remain available but are deprecated.
- Selectorless components: Components can now be defined without a CSS selector, allowing them to be instantiated only programmatically via
createComponent.
Angular 22 is available now. Run ng update @angular/core @angular/cli to upgrade, and review the official migration guide for the full list of breaking changes.