Back to blog
Strategy & Opinions12 min readMay 12, 2026

Angular Upgrade Guide: Every Version Path from 14 to 21

FS
Florin Siciu

In 19 enterprise Angular upgrade projects, the version upgrade itself has never been the part that fails. What fails is the planning — teams that do not understand what each version jump requires, how long it actually takes, and where the hidden complexity lives.

This guide covers every major version path from Angular 14 to 21. For each upgrade step, you get the breaking changes, the dependency requirements, the migration schematics, and the realistic effort estimate based on enterprise projects.

Note

The interactive Angular update guide at angular.dev/update-guide generates step-by-step instructions for your specific version pair. Use it alongside this guide — it covers the mechanical steps while this guide covers the strategic decisions and enterprise-specific pitfalls.

The Core Upgrade Command

Every Angular upgrade follows the same pattern:

ng update @angular/core @angular/cli

Angular enforces upgrading one major version at a time. To go from Angular 14 to 20, you must walk through every intermediate version: 14→15→16→17→18→19→20. Each step runs migration schematics that automatically fix known breaking changes in your code.

Before starting any upgrade, commit your current state and run:

ng update

This shows available updates and whether your current version is within the supported upgrade range.

Version Compatibility Reference

Every Angular version requires specific TypeScript and Node.js versions. Mismatches cause build failures before you even touch application code.

UpgradeTypeScript RequiredNode.js RequiredKey Dependency Change
Angular 14>=4.6.2 <4.9.0^14.15.0 || ^16.10.0
Angular 15>=4.8.2 <5.0.0^14.20.0 || ^16.13.0 || ^18.10.0Node 18 support added
Angular 16>=4.9.3 <5.2.0^16.14.0 || ^18.10.0Node 14 dropped
Angular 17>=5.2.0 <5.5.0^18.13.0 || ^20.9.0Node 16 dropped, TS 5.x required
Angular 18>=5.4.0 <5.6.0^18.19.1 || ^20.11.1 || ^22.0.0Node 22 support added
Angular 19>=5.5.0 <5.9.0^18.19.1 || ^20.11.1 || ^22.0.0TS 5.5+ required
Angular 20>=5.8.0 <6.0.0^20.19.0 || ^22.12.0 || ^24.0.0Node 18 dropped
Angular 21>=5.9.0 <6.0.0^20.19.0 || ^22.12.0 || ^24.0.0

RxJS has remained stable across the entire range at ^6.5.3 || ^7.4.0. No Angular upgrade from 14 to 21 forces an RxJS version change.

Check your current versions before starting:

ng version
node --version
npx tsc --version

Every Upgrade Step, In Detail

Angular 14 → 15: The Smooth Start

Effort estimate: 1-3 days for most applications.

What changes:

  • Standalone APIs graduate from developer preview to stable — but this is opt-in, no code changes required
  • NgOptimizedImage directive becomes stable
  • Functional router guards replace class-based guards (old pattern still works)
  • Angular Material refactored to MDC Web — this is the biggest source of upgrade work

The Material pain point: Angular 15 refactored every Material component to use MDC (Material Design Components for Web). CSS class names changed, DOM structure changed, and component styling may break. If your application heavily customizes Material styling, budget extra time here. The ng update schematic handles the import changes, but custom CSS overrides need manual review.

TypeScript: 4.6-4.8 → ~4.8.2. Minor bump — unlikely to surface new type errors.

Node.js: Same range plus Node 18 support added. No drop.

ng update @angular/core@15 @angular/cli@15

Angular 15 → 16: Signals Arrive

Effort estimate: 1-3 days, plus Node.js 14 migration if applicable.

What changes:

  • Signals introduced as developer preview (signal(), computed(), effect()) — opt-in, no code changes required
  • esbuild builder available as developer preview — opt-in
  • Required inputs (@Input({ required: true })) available
  • Router input binding via withComponentInputBinding()
  • DestroyRef replaces manual OnDestroy patterns
  • Standalone migration schematic: ng generate @angular/core:standalone

