What's New in Angular 20
Angular 20.0.0 is not a version releasing some new key feature for the framework. But that's definitively a version improving the developer experience. Some more Signa APIS are now stable and ready to be used in production: effect, linkedSignal, toSignal and toObservable. Checkout their history on Can I Use feature.
While not being stable yet, Zoneless change detection has been promoted in preview, paving the way for a bright future.
You expected an experimental release for Signal Forms or Selectorless Components? These features are not ready yet as the Signal Forms prototype is still on a separate branch on Angular Repository but you can still check its docs to get an idea of what's coming. No public code is available yet in the Angular Repository for Selectorless Components.
Technical Requirements
- TypeScript 5.8 or later
- Node.js 20.11.1 or later
Prerequisites
Typescript
Angular 20 drops support for TypeScript versions less than 5.8 and defaults to 5.8.2 on a new/migrated project.
For a full list of TypeScript 5.8 changes, visit: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-8.html
Node.js
Node.js v18 reached End-of-Life on April 30, 2025, and will no longer be supported in Angular v20. Node.js versions 22.0 to 22.10 are also no longer supported.
Before upgrading to Angular v20, ensure the Node.js version is at least 20.11.1. Angular updated its min Node.js support to 20.19, 22.12, and 24.0.
For the full list of supported versions, visit: https://angular.dev/reference/versions
Signals
The Resource API has been released in 19.0 (resource and rxResource) and 19.2 (httpResource) as a developer preview feature and the v20 release only includes a few minor changes to it:
- add support equality function in httpResource (https://github.com/angular/angular/pull/60026)
- include HTTP status code and headers when HTTP requests errored in httpResource (https://github.com/angular/angular/pull/60802)
- rename httpResource function in factory (https://github.com/angular/angular/pull/60022)
All other Signal APIs are now stable, which includes:
- effect
- linkedSignal
- toSignal
- toObservable
Tagged Template Literals
Simplify complex interpolation by avoiding concatenation in favor of template literals now supported:
@Component({ template: "{{ greet`Hello, ${name()}` }}",})export class MyComp { name = input();
greet(strings: TemplateStringsArray, name: string) { return strings[0] + name + strings[1] + "!"; }}
Enhanced dynamic component creation
So far we were not able to set inputs and outputs for a dynamic component on its creation itself. After creating it only, we were able to set the inputs and outputs in an imperative way:
export class App { vcr = viewChild('container', {read: ViewContainerRef}); componentRef?: ComponentRef<AlertNotification>;
createComponent(): void { this.vcr()?.clear(); this.componentRef = this.vcr.createComponent(AlertNotification);
this.componentRef.setInput('title', 'Something went wrong'); this.componentRef.?.instance.closed.subscribe(() => { this.componentRef?.destroy(); }); }}
Besides being very verbose, this approach did not include type checking for inputs, making it error prone.
The declarative way comes to the rescue
Angular 20 changes this in a declarative way, and enhancing two-way data and directive bindings too!
Angular 20 introduces a new API for creating dynamic components to siplify input/output, two-way data and directive bindings.
import { createComponent, signal, inputBinding, outputBinding,} from "@angular/core";
const canClose = signal(false);
// Create MyDialogcreateComponent(MyDialog, { bindings: [ // Bind a signal to the `canClose` input. inputBinding("canClose", canClose),
// Listen for the `onClose` event specifically on the dialog. outputBinding<Result>("onClose", (result) => console.log(result)), ], directives: [ // Apply the `FocusTrap` directive to `MyDialog` without any bindings. FocusTrap,
// Apply the `HasColor` directive to `MyDialog` // and bind the `red` value to its `color` input. // The callback to `inputBinding` is invoked on each change detection. { type: HasColor, bindings: [inputBinding("color", () => "red")], }, ],});
New Style Guide
Angular 20 release will also make the new Angular Style guide public, reducing its scope to focus on Angular specific recommanded code styling conventions. This will allow us to focus on the most important parts of the code and make it easier to understand and maintain.
Angular CLI
How are new projects affected with ng new
@angular/build
is now the default builder for new Angular CLI projects.- Angular CLI
ng generate
command to not include suffixes anymore for Services, Component and directives
ng generate changes
components, directives and services
Say goodbye to suffixes for your generated components, directives and Services to match updates to the Angular style guide.
Angular CLI ng generate
command to not include suffixes anymore for Services, Component and Directives.
You can now pass a --type
option to specify the type of the generated file: ng generate component product-list --type=component
.
It will result in a product-list.component.ts
file being created, including a ProductListComponent class.
Otherwise the new default behavior would be a product-list.ts
file being created, including a ProductList class.
"schematics": { "@schematics/angular:component": { "type": "component" }, "@schematics/angular:service": { "type": "service" }, "@schematics/angular:directive": { "type": "directive" } }
guards, interceptors, pipes, resolvers and modules
These Angular entities keep the suffix on their class name, but the file name changes. The new default is to use a dash separator between the class name and the suffix. For example, auth.guard.ts
becomes auth-guard.ts
. You can pass the --typeSeparator
option to specify the separator character to use for the generated file.
PWA
While not being under active developement and not something the Angular team really plan on spending time one one way or the other in the near future, a change happens in Angular 20 to
consistently uses withAppShell
for vite projects (as not used previously by Webpack-based builders).
SSR
Header flushing introduced to optimize response time, reducing time to first byte (TTFB) and improving perceived load times.
First released in developer preview, the --server-routing
ng new option is now removed to always enable server routing when using the application builder.
Migrations
SSR
-
Migrate imports of
provideServerRendering
from@angular/platform-server
to@angular/ssr
. (https://github.com/angular/angular-cli/commit/26fd4ea73ad2a0148ae587d582134c68a0bf4b86) -
Update
provideServerRendering
to usewithRoutes
and removeprovideServerRouting
from@angular/ssr
. (https://github.com/angular/angular-cli/commit/18e13e2ceed931d29aa5582980c7d6d1f66c9787) -
https://github.com/angular/angular-cli/commit/86d241629ff51f0bb5988e81cac8658b01704d49
-
https://github.com/angular/angular-cli/commit/33b9de3eb1fa596a4d5a975d05275739f2f7b8ae
-
https://github.com/angular/angular-cli/commit/cdfc50c29a2aa6f32d172b505a0ef09e563dfc59
-
https://github.com/angular/angular-cli/commit/2d11e8e45b29cf879ee72ffbcf438198d73ffaba
Error reporting
- https://github.com/angular/angular/pull/60104
- https://github.com/angular/angular/pull/60056
- https://github.com/angular/angular/pull/60057
- https://github.com/angular/angular/pull/60149
- https://github.com/angular/angular/pull/59789
- https://github.com/angular/angular/pull/60404
- https://github.com/angular/angular/pull/60580
- https://github.com/angular/angular/pull/60376
- https://github.com/angular/angular/pull/60251
- https://github.com/angular/angular/pull/60651
- https://github.com/angular/angular/pull/60879
- https://github.com/angular/angular/pull/60704
- https://github.com/angular/angular/pull/59443
- https://github.com/angular/angular/pull/61028
- https://github.com/angular/angular-cli/commit/3e35167855b3eacb9f45948ef75e999956819490
- https://github.com/angular/angular-cli/commit/beab546bf2680d568af12e51e948a100098ae3fd
- https://github.com/angular/angular-cli/commit/cb2ab43abcf0e3c1a2cc584a326e1eea5eede7a8
- https://github.com/angular/angular-cli/commit/156a14e387d83002fa01b33d574a6fbc078dad84
- https://github.com/angular/angular-cli/commit/a8817a3b2a9a94bdfcba4bf690e217e7d2d4686c
- https://github.com/angular/angular-cli/commit/319b8e0c2a0cd30ab96576464b4172a1f76a97a6
- https://github.com/angular/angular-cli/commit/e03f2b89992cb1e34a57f9cd5beef77674c116b6 (add as a feature ?)
Performance
- https://github.com/angular/angular/pull/60004
- https://github.com/angular/angular/pull/60156
- https://github.com/angular/angular/pull/60103
- https://github.com/angular/angular/pull/60130
- https://github.com/angular/angular/pull/60102
- https://github.com/angular/angular/pull/59723
- https://github.com/angular/angular/pull/58089
- https://github.com/angular/angular/pull/60774
- https://github.com/angular/angular/pull/60944
- https://github.com/angular/angular/pull/58041
- https://github.com/angular/angular/pull/61040
- https://github.com/angular/angular-cli/commit/63428f3f1e2ffd427011ea8a17b70f8829ae0bdf
- https://github.com/angular/angular-cli/commit/6bd7b9b4a59240caa4f19185570aec8263d8a0a7
Profiling
DX
- https://github.com/angular/angular/pull/59524
- https://github.com/angular/angular/pull/58673
- https://github.com/angular/angular/pull/60455
- https://github.com/angular/angular/pull/60495
- https://github.com/angular/angular/pull/60616
- https://github.com/angular/angular/pull/60597
- https://github.com/angular/angular/pull/60789
Router
service worker
CLI
- https://github.com/angular/angular-cli/commit/093c5a3152c4282d4afb51df40945283cc94d281
- https://github.com/angular/angular-cli/commit/03180fe0358662f8fd3255ad546994da3e3bda9c
- https://github.com/angular/angular-cli/commit/381d35fe40f062713eac550a12b58c30c1ec33a9
- https://github.com/angular/angular-cli/commit/a910fe9ae0423146f6509c5b9c45c88415365c9f
- https://github.com/angular/angular-cli/commit/c1de633007c423cfd9113cc781b5647e59306146
- https://github.com/angular/angular-cli/commit/9b682e62519e761477e6266650239bf58026a9f4
- https://github.com/angular/angular-cli/commit/4955ee0aa31c1021b6369c29a250dd5a9a3f11cd
- https://github.com/angular/angular-cli/commit/d067cedf05051e3a0f237d50306e1e4c881a0328
- https://github.com/angular/angular-cli/commit/be6f13ec16f01851d38b900dbfc4df7ccfb94d16
schematics
-
https://github.com/angular/angular-cli/commit/23fc8e1e176f23442876b086bff52dd5f35abbc0
-
https://github.com/angular/angular-cli/commit/8d715fa948d432b18d06bcf42eed3a7681383523
-
https://github.com/angular/angular-cli/commit/bc0f07b484300848ee81c5719c58909b40f99deb
-
https://github.com/angular/angular-cli/commit/0f7dc2cd8f76f928e64e734563a433ff6a0d478c
-
https://github.com/angular/angular-cli/commit/5876577af163b534846e720b0184558197dce741
-
https://github.com/angular/angular-cli/commit/c557a19ef4eed9f2d805bb235d3819c69a1aaef6
-
https://github.com/angular/angular-cli/commit/5fc5951440c9306c4349fa3f8dbcb1b584441fe8
-
https://github.com/angular/angular-cli/commit/040282d8fd5838266785997442c4f5a269666cf3
-
https://github.com/angular/angular-cli/commit/070d60fb383bb14d39f969942641253e54980fcf
-
https://github.com/angular/angular-cli/commit/e6083b57bb5b38db14264253095a9729738d22f2
-
https://github.com/angular/angular-cli/commit/92e193c0b9a2b85b68d83c5f378d30fc8d10f13e
-
https://github.com/angular/angular-cli/commit/901ab60d9f63fcff17213dbf7fe17e4a46835974
-
https://github.com/angular/angular-cli/commit/f36a27272f3f7e2673d692d73286280f4c6d357a
-
https://github.com/angular/angular-cli/commit/b13805a77a5654a352a6c6f760965c326977ff14
Migrations
- inject flag: https://github.com/angular/angular/pull/60318
- fix output: https://github.com/angular/angular/pull/60626
- fix https://github.com/angular/angular/pull/60688
- fix https://github.com/angular/angular/pull/60602 -fix https://github.com/angular/angular/pull/60764
- fix https://github.com/angular/angular/pull/60763
- fix https://github.com/angular/angular/pull/60713
- fix https://github.com/angular/angular/pull/60916
- ssr https://github.com/angular/angular-cli/commit/26fd4ea73ad2a0148ae587d582134c68a0bf4b86
- https://github.com/angular/angular-cli/commit/1e137ca848839402bc214fbccdc04243862d01d0
- style guide https://github.com/angular/angular-cli/commit/fdc6291dda4903f418667d415b05367390cf829d
- https://github.com/angular/angular-cli/commit/8654b3fea4e2ba5af651e6c2a4afddaf6fc42802
Testing
- https://github.com/angular/angular/pull/60513
- https://github.com/angular/angular-cli/commit/c8c73185a66c7c7825e30f7fcedbaacc9ca1c593
- https://github.com/angular/angular-cli/commit/f780e8beb3ccea27ef0442d1d3814ec2a668057d
- https://github.com/angular/angular-cli/commit/bd917d92a653b1a5ece7ab96adfde8f8d282c34a
- https://github.com/angular/angular-cli/commit/7bb1f87478d441e35b73b920c8bfcd4376a3422d
- https://github.com/angular/angular-cli/commit/0d40cdecd0fdc1b03d2cafcdd5321db0d31b56ee
- https://github.com/angular/angular-cli/commit/d2bfc6bd4eb0892e9eb6205838158142b716d21c
- https://github.com/angular/angular-cli/commit/b155ba1dcdbc3c506311e4434c37f1b4c77c7572
Chekc
- https://github.com/angular/angular/pull/60060
- https://github.com/angular/angular/pull/60203
- https://github.com/angular/angular/pull/60210
- https://github.com/angular/angular/pull/60202
- https://github.com/angular/angular/pull/60279 (add as a feature ?)
- https://github.com/angular/angular/pull/60267 (add as a feature ?)
- https://github.com/angular/angular/pull/60460
- https://github.com/angular/angular/pull/60397
- https://github.com/angular/angular/pull/60663
- https://github.com/angular/angular/pull/58008
- https://github.com/angular/angular/pull/60571 (read more about deferred imports)
- https://github.com/angular/angular/pull/60534
- https://github.com/angular/angular/pull/60720
- https://github.com/angular/angular/pull/60656
- https://github.com/angular/angular/pull/60999
- https://github.com/angular/angular/pull/59635
- https://github.com/angular/angular/pull/60973
- https://github.com/angular/angular/pull/61106
- https://github.com/angular/angular/pull/60512
- https://github.com/angular/angular-cli/commit/280693231e143aa09f841e3179317573a3576545 (add as a feature ?)
- https://github.com/angular/angular-cli/commit/2d03d8f11325cfba72b43f531e4bc27140d45caf
- https://github.com/angular/angular-cli/commit/3c9172159c72f3c8ea116557ba5bf917a15d2f07
- https://github.com/angular/angular-cli/commit/f0dd60be1ec72d9c8674471965b11be83083a0f1
- https://github.com/angular/angular-cli/commit/f126f8d34b087dd3a916dfb93cd255aac4d6c309
- https://github.com/angular/angular-cli/commit/f4be831197010a17394264bc74b1eb385ba95028
- https://github.com/angular/angular-cli/commit/d6f594fe0f8f21d9c0e2abedb5c8433a1aa5c157
- https://github.com/angular/angular-cli/commit/3d997feb689b838a9777b7727bf937098c7d5e83
- https://github.com/angular/angular-cli/commit/5e8c6494d3eb5a0f61e8b07de4c53233147e9d46
- https://github.com/angular/angular-cli/commit/e8096303659f4f02ac05fe8f655bb29bc12fda28 (add as a feature ?)
- https://github.com/angular/angular-cli/commit/8bfcae4c1ba19c9bbd75ddb1ed61ddbf6fa2b76b
- https://github.com/angular/angular-cli/commit/0ab1ddf632b7305db28a2f87f5c6b099a44669f6 (add as a feature ?)
- https://github.com/angular/angular-cli/commit/f42f5c14c0c51d7705bee7b67afc317c45fb9230
- https://github.com/angular/angular-cli/commit/059c10eb4df72b0d67f73783826e2bbae611ad35