Angular Standalone Components: Complete Migration Guide from NgModules
Angular Standalone Components: Complete Migration Guide from NgModules
@Component({
selector: 'app-header',
standalone: true,
imports: [CommonModule, RouterModule],
template: `
<nav>
<a routerLink="/home">Home</a>
<a routerLink="/about">About</a>
</nav>
`
})
export class HeaderComponent {}// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { provideRouter } from '@angular/router';
import { routes } from './app/app.routes';
bootstrapApplication(AppComponent, {
providers: [
provideRouter(routes),
provideHttpClient(),
]
});ng generate @angular/core:standalone// Before: SharedModule approach
@NgModule({
declarations: [ButtonComponent, CardComponent],
exports: [ButtonComponent, CardComponent]
})
export class SharedModule {}
// After: Each component is standalone
@Component({
standalone: true,
selector: 'app-button',
template: `<button><ng-content></ng-content></button>`
})
export class ButtonComponent {}export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () => import('./dashboard/dashboard.component')
.then(m => m.DashboardComponent)
}
];Angular Standalone Components eliminate the need for NgModules and simplify your application architecture. This guide walks you through migrating an existing Angular app from NgModules to standalone components.
What Are Standalone Components?
Standalone components are self-contained components that declare their own dependencies directly, without needing an NgModule. They were introduced in Angular 14 as developer preview and became stable in Angular 15.
Creating a Standalone Component
@Component({
selector: 'app-header',
standalone: true,
imports: [CommonModule, RouterModule],
template: `
<nav>
<a routerLink="/home">Home</a>
<a routerLink="/about">About</a>
</nav>
`
})
export class HeaderComponent {}// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { provideRouter } from '@angular/router';
import { routes } from './app/app.routes';
bootstrapApplication(AppComponent, {
providers: [
provideRouter(routes),
provideHttpClient(),
]
});ng generate @angular/core:standalone// Before: SharedModule approach
@NgModule({
declarations: [ButtonComponent, CardComponent],
exports: [ButtonComponent, CardComponent]
})
export class SharedModule {}
// After: Each component is standalone
@Component({
standalone: true,
selector: 'app-button',
template: `<button><ng-content></ng-content></button>`
})
export class ButtonComponent {}export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () => import('./dashboard/dashboard.component')
.then(m => m.DashboardComponent)
}
];