
Angular has come a long way, and one of the biggest upgrades in recent versions (especially from Angular 14 onwards, and by default in Angular 17+) is Standalone Components. If you’re still sticking with NgModules
for everything, this shift might seem big—but it’s one that makes Angular much simpler and more enjoyable to work with.
Let’s break down what standalone components are, why Angular is going in this direction, and how you can start using them today.
🧩 What Are Standalone Components?
A standalone component is a regular Angular component—but with one major difference: it doesn’t need to be declared in an NgModule
. That means you can write components that are completely self-contained, which improves reusability, reduces boilerplate, and simplifies lazy loading.
✨ Key Benefits:
- ✅ No
NgModules
needed - ✅ Easier to reason about
- ✅ Faster to scaffold and maintain
- ✅ Better support for lazy loading
- ✅ Smaller, more tree-shakable bundles
🛠 How to Use Standalone Components
1. Create a Standalone Component
Just add standalone: true
in the decorator:
import { Component } from '@angular/core';
@Component({
selector: 'app-hello-world',
standalone: true,
template: `<h1>Hello, World!</h1>`,
})
export class HelloWorldComponent {}
That’s it! You now have a standalone component.
2. Bootstrap Without AppModule
No need for a root module anymore. Just use bootstrapApplication()
:
import { bootstrapApplication } from '@angular/platform-browser';
import { HelloWorldComponent } from './hello-world.component';
bootstrapApplication(HelloWorldComponent)
.catch(err => console.error(err));
This replaces the old AppModule
+ platformBrowserDynamic().bootstrapModule()
combo.
3. Use Common Features (like *ngIf, *ngFor)
Since there’s no NgModule
, you must manually import dependencies like CommonModule
or FormsModule
:
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-user-list',
standalone: true,
imports: [CommonModule],
template: `
<ul>
<li *ngFor="let user of users">{{ user }}</li>
</ul>
`,
})
export class UserListComponent {
users = ['Alice', 'Bob', 'Charlie'];
}
Want to use forms or HTTP? Just add FormsModule
, ReactiveFormsModule
, or HttpClientModule
to imports
.
🔄 Migrating from NgModules to Standalone Components
You don’t need to refactor everything at once. Angular supports both approaches, so you can migrate gradually.
Here’s a quick plan:
- Start by converting leaf components to
standalone: true
. - Remove those components from any
NgModule
declarations. - Add required modules directly via the
imports
array. - Eventually, move to
bootstrapApplication()
and eliminateAppModule
.
🧠 Why Angular Made Standalone the Default
When Angular 17 introduced a new project structure, it fully embraced standalone components as the default. Why?
- 🧹 Cleaner Code – No need to juggle module declarations.
- 🪶 Lighter & Faster – Better tree-shaking and smaller bundles.
- 🧠 Easier to Learn – New devs don’t need to understand NgModules to get started.
- 🔄 Better Architecture – Promotes a more modular and reusable design.
💡 Final Thoughts
Standalone components aren’t just a new feature—they represent a shift in how Angular apps are built. Whether you’re starting a new project or maintaining an existing one, adopting standalone components can:
- Simplify your architecture
- Reduce boilerplate
- Improve performance
- Make your codebase easier to maintain
So if you haven’t tried them yet, now’s the perfect time to jump in!
📣 Already using standalone components? Or thinking of switching? Let’s chat in the comments 👇