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.
setTimeoutused to nudge a value into place, which was always a smell and now simply does not update the view.- Manual
markForCheckcalls 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
Leave a comment
Sign in to leave a comment.
Signing in is unavailable right now.







Peter Bakker
September 16, 2025We 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
AuthorSeptember 16, 2025That 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.