Read More
🎉Celebrating 25 Years of Tech Excellence and Trust - Learn More
Quick Summary – Angular v20 has been released, bringing exciting new features and functionalities that streamline the development process and boost performance. Along with stable standalone components, better lazy loading, and server-side rendering, the current version also has advanced hydration for faster load times and better SEO. So, developers must explore these features to upgrade their Angular projects and improve the workflow. Read on the blog to learn more!
Angular consistently ranks among the top frameworks for building scalable, maintainable web apps. Since its initial release, it has steadily advanced, releasing new features, staying aligned with modern web standards, and improving developer experience. The next big leap - Angular v20 - is a prominent upgrade for developers, delivering substantial improvements in architecture, tooling, reactivity, and performance.
Whether you’re a developer or an Angular veteran looking to adopt the popular framework for your next web development project, understanding what v20 brings to the table is imperative. In this blog, you’ll explore everything developers should know about the new Angular version – 20 - from core improvements to release timeline to tooling and upgrade steps to bonus insight for v21 fans.
Angular v20 is the latest, major release of Google’s flagship frontend framework, six months after the Angular 19 release. It builds on the robust foundation of the Angular environment while presenting major upgrades that handle developer pain points and comply with current web standards.
Angular v20, released on May 28, 2025, marks a significant step forward in performance, security, and developer productivity. Staying true to Angular’s six-month release cycle, this version introduces advanced tooling, faster rendering, and improved dependency management - making it ideal for scalable web applications. Angular 20 also includes vital security updates that align with modern web standards. Developers should note that active support ends on November 21, 2025, per endoflife.date. Upgrading ensures long-term compatibility, optimal performance, and access to the latest features in enterprise-grade Angular apps.
With a focus on minor, steady improvements, this current Angular version focuses on seamless integration with TypeScript and modern tooling, optimized compilation and runtime performance, and improved developer experience.
It's hard to believe that the latest version of Angular has already been released. So here we are! This release stands as a significant achievement, jam-packed with robust features, improvements, and a few breaking changes. Let’s explore the new Angular 20 features:
Signals are the future of Angular reactivity, and the community has been highly committed to stabilizing the APIs around them.
Most of the APIs related to signals are now stable, including:
Also, two developer preview APIs have been renamed.
The biggest change is that afterRender() is now referred to as afterEveryRender() and is now stable.
Zoneless change detection is the future of Angular change detection. Well, zoneless is no more experimental, but is not yet stable. It is now in developer preview and indicates that the providers from Angular v18 have been renamed from provideExperimentalZonelessChangeDetection to provideZonelessChangeDetection. In the same way, provideExperimentalCheckNoChangesForDebug has been renamed provideCheckNoChangesForDebug.
The new --experimental-zoneless flag has also been renamed to --zoneless in the CLI. Now, the CLI asks if you want to enable it when starting a new project.
The current version comes with a few deprecations, removals, and breaking changes. The structural directives ngSwitch, ngFor, and ngIf are now officially deprecated in favor of the control flow syntax.
You can also note that, in general, structural directives are not deprecated, but the ngSwitch, ngFor, and ngIf ones are. These directives, however, might be eradicated in Angular v22.
The Angular 20 release also supports a few new things in templates.
Exponentiation is now available in templates using the ** operator.
<p>{{ 2 \*\* 3 }}</p>
Angular v19.2 rolled out the support for template strings in expressions, and now the developers can use tagged template literals as well:
<p>{{ translate`app.title`}}</p>
The void is now also supported in template expressions. It can help ignore the return value of a function, for instance – the event listeners - as returning false prevents any default behavior:
<button (click)="void selectUser()">Select user</button>
in is also supported in the latest version of Angular:
@if ('invoicing' in permissions) {
<a routerLink="/invoices">Invoices</a>
As proof that structural Angular directives are still alive, a new extended diagnostic is now integrated to check if you’re using a structural directive without importing it: missingStructuralDirective.
Another extended diagnostic helps check that a function is adequately invoked when developers use a track expression of a @for block. It is also now suggested to use parentheses to avoid confusion. Developers now need to write {{ a ?? (b && c) }} instead of {{ a ?? b && c }}.
Some Angular 20 changes avoid letting errors slip through the cracks.
A new provideBrowserGlobalErrorListeners provider has been added in v20. It helps register global error listeners in the browser. This is helpful when catching errors not detected by other Angular versions. This provider is automatically added to the app.config.ts file when creating a new project with the CLI.
Note - The errors registered in event listeners are now submitted to the internal error handler, which means you can recognize errors in tests that were not reported before. You can also rectify them or use rethrowApplicationErrors: false in configureTestingModule.
The function - ViewViewContainerRef.createComponent - has acquired a few possible options in the current Angular version. You can specify the directives to apply to dynamically built components and to input values to provide to the component using the brand new inputBinding() function. It is now also possible to declare two-way bindings with twoWayBinding() and to look for outputs with ``:
const user = createComponent(User, {
bindings: [
twoWayBinding("name", name)
],
// two-way binding with the signal name
directives: [
{
type: CdkDrag,
// applies the Drag directive
bindings: [
inputBinding("cdkDragLockAxis", () => 'x')),
// binds its lock axis to 'x' (has to be a signal or a function)
outputBinding<CdkDragEnd>('cdkDragEnded', event => console.log(event))
//️ listens to the end of the dragging action
]
}
]
});
A new project can directly use the @angular/build package instead of @angular-devkit/build-angular. This eradicates the need to install all the Webpack-related transitive dependencies and this package, resulting in a considerable decrease in the node_modules installed (nearly 200 MB!).
If you’re updating an Angular CLI project, the migration will help upgrade your angular.json file to use the new builder. The file has also been simplified, with some options like scripts, index, and outputPath.
With the Angular 20 release, it's now possible to pass options to ViewportScroller.scrollToAnchor()/scrollToPosition(). It supports all native scroll options, for instance, behavior: this.scroller.scrollToPosition([0, 10], { behavior: 'smooth' }).
Also a, good news for those using resolvers in the router – developers can now read the resolved data from the parent route:
provideRouter([
{
path: "users/:id",
resolve: { user: userResolver },
// user resolver in the parent route
children: [
{
path: "posts",
resolve: { posts: postsResolver },
// route.data.user is now available in the posts resolver
component: UserPosts,
},
// ...
],
},
]);
The current version of Angular is not merely a progressive update; it’s a major step forward, highlighting the framework’s advancement towards speed, simplicity, and modern web standards. Following are the reasons why Angular developers should make the shift:
To upgrade your Angular application to version 20, follow these brief steps:
Use the following npm command to update CLI:
Global Update -
npm install -g @angular/cli
Integrate Angular CLI in your project -
ng update @angular/cli
Angular Core and Dependencies -
ng update @angular/core
Verify App Functionality: Run your app and ensure all the features and functionalities work as anticipated.
While the current Angular version is a well-engineered and developer-friendly release, however, there are a few limitations to keep consider:
The Angular team will likely provide updates on these features soon, but we can’t resist sharing the two significant features and functionalities they’ve been creating under the radar!
In parallel, there’s been prototyping going on for signal forms. Is it based on reactive forms or template forms? No, it seems like it will introduce an entirely new third option to write forms in Angular.
The below-mentioned code is only available in the prototyping branch, so don’t expect to use it in the current version of Angular:
@Component({
selector: "user-form",
imports: [FieldDirective],
// ️ new directive
template:
<form>
<label>Username: <input [field]="userForm.username" /></label>
<!-- used to bind fields -->
<label>Name: <input [field]="userForm.name" /></label>
<label>Age: <input type="number" [field]="userForm.age" /></label>
</form>
,
})
class UserFormComponent {
userModel = signal<UserModel>({ username: "", name: "", age: 0 });
protected readonly userForm: Field<User> = form<User>(
// form() is a new function and returns a Field
userModel,
// data to edit
(userPath: FieldPath<User>) => {
disabled(userPath.username, () => true, "Username cannot be changed");
required(userPath.name);
error(userPath.age, ({ value }) => value() < 18, "Must be 18 or older");
}
// schema that allows to define the dynamic behavior of fields (enabled/disabled)
// and the validation, with provided and custom validators
);
}
It's the start of a new experiment: selectorless components. In the future, developers might be able to use components and directives without using a selector in the templates and without integrating the imports array into the component metadata!
import { User } from './user/user';
// TS import is still necessary
@Component({
template: '<User [name]="name()" (selected)="selectUser()" />',
// but no Angular imports are required!
})
export class App {
You can also use components in templates without a selector with the help of their class name directly. Same goes for directives, but they currently need an @ prefix:
<User @CdkDrag(cdkDragLockAxis="y") [name]="name()" (selected)="selectUser()" />
You can also use pipe without a name:
import { FromNowPipe } from './from-now-pipe';
@Component({
template: '<p>{{ date | FromNowPipe }}</p>'
})
export class App {
Start Building Smarter with Angular 20!Angular 20 is a landmark release that adopts modern frontend paradigms while managing the framework’s strong ecosystem. Hence, upgrading to the latest version of Angular is a strategic initiative for any developer or team invested in the framework, unleashing new potential that improves productivity and app performance. Whether you’re starting from the ground up or maintaining a legacy app, the Angular 20 release comes with the tools to develop cutting-edge web apps efficiently.So, now’s the perfect time to get started. Harness the power of new Angular 20 features and simplify your development workflow like never before. At Radixweb, we go beyond code—we provide top-notch Angular development services and help you explore the dynamic ecosystem of your tech stack. So, whether you're optimizing enterprise-grade apps or scaling a startup, our experts will help you see beyond limits.Connect with us today and make the most of Angular’s latest version.
Vishal Siddhpara is a veteran Software Maestro with in-depth knowledge of Angular, .NET Core, and Web API. He is a tech wizard with 12 years of proficiency in emerging technologies, including MVC, C#, Linq, Entity Framework, and more. He is a potential leader with a passion for delivering exceptional software solutions and ensuring satisfactory customer experiences.
Ready to brush up on something new? We've got more to read right this way.