Breaking: Node.js 14 is dropped entirely. If your CI/CD or development environments run Node 14, upgrade Node first.

TypeScript: 4.8 → >=4.9.3. Supports up to TS 5.1 in minor releases, bridging the 4.x-to-5.x transition.

ng update @angular/core@16 @angular/cli@16

Angular 16 → 17: The Big One

Effort estimate: 1-3 weeks for enterprise applications. This is the hardest upgrade in the 14-to-21 range.

Warning

The 16→17 upgrade is the most significant version jump in recent Angular history. It changes the default component model, the default build system, the template syntax, and the minimum TypeScript version simultaneously. Plan accordingly.

What changes:

  • Standalone becomes the default. All ng generate commands create standalone components. ng new scaffolds standalone-first projects. Existing NgModule code continues to work — this is a default change, not a forced migration.
  • esbuild/Vite becomes the default builder for new projects. Existing projects keep webpack but should plan to migrate. Build speed improvements of 67-87% reported.
  • New control flow introduced as developer preview: @if, @for (up to 90% faster than *ngFor), @switch. Old structural directives still work.
  • Deferrable views @defer introduced as developer preview.
  • Core signal APIs (signal(), computed()) graduate to stable.
  • Legacy Material components removed. If you deferred the MDC migration in the 14→15 or 15→16 step, it is now mandatory. Legacy Material (non-MDC) components are gone.
  • New @angular/ssr package replaces @nguniversal/express-engine.

Breaking:

  • Node.js 16 dropped entirely. Requires Node 18.13+ or Node 20.9+.
  • TypeScript 5.2+ required. This is a full major version jump from TS 4.x. If your codebase has TS 4.x-specific patterns, expect type errors to surface.

Migration schematics available:

ng generate @angular/core:standalone
ng generate @angular/core:control-flow

Enterprise pitfalls I see repeatedly:

  1. Teams that skipped the Material MDC migration in v15 hit it here as a hard blocker
  2. The TS 4.x → 5.x jump surfaces type errors in code that compiled before — especially around decorator metadata and enum narrowing
  3. CI/CD pipelines on Node 16 break and need environment updates before the upgrade can proceed
ng update @angular/core@17 @angular/cli@17

Wondering where your Angular app stands? Take the free 3-minute modernization scorecard →


Angular 17 → 18: The Smooth Upgrade

Effort estimate: 1-5 days for most applications.

What changes:

  • Built-in control flow (@if, @for, @switch) graduates to stable
  • Deferrable views @defer graduates to stable
  • Material 3 theming graduates from experimental to stable
  • Zoneless change detection introduced as experimental (provideExperimentalZonelessChangeDetection())
  • Signal inputs, signal queries, and output syntax continue in developer preview
  • angular.dev becomes the official documentation site (angular.io redirects)
  • @let syntax for local template variables introduced in 18.1

Breaking:

  • TypeScript >=5.4 required (bump from 5.2)
  • Node.js minimum bumped to ^18.19.1 (from ^18.13.0)
  • Zone coalescing enabled by default for new applications

Build system migration: If you are still on webpack, this is the recommended time to switch to the application builder:

ng update @angular/cli --name use-application-builder
ng update @angular/core@18 @angular/cli@18

Angular 18 → 19: Signals Go Stable

Effort estimate: 1-5 days for most applications.

What changes:

  • Signal APIs graduate to stable: input(), output(), model(), viewChild(), viewChildren(), contentChild(), contentChildren()
  • Standalone is now truly the default. standalone: true no longer needs to be specified — it is implicit. Non-standalone components must explicitly set standalone: false.
  • linkedSignal() introduced as experimental — writable signal that tracks higher-level state
  • resource() and rxResource() introduced as experimental — signal-based async data loading
  • Incremental hydration in developer preview
  • Route-level render mode configuration
  • HMR for styles enabled by default

