Angular Upgrade Planner
Pick a source and target Angular version (8–22) for an ordered, checkable upgrade plan — ng update commands, breaking changes, deprecations, and migrations.
Choose your upgrade path
Angular 16 → Angular 17
(6 steps)Commit or stash all work, then make sure you are on the latest minor/patch of your current major before running ng update. Upgrade exactly one major at a time and run the app/tests after each hop.
Angular 17 requires Node.js 18.13+ or 20.9+ and TypeScript 5.2 up to 5.4.
Check your Node.js & TypeScript versions for Angular 17 →Update the core framework and CLI together. This applies the official automatic migration schematics for this version.
ng update @angular/core@17 @angular/cli@17
New applications use the esbuild + Vite application builder (@angular-devkit/build-angular:application) with faster builds and a Vite dev server. Existing apps keep the webpack builder until migrated. SSR moves to the new @angular/ssr package and is offered during ng new.
New built-in control flow replaces *ngIf/*ngFor/*ngSwitch — run ng generate @angular/core:control-flow to migrate templates. Deferrable views (@defer) enable lazy loading of template blocks.
Convert a template to @if/@for online →ng generate @angular/core:control-flow
signal() and computed() are stable (effect() stays in developer preview until v20), afterRender/afterNextRender hooks are added in developer preview, and the View Transitions API is supported via withViewTransitions.
Sources: Angular Update Guide: v16 → v17 · Angular 17.0.0 release notes
Angular 17 → Angular 18
(5 steps)Commit or stash all work, then make sure you are on the latest minor/patch of your current major before running ng update. Upgrade exactly one major at a time and run the app/tests after each hop.
Angular 18 requires Node.js 18.19.1+, 20.11.1+, or 22, and TypeScript 5.4 or 5.5.
Check your Node.js & TypeScript versions for Angular 18 →Update the core framework and CLI together. This applies the official automatic migration schematics for this version.
ng update @angular/core@18 @angular/cli@18
provideExperimentalZonelessChangeDetection lets you trial zoneless apps, and event replay for SSR is available in preview. Review zone-dependent code before trying zoneless.
Angular Material 3 is stable, the build tooling is published as @angular/build, deferrable views and built-in control flow are stable, ng-content supports default/fallback content, and route redirects can be functions.
Sources: Angular Update Guide: v17 → v18 · Angular 18.0.0 release notes
Angular 18 → Angular 19
(5 steps)Commit or stash all work, then make sure you are on the latest minor/patch of your current major before running ng update. Upgrade exactly one major at a time and run the app/tests after each hop.
Angular 19 requires Node.js 18.19.1+, 20.11.1+, or 22, and TypeScript 5.5 up to 5.8.
Check your Node.js & TypeScript versions for Angular 19 →Update the core framework and CLI together. This applies the official automatic migration schematics for this version.
ng update @angular/core@19 @angular/cli@19
Components, directives, and pipes are standalone by default; NgModule-based declarations must set standalone: false. Run the standalone migration, and optionally enable strictStandalone.
Incremental hydration (preview), route-level render mode (SSR/SSG/CSR), the experimental resource() API, linkedSignal, @let template variables, and HMR for styles are introduced.
Sources: Angular Update Guide: v18 → v19 · Angular 19.0.0 release notes
Angular 19 → Angular 20
(7 steps)Commit or stash all work, then make sure you are on the latest minor/patch of your current major before running ng update. Upgrade exactly one major at a time and run the app/tests after each hop.
Angular 20 requires Node.js 20.19+, 22.12+, or 24, and TypeScript 5.8 (up to <6.0). Node 18 and TypeScript 5.7 and below are no longer supported.
Check your Node.js & TypeScript versions for Angular 20 →Update the core framework and CLI together. This applies the official automatic migration schematics for this version.
ng update @angular/core@20 @angular/cli@20
The DOCUMENT token moved from @angular/common to @angular/core. The ng update migration rewrites the imports automatically.
The structural directives are deprecated in favor of built-in control flow (@if/@for/@switch). They still ship in Angular 22, marked for removal in a future major. Run the control-flow migration. TestBed.get() is removed (auto-migrated to TestBed.inject()), and TestBed.flushEffects() is deprecated in favor of TestBed.tick().
Convert a template to @if/@for online →ng generate @angular/core:control-flow
The compiler can now type-check host bindings and @HostBinding/@HostListener expressions. It is opt-in in v20 via typeCheckHostBindings in angularCompilerOptions, and becomes the default in v21, so enabling it now surfaces errors early.
effect(), linkedSignal() and toSignal() are now stable, completing the core signal APIs. Zoneless change detection moves to developer preview and provideExperimentalZonelessChangeDetection is renamed provideZonelessChangeDetection.
Sources: Angular Update Guide: v19 → v20 · Angular 20.0.0 release notes · Announcing Angular v20 (Angular Blog)
Tip: Upgrade one major at a time and run ng update for each hop — it applies the official migration schematics automatically. Commit between hops and run your tests. This is a representative checklist of the major changes; always confirm specifics against the official Angular Update Guide for your exact versions.
Upgrading Angular 16 to Angular 20
This plan covers the full path from Angular 16 to Angular 20 — 4 version hops and 23 steps in total. Upgrade one major at a time, running ng update for each hop so the official migration schematics apply. Commit and run your tests between hops.
Breaking changes to check between Angular 16 and Angular 20
- New esbuild/Vite application builder is the default (Angular 16 → Angular 17): New applications use the esbuild + Vite application builder (@angular-devkit/build-angular:application) with faster builds and a Vite dev server. Existing apps keep the webpack builder until migrated. SSR moves to the new @angular/ssr package and is offered during ng new.
- Standalone is the default (Angular 18 → Angular 19): Components, directives, and pipes are standalone by default; NgModule-based declarations must set standalone: false. Run the standalone migration, and optionally enable strictStandalone.
Hops in this path
- Angular 16 → Angular 17 — 6 steps
- Angular 17 → Angular 18 — 5 steps
- Angular 18 → Angular 19 — 5 steps
- Angular 19 → Angular 20 — 7 steps
Before you start
- Commit or stash your work and upgrade on a branch so you can roll back.
- Get on the latest minor/patch of Angular 16 before the first hop.
- Update third-party libraries (including Angular Material/CDK) alongside each hop, and run your tests after each one.
Sources
Every step in this plan is checked against Angular's official documentation and release notes. Last reviewed .
- Angular Update Guide: v16 → v17
- Angular 17.0.0 release notes
- Angular Update Guide: v17 → v18
- Angular 18.0.0 release notes
- Angular Update Guide: v18 → v19
- Angular 19.0.0 release notes
- Angular Update Guide: v19 → v20
- Angular 20.0.0 release notes
- Announcing Angular v20 (Angular Blog)
- Angular version compatibility (Node.js, TypeScript, RxJS)
- Angular Update Guide