Standalone components (stable since Angular 15) let you build Angular features without NgModules. They self-declare their own dependencies via the imports array, making code more readable and tree-shakeable.
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterLink } from '@angular/router';
import { UserCardComponent } from './user-card.component';
@Component({
selector: 'app-user-list',
standalone: true, // ← the key flag
imports: [CommonModule, RouterLink, UserCardComponent],
templateUrl: './user-list.component.html',
})
export class UserListComponent { }
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { appConfig } from './app/app.config';
bootstrapApplication(AppComponent, appConfig);
// app.config.ts
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideHttpClient } from '@angular/common/http';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideRouter(routes),
provideHttpClient(),
],
};
// app.routes.ts
export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () =>
import('./dashboard/dashboard.component').then(m => m.DashboardComponent),
},
{
path: 'admin',
loadChildren: () =>
import('./admin/admin.routes').then(m => m.adminRoutes),
},
];
// Before — declared in a module
@Component({ selector: 'app-widget', templateUrl: './widget.component.html' })
export class WidgetComponent { }
@NgModule({ declarations: [WidgetComponent], imports: [CommonModule] })
export class WidgetModule { }
// After — standalone
@Component({
selector: 'app-widget',
standalone: true,
imports: [CommonModule],
templateUrl: './widget.component.html',
})
export class WidgetComponent { }
// NgModule can be deleted
All Comments