Breaking:

  • TypeScript >=5.5 required
  • standalone: true is removed from generated code (already the default)
  • Effect timing changed — component effects execute during change detection, not after. This can break apps that relied on previous timing behavior.
  • APP_INITIALIZER deprecated in favor of provideAppInitializer()

Migration schematics:

ng generate @angular/core:signals          # Runs all signal migrations
ng generate @angular/core:signal-input-migration
ng generate @angular/core:signal-queries-migration
ng generate @angular/core:output-migration
ng generate @angular/core:inject-migration  # Constructor injection → inject()
ng update @angular/core@19 @angular/cli@19

Angular 19 → 20: Node 18 Dropped

Effort estimate: 3-7 days for enterprise applications. The Node.js drop adds environment work.

What changes:

  • Signal APIs fully stabilized: effect(), linkedSignal(), toSignal(), toObservable(), afterRenderEffect()
  • Zoneless promoted to developer preview — renamed from provideExperimentalZonelessChangeDetection() to provideZonelessChangeDetection() (stable in 20.2)
  • *ngIf, *ngFor, *ngSwitch officially deprecated — removal targeted for v22
  • Extended template expressions (** operator, in operator, untagged template literals)
  • Type checking for host bindings
  • Experimental Vitest support for testing
  • ng-reflect-* attributes removed by default

Breaking:

  • Node.js 18 dropped entirely. Requires ^20.19.0 || ^22.12.0 || ^24.0.0. This is the second-most impactful environment change after the 16→17 Node 16 drop.
  • TypeScript >=5.8 required (significant jump from 5.5)
  • TestBed.get() removed (deprecated since v9)
  • DOCUMENT token moved from @angular/common to @angular/core
  • afterRender() renamed to afterEveryRender()
ng update @angular/core@20 @angular/cli@20

Angular 20 → 21: Routine Maintenance

Effort estimate: 1-3 days for most applications.

What changes:

  • TypeScript >=5.9 required (minor bump from 5.8)
  • Node.js requirements unchanged (^20.19.0 || ^22.12.0 || ^24.0.0)
  • Continued stabilization of APIs introduced in v19/v20

This is a straightforward upgrade with no major breaking changes or environment drops.

ng update @angular/core@21 @angular/cli@21

The Upgrade Pain Matrix

Not all upgrades are equal. Here is how they rank by effort:

UpgradePain LevelPrimary Issue
14 → 15LowMaterial MDC refactoring if using custom styles
15 → 16Low-MediumNode 14 drop
16 → 17HighTS 5.x mandatory + Node 16 drop + standalone default + legacy Material removed
17 → 18LowMinor TS bump
18 → 19LowEffect timing change may surprise some apps
19 → 20Medium-HighNode 18 drop + TS 5.8 minimum
20 → 21LowRoutine

If you are planning a multi-version jump, the 16→17 boundary is where you should allocate the most time and testing effort.

Realistic Enterprise Timelines

Based on 19 enterprise upgrade projects, here is what multi-version jumps actually take:

Starting VersionTargetStepsEstimated Effort
Angular 14Angular 206 upgrades8-16 weeks
Angular 15Angular 205 upgrades6-12 weeks
Angular 16Angular 204 upgrades5-10 weeks
Angular 17Angular 203 upgrades3-6 weeks
Angular 18Angular 202 upgrades2-4 weeks
Angular 19Angular 201 upgrade1-2 weeks

These estimates assume:

  • Medium enterprise application (50-200 components)
  • 70/30 split between upgrade work and normal feature development
  • One dedicated developer driving the upgrade with team support for testing
  • CI/CD environment updates planned in advance

The timeline is not just code. Environment updates (Node.js, TypeScript, CI/CD pipelines), third-party library compatibility checks, and QA testing often take more time than the ng update command itself.

The Strategy That Works

Before You Start

  1. Check your Node.js and TypeScript versions against the compatibility table above. Environment mismatches are the #1 cause of failed upgrades.
  2. Run npm outdated or pnpm outdated to identify third-party libraries that may not support your target Angular version.
  3. Commit and branch. Every upgrade step should be its own commit so you can bisect issues.

