DEV Community

Cover image for Angular Zoneless Change Detection Explained: Angular Without Zone.js
Lucy Muturi for Syncfusion, Inc.

Posted on Originally published at syncfusion.com on

Angular Zoneless Change Detection Explained: Angular Without Zone.js

TL;DR: Zoneless Angular replaces Zone.js-based change-detection scheduling with explicit Angular notifications such as signals, template events, and AsyncPipe emissions. The result can be more predictable rendering, simpler debugging, and greater control over UI updates. Before migrating, developers should verify external integrations, Reactive Forms workflows, third-party libraries, and tests for compatibility.

Angular’s popularity didn’t come from powerful APIs alone. It came from a developer experience that felt effortless.

Update a variable, and the UI updates automatically.

For years, Zone.js powered that experience by helping Angular know when application state might have changed. But as Angular applications grew larger and more complex, developers began facing challenges with performance tuning, debugging, and understanding exactly what triggered UI updates.

To address these challenges, Angular has introduced new reactive capabilities, including signals and zoneless change detection.

In Angular 20.2, zoneless change detection became stable, and Angular 21 enables it by default. Instead of relying heavily on Zone.js to detect asynchronous activity, Angular now uses more explicit mechanisms to determine when UI updates should occur.

Why Angular used Zone.js

Historically, Angular relied on Zone.js to monitor asynchronous browser operations such as:

  • Timers
  • Promises
  • DOM events
  • Network callbacks

When one of these operations completed, Angular received a notification and scheduled change detection.

The process looked roughly like this:

                    Async operation

                          ↓

              Zone.js detects completion

                          ↓

                 Angular is notified

                          ↓

                Change detection runs

                          ↓

                     Views update
Enter fullscreen mode Exit fullscreen mode

This model worked well and removed much of the complexity involved in keeping UI and application state synchronized.

However, it also introduced challenges:

  • Change detection could run more often than necessary.
  • Debugging sometimes became harder because of zone-related call stacks.
  • Performance optimization could require significant investigation.
  • It was not always obvious what triggered a UI update.

As Angular evolved, the framework began moving toward more explicit reactive patterns.

Signals: The foundation of modern Angular reactivity

One of Angular’s most important additions is signals.

A signal represents a reactive state that Angular can track directly.

JavaScript

readonly count = signal(0);

add() {
  this.count.update(value => value + 1);
}

Enter fullscreen mode Exit fullscreen mode

When the signal changes, Angular receives a precise notification that the state has been updated.

This allows Angular to react to specific state changes instead of relying solely on global asynchronous activity.

What Signals do not do

A common misconception is that signals replace Angular change detection.

They do not.

Signals provide:

  • Reactive state
  • Dependency tracking
  • Change notifications
  • Reactive relationships between values

Angular still performs change detection. Signals simply help Angular understand more precisely when updates are required.

Signals vs. RxJS

Another common question is:

Should signals replace RxJS?

Usually, no.

The two technologies solve different problems.

Signals are ideal for

  • Component state
  • Local reactive data
  • Derived UI state
  • Fine-grained updates

RxJS is ideal for

  • Event streams
  • WebSocket communication
  • Stream transformations
  • Complex asynchronous workflows
  • Service orchestration

In modern Angular applications, they frequently work together.

A common approach is:

  • RxJS manages asynchronous workflows.
  • Signals manage UI state.

How Zoneless Change Detection works

The core idea behind zoneless Angular is straightforward.

Instead of monitoring broad asynchronous activity, Angular reacts to recognized update notifications.

Traditional model:

                       Async activity

                            ↓

                  Zone.js tracks activity

                            ↓

                   Angular is notified

                            ↓

                  Change detection runs
Enter fullscreen mode Exit fullscreen mode

Zoneless model:

                  Angular notification

                           ↓

                Angular schedules updates

                          ↓

                 Relevant views refresh
Enter fullscreen mode Exit fullscreen mode

Angular can receive notifications through mechanisms such as:

  • Signal updates used by templates
  • Template and host event handlers
  • AsyncPipe emissions
  • ComponentRef.setInput()
  • ChangeDetectorRef.markForCheck()

Angular still schedules and batches updates efficiently. The difference is that updates are driven by explicit application state changes rather than broad asynchronous interception.

How to enable Zoneless Change Detection

Angular 20 applications can enable zoneless mode using.

JavaScript

provideZonelessChangeDetection():
import { bootstrapApplication } from '@angular/platform-browser';
import { provideZonelessChangeDetection } from '@angular/core';

bootstrapApplication(AppComponent, {
  providers: [
    provideZonelessChangeDetection()
  ]
});

Enter fullscreen mode Exit fullscreen mode

Angular 21 applications use zoneless change detection by default.

If an application requires traditional Zone.js behavior, Angular also provides an explicit opt-in:

provideZoneChangeDetection()
Enter fullscreen mode Exit fullscreen mode

Why Zoneless Change Detection can be more efficient

Under the traditional model, Angular often performed change detection because something might have changed.

With zoneless change detection, Angular updates when it receives a recognized notification.

Potential benefits include:

  • Reduced unnecessary work
  • More predictable rendering behavior
  • Easier debugging
  • Better performance tuning visibility

However, these improvements are not guaranteed.

Actual results depend on factors such as:

  • Application architecture
  • Component count
  • Update frequency
  • Signals adoption
  • Existing change-detection patterns

The best approach is to benchmark before and after migration rather than expecting universal gains.

Where Zoneless Angular has the biggest impact

Small applications may show little difference.

The biggest benefits often appear in applications with:

  • Real-time dashboards
  • Data-heavy interfaces
  • Collaborative systems
  • Frequent asynchronous updates
  • External integrations

These environments generate many state changes, making explicit update mechanisms more valuable.

Working with external integrations

Third-party integrations are often where zoneless behavior becomes most noticeable.

Consider:

JavaScript

readonly unread = signal(0);

vendorApi.onUnreadCountChanged(count => {
   this.unread.set(count);
});

Enter fullscreen mode Exit fullscreen mode

The external callback itself is not important.

What matters is that Angular learns about the state change through a supported mechanism. Since the template consumes the signal, Angular can schedule the required UI update.

This represents a key mindset shift: State changes should be communicated through Angular-aware reactive mechanisms.

Template Bindings and Change Detection APIs

Many existing applications use APIs such as:

  • NgZone.run()
  • markForCheck()
  • detectChanges()

These APIs remain useful.

In zoneless applications:

  • markForCheck() remains a supported notification mechanism.
  • detectChanges() performs an immediate local check.
  • Existing NgZone.run() calls do not have to be removed simply because an application adopts zoneless mode.

Signals often reduce the need for manual notifications, but Angular’s existing APIs remain fully relevant.

Read the full blog post on the Syncfusion Website

Top comments (0)