JH← Back to blog

Angular 21 Finally Kills Zone.js. Signal Forms Are the Bigger Story.

Angular 21 ships Signal Forms, stable zoneless change detection, and Angular Aria. Here's what actually changed, who should upgrade first, and a phased migration plan that isn't a rewrite.


Angular has shipped a major version every six months for years, and most of them are forgettable in the best way — predictable, incremental, upgrade and move on. Angular 21 is not one of those. It stabilizes zoneless change detection, which means production Angular apps can finally drop Zone.js entirely, and it introduces Signal Forms, which pulls the most stateful part of any business application into the Signals reactivity model. It also adds Angular Aria, framework-level accessibility tooling. Two of those three changes touch the foundations — change detection and form handling — so if you run Angular in production, this is the release where "we'll upgrade eventually" needs to become an actual plan.

Signal Forms: one reactivity model instead of two

Here's the awkward thing about Angular development since Signals landed: you've been running two reactivity models in the same app. Component state uses signals. Form state uses RxJS Observables wrapped in the FormControl/FormGroup class hierarchy. Every developer on your team context-switches between computed() on one line and valueChanges subscriptions three lines later.

Signal Forms close that gap. Form state — values, validity, dirty and touched flags, errors — is now represented as signals rather than Observables. In practice that means:

  • No more subscribing to valueChanges or statusChanges and manually tracking unsubscribes. You read form state directly as signals with automatic dependency tracking, and the entire class of forgotten-unsubscribe memory leaks disappears.
  • Fine-grained updates. Signals track dependencies at the field level, so changing one input doesn't trigger recomputation or re-rendering across unrelated parts of the form. Reactive Forms historically triggered much coarser change detection than the actual state change warranted.
  • Derived form state uses the primitives you already know. A "can submit" flag or a cross-field validation rule is just computed() and effect() — the same tools you use everywhere else in a signals-based app, instead of a stack of RxJS operators that exists only in your forms code.

The consistency win is the one I'd emphasize to a team. When form logic and component logic look the same, code review gets easier, onboarding gets easier, and the "which reactivity model am I in right now" tax goes away.

Your existing forms don't break. FormControl and FormGroup keep working, and the Angular team has been explicit that adoption is incremental. But Signal Forms are quickly becoming the recommended default for new development, which means the API is now a core skill, not an optional one.

Zoneless is stable, and it's the performance headline

Zone.js has been Angular's change-detection trigger since the beginning: it monkey-patches browser APIs — timers, event listeners, promises, XHR — so Angular knows something async happened and it's time to check the component tree. That worked, but the costs were real and you've been paying them on every page load:

  • Bundle weight. Zone.js is JavaScript every user downloads and parses before your app is interactive.
  • Monkey-patching side effects. Patching global browser APIs interacts unpredictably with third-party libraries, makes stack traces noisy, and occasionally produces genuinely weird async bugs.
  • Coarse triggers. Zone.js fires change detection when any patched async API resolves anywhere in the app, whether or not the result matters to most of the component tree. Angular has been doing more rendering work than necessary for its entire life.

With zoneless stable in Angular 21, signals tell the framework exactly which parts of the UI depend on which state, and it updates only those, only when needed. The payoff shows up in three places: faster initial load from the smaller JavaScript payload (which directly moves Time to Interactive and First Input Delay — both Core Web Vitals inputs, and by extension SEO), rendering behavior you can actually reason about because updates come from explicit signal dependencies instead of "something async happened somewhere," and better compatibility with modern debugging and profiling tools that never got along with monkey-patched globals.

If you run an e-commerce storefront, a real-time dashboard, or anything where Core Web Vitals show up in business metrics, zoneless is probably the single strongest reason to prioritize this upgrade.

Angular Aria makes accessibility a framework problem

The third piece is Angular Aria, accessibility tooling built into the framework itself. Until now, a11y in Angular has been bolt-on work: hand-written ARIA attributes, the CDK's a11y module, and after-the-fact audits with axe or Lighthouse. Angular Aria moves accessibility toward being a first-class framework concern — part of a broader 2026 trend where a11y tooling lives in the core developer experience instead of external libraries and compliance checklists.

For anyone with WCAG 2.1/2.2, ADA, or Section 508 obligations — government contractors, healthcare, finance, education, and increasingly any consumer-facing product — this is more than developer convenience. Framework-native tooling lowers the odds of accessibility regressions reaching production, and that's a legal and reputational risk reduction, not just a nicer DX.

Angular isn't doing this alone

The signals move is an industry-wide convergence, not an Angular experiment. By 2026, multiple major frameworks have independently landed on fine-grained, dependency-tracked reactivity as the replacement for both dirty-checking (Angular's old model) and virtual DOM diffing (React's). That convergence matters practically: signals, computed values, and effects are becoming transferable concepts across frameworks, which lowers the ramp for multi-framework teams. And when independent frameworks reach the same architectural conclusion, that's decent evidence you're investing in a durable direction rather than a fad — which is exactly the reassurance an enterprise team needs before committing migration budget.

Who should move now, and who can wait

Upgrade urgency isn't uniform. The clearest immediate winners:

  • Performance-sensitive apps — e-commerce, media, high-traffic consumer products where Core Web Vitals affect revenue and rankings. Zoneless pays off here fastest.
  • Form-heavy enterprise software — internal tools, admin dashboards, B2B SaaS built around complex dynamic forms. Signal Forms cut both the boilerplate and the subscription-management bug surface.
  • Anyone with accessibility compliance requirements, for the Angular Aria reasons above.
  • Teams already deep into Signals for component state — this release is a continuation of a bet you've already made.
  • Greenfield projects, which should start on Signal Forms and zoneless from day one and skip the migration debt entirely.

If you have a large legacy codebase leaning on third-party libraries tightly coupled to Zone.js, plan a longer timeline — but don't shelve it. Each Angular major gets 18 months of support, which is a generous runway but not an infinite one.

A migration plan that isn't a big-bang rewrite

The phased approach I'd run:

  1. Move through majors incrementally with ng update — don't jump straight to 21 from something ancient. The official update guide at update.angular.io is reliable.
  2. Inventory Zone.js coupling: grep for NgZone injections, runOutsideAngular calls, and zone-patched async patterns in your code and your dependencies. That's your risk map.
  3. Pilot zoneless on a non-critical route or module before going app-wide — opt-in zoneless bootstrapping has been available for exactly this purpose.
  4. Pick your first Signal Forms targets deliberately: new forms, plus the most complex or bug-prone existing ones where fine-grained reactivity earns its keep visibly. Don't convert everything at once.
  5. Run your accessibility audit against Angular Aria and retire custom ARIA code where the framework now covers it.
  6. Update CI and test suites — zoneless change detection timing differs subtly from Zone.js-based test harnesses, and that will bite you if you skip it.
  7. Budget real training time. Signals, computed(), effect(), and Signal Forms are a genuine shift from RxJS-heavy forms. A doc link is not training; pair programming during the transition is.
  8. Benchmark before and after. Capture Core Web Vitals, bundle size, and TTI now so you can quantify what removing Zone.js actually did in your app, not in a demo.

My recommendation: start the Zone.js dependency audit this quarter and pilot Signal Forms on one feature, even if the full upgrade lands next year. The honest tradeoff is that this is real work — retraining an RxJS-fluent team on signals-first forms, auditing third-party Zone.js coupling, and adjusting test timing are weeks of effort, not a version bump. But the direction is settled: Angular's multi-year signals bet now extends into forms and change detection itself, and every release cycle you wait adds distance between your codebase and the framework baseline you'll eventually have to meet anyway. Better to close that gap on a schedule you chose.