During the Upgrade

  1. One version at a time, no exceptions. Run ng update @angular/core@<version> @angular/cli@<version>, fix any issues, verify the build, run tests, commit.
  2. Run migration schematics after each version jump — especially the standalone, control flow, and signal migrations from v17+.
  3. Separate the upgrade from modernization. Get to your target version first using existing patterns. Adopt signals, standalone, and new control flow as a separate initiative afterward.

After the Upgrade

  1. Migrate the build system if you are still on webpack. The esbuild/Vite application builder (default since v17) provides 60-80% build time improvements.
  2. Run the signal migration schematics to start adopting modern APIs incrementally.
  3. Establish a cadence. Upgrading one major version every 6 months is a few days of work. Upgrading five versions at once is months of work.

The single most expensive decision in Angular version management is the decision to skip "just one more release." Each skipped version adds non-linear effort to the eventual upgrade. The teams I work with that upgrade every 6 months spend 2-3 days per upgrade. The teams that wait 3 years spend 3-4 months catching up.

How This Maps to the 5-Dimension Framework

Version health is Dimension 1 of the 5-Dimension Angular Modernization Framework — and it carries the highest business-impact weight because every other dimension depends on it. You cannot adopt Angular Signals without being on Angular 17+. You cannot use the new control flow without Angular 17+. You cannot go zoneless without Angular 20+.

If you are not sure where your application stands, the Angular Modernization Assessment scores your project across all five dimensions in under three minutes — starting with version health.

For the full picture of what each version status means for your organization's security, compliance, and hiring, see Angular End of Life 2026.

Take the free Angular Modernization Assessment and find out exactly where your upgrade path should start.

angularupgrademigrationguideenterprise

Frequently Asked Questions

How do I upgrade Angular to the latest version?
Run ng update @angular/core @angular/cli to upgrade one major version at a time. Angular enforces sequential upgrades — you cannot skip versions. Each major version has its own breaking changes, dependency requirements, and migration schematics. Use the interactive guide at angular.dev/update-guide to see the specific steps for your version pair.
Can I skip Angular versions when upgrading?
No. The Angular CLI enforces upgrading one major version at a time. To go from Angular 14 to 20, you must upgrade through 14→15→16→17→18→19→20 sequentially. Each step runs its own migration schematics and resolves version-specific breaking changes. Attempting to skip versions will fail during dependency resolution.
How long does an Angular upgrade take?
A single major version upgrade typically takes 1-3 days for small applications and 1-2 weeks for medium enterprise applications. The two hardest transitions are 16→17 (TypeScript 5.x required, Node.js 16 dropped, standalone becomes default) and 19→20 (Node.js 18 dropped, significant TypeScript bump). Multi-version jumps compound — going from Angular 14 to 20 typically takes 2-4 months for enterprise applications.
What is the hardest Angular upgrade?
The 16→17 upgrade is the most significant. It requires jumping to TypeScript 5.2+, drops Node.js 16 support entirely, makes standalone components the default, introduces the esbuild/Vite builder as default, and removes legacy Angular Material components. The 19→20 upgrade is also notable because it drops Node.js 18 support. Plan extra time for these two transitions.
Which Angular version should I upgrade to?
As of mid-2026, target Angular 20 or 21. Angular 20 is in LTS through November 2026. Angular 21 is actively supported with LTS through May 2027. Angular 19 LTS ends in May 2026. Any version below 19 is already end-of-life with no security patches.
Free Assessment

See where your Angular app stands

Take the free modernization scorecard — 20 questions, 3 minutes. Get a personalized score across 5 dimensions with prioritized next steps.

Take the Free Scorecard
Newsletter

The Frontend
Signal

Actionable insights on Angular modernization, AI for dev teams, and frontend engineering — once a month. No fluff.

  • Migration patterns that actually work
  • AI workflow wins from real teams
  • Tool recommendations with honest reviews

No spam. Unsubscribe anytime.