Introduction
Angular has always been known for its powerful change detection mechanism, which automatically updates the UI whenever data changes.
This magic happens because of a small but powerful library called Zone.js.
However, as applications get larger and performance becomes more critical, developers started asking —
“Can we build Angular apps without Zone.js?”
The answer is yes!
With the latest Angular versions (v16+), we can now create Zoneless Angular Apps that are faster, lighter, and give developers full control over when and how the UI updates.
What is Zone.js?
Before we go zoneless, let’s understand what Zone.js actually does.
Zone.js is a library that patches browser APIs (like setTimeout, Promise, addEventListener) and keeps track of asynchronous tasks.
When any async task finishes, Angular uses that signal to trigger change detection and update the UI.
Example (With Zone.js)
@Component({
selector: 'app-counter',
template: `
<h2>{{ counter }}</h2>
<button (click)="increase()">Increase</button>
`
})
export class CounterComponent {
counter = 0;
increase() {
setTimeout(() => this.counter++, 1000); // Angular auto-detects this change
}
}
Here, when setTimeout finishes, Zone.js automatically runs change detection and updates the UI — you don’t have to do anything manually.
The Problem with Zone.js
While Zone.js makes development easy, it also comes with some performance overhead, especially in:
Large enterprise apps
Complex dashboards
Real-time data or gaming UIs
Apps with thousands of components
Because Zone.js patches many browser APIs, it keeps track of every async operation, which can slow down performance or cause unnecessary UI re-renders.
What is Zoneless Angular?
Zoneless Angular means building Angular applications without using Zone.js for change detection.
Instead, developers manually control when and where the view updates.
This new approach was introduced in Angular v16, making it easier to write high-performance and predictable applications.
How to Build a Zoneless Angular App
Step 1: Disable Zone.js
In your main.ts file, bootstrap the app without Zone.js:
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
bootstrapApplication(AppComponent, {
zone: 'noop' // 👈 Disable Zone.js
});
The zone: 'noop' option tells Angular not to use Zone.js for change detection.
Step 2: Use Signals or Manual Change Detection
Now that Zone.js is gone, Angular won’t automatically update the UI.
You can handle it using Signals (Angular’s new reactivity system) or ChangeDetectorRef manually.
Example Using Signals (Angular v17+)
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-signal-counter',
template: `
<h2>{{ counter() }}</h2>
<button (click)="increase()">Increase</button>
`
})
export class SignalCounterComponent {
counter = signal(0);
increase() {
setTimeout(() => this.counter.update(v => v + 1), 1000);
}
}

Join the conversation! Your thoughts help the community grow.