Muhammed Senussi
Muhammed Senussi
  • Muhammed Senussi
Going Zoneless: What Breaks and What It Buys
Angular

Removing Zone.js takes a chunk of JavaScript out of the bundle and stops the framework checking the entire component tree every time a timer fires. Both are good. The migration surfaces things.

What tends to break

  • A third-party library that mutates a property and relies on zone patching to trigger a render.
  • setTimeout used to nudge a value into place, which was always a smell and now simply does not update the view.
  • Manual markForCheck calls in the wrong place, which were previously masked by a global check happening anyway.

How to get there

Move state into signals first, while still running with zones. Each conversion is independently safe and independently testable. When the components a route touches are all signal-based, turn zones off for the application and fix what falls out — which by then is usually a short list confined to third-party integration points.

Do not enable both zone and zoneless change detection providers. Angular reports NG0408 for that combination, and it is easy to end up with both when a migration is partly done.

2 Comments

  • Peter Bakker

    September 16, 2025

    We hit NG0408 during a partial migration and it took a while to work out that a library was providing zone change detection for us.

    • Muhammed Senussi

      Muhammed Senussi

      AuthorSeptember 16, 2025

      That is a good catch and a common one. Worth searching your whole dependency tree for provideZoneChangeDetection rather than only your own bootstrap, because a library adding it is invisible in your source.

Leave a comment