Angular Standalone Applications
Learn Angular Standalone Applications including bootstrapApplication(), standalone components, routing, dependency injection, lazy loading, migration from NgModules, enterprise architecture, and interview questions.
Angular traditionally relied on NgModules to organize applications.
While NgModules served Angular applications well for many years, they introduced additional complexity:
- Boilerplate code
- Module declarations
- Imports and exports
- Large dependency graphs
- Difficult onboarding for new developers
To simplify Angular development, Angular introduced Standalone Applications.
Instead of bootstrapping an application using AppModule, modern Angular applications bootstrap directly from a Standalone Component.
Standalone Applications are the recommended architecture in Angular 17+ and the default approach in Angular 20.
Table of Contents
- What are Standalone Applications?
- Why Standalone Applications?
- Application Bootstrapping
- Standalone Components
- Standalone Routing
- Dependency Injection
- Lazy Loading
- Migrating from NgModules
- Enterprise Banking Example
- Best Practices
- Common Mistakes
- Top 10 Interview Questions
- Interview Cheat Sheet
- Summary
What are Standalone Applications?
A Standalone Application is an Angular application that does not require an AppModule.
Instead, Angular starts the application directly from a standalone root component.
Benefits include:
- Less boilerplate
- Simpler architecture
- Smaller applications
- Better lazy loading
- Improved tree shaking
- Faster development
Traditional Angular Architecture
flowchart TD
main.ts
main.ts --> AppModule
AppModule --> AppComponent
AppComponent --> Features
Standalone Application Architecture
flowchart TD
main.ts
main.ts --> AppComponent
AppComponent --> Features
Notice that AppModule is completely removed.
Traditional Bootstrapping
Older Angular applications
platformBrowserDynamic()
.bootstrapModule(
AppModule
);
This requires an AppModule.
Modern Bootstrapping
Standalone Applications use:
bootstrapApplication(
AppComponent
);
Angular starts directly from the standalone root component.
Bootstrap Flow
flowchart LR
main.ts
main.ts --> bootstrapApplication
bootstrapApplication --> AppComponent
AppComponent --> Browser
Creating a Standalone Component
Example
@Component({
selector: 'app-home',
standalone: true,
imports: [
CommonModule
],
templateUrl: './home.html'
})
export class HomeComponent {}
The standalone: true property identifies the component as standalone.
Standalone Component Architecture
flowchart LR
HomeComponent
HomeComponent --> CommonModule
HomeComponent --> RouterLink
HomeComponent --> ChildComponent
Components explicitly declare their own dependencies.
Application Configuration
Modern Angular applications configure providers during bootstrapping.
Example
bootstrapApplication(
AppComponent,
{
providers: [
provideRouter(routes)
]
}
);
Instead of AppModule, providers are registered during application startup.
Dependency Injection
Dependency Injection continues to work exactly as before.
Example
bootstrapApplication(
AppComponent,
{
providers: [
CustomerService
]
}
);
Services can also be registered using:
providedIn: 'root'
which remains the preferred approach for singleton services.
Routing
Standalone Applications use standalone routing APIs.
Example
export const routes = [
{
path: '',
component: HomeComponent
}
];
Bootstrap
provideRouter(routes)
No AppRoutingModule is required.
Routing Architecture
flowchart LR
Browser
Browser --> Router
Router --> Home
Router --> Customers
Router --> Payments
Lazy Loading
Standalone Applications simplify lazy loading.
Example
{
path: 'customers',
loadComponent: () =>
import('./customers.component')
.then(m => m.CustomersComponent)
}
Benefits
- Smaller bundles
- Faster startup
- Better Core Web Vitals
Lazy Loading Flow
flowchart LR
Application
Application --> InitialBundle
Application --> LazyComponent
LazyComponent --> DownloadWhenNeeded
Feature Organization
Example structure
src
app
customers
payments
accounts
shared
core
layouts
Each feature contains standalone components, routes, and services.
Standalone Directives
Angular built-in directives can also be imported directly.
Example
imports: [
NgIf,
NgFor,
RouterLink
]
Only the required directives are included in the component.
Standalone Pipes
Pipes are also standalone.
Example
imports: [
CurrencyPipe,
DatePipe
]
This improves tree shaking because unused pipes are excluded from the bundle.
Migration from NgModules
| Traditional | Standalone |
|---|---|
| AppModule | Removed |
| Feature Modules | Optional |
| AppRoutingModule | Removed |
| bootstrapModule() | bootstrapApplication() |
| RouterModule | provideRouter() |
| Module Imports | Component Imports |
Enterprise Banking Example
Large banking application
Customer Portal
↓
Dashboard
↓
Accounts
↓
Payments
↓
Cards
↓
Loans
↓
Investments
Each feature is developed as a collection of standalone components with its own routes and services.
Enterprise Architecture
flowchart TD
AppComponent
AppComponent --> Dashboard
AppComponent --> Accounts
AppComponent --> Payments
AppComponent --> Reports
Payments --> LazyLoading
Each feature can evolve independently while sharing common services.
Performance Benefits
| Optimization | Benefit |
|---|---|
| Smaller Dependency Graph | Faster Build |
| Better Tree Shaking | Smaller Bundle |
| Standalone Routing | Faster Navigation |
| Lazy Components | Faster Startup |
| Reduced Boilerplate | Easier Maintenance |
| Component-Level Imports | Better Optimization |
Standalone + Modern Angular
Standalone Applications work seamlessly with:
- Signals
- New Control Flow (
@if,@for) - Defer Blocks (
@defer) - SSR
- Hydration
- NgOptimizedImage
- Lazy Loading
This combination represents the recommended architecture for modern Angular applications.
Best Practices
| Practice | Recommendation |
|---|---|
| Use Standalone Components | Yes |
Bootstrap with bootstrapApplication() |
Yes |
Use provideRouter() |
Yes |
Prefer providedIn: 'root' |
Yes |
| Lazy Load Features | Yes |
| Use Component Imports | Yes |
| Organize by Feature | Yes |
| Adopt Signals | Recommended |
Common Mistakes
Mixing Module-Based and Standalone Patterns Unnecessarily
During migration, mixing both approaches temporarily is acceptable.
For new applications, prefer a fully standalone architecture.
Importing Entire Modules
Instead of importing a large module, import only the standalone directives, pipes, and components that are required.
Forgetting Component Imports
Standalone Components must explicitly import every directive, pipe, or child component they use.
Registering Providers Repeatedly
Application-wide singleton services should generally use:
providedIn: 'root'
rather than being registered multiple times.
Ignoring Lazy Loading
Standalone Applications make lazy loading easier.
Take advantage of it for feature areas.
Before vs After Standalone
| NgModule Architecture | Standalone Architecture |
|---|---|
| AppModule | AppComponent |
| Feature Modules | Feature Components |
| AppRoutingModule | provideRouter() |
| More Boilerplate | Less Boilerplate |
| Module Imports | Component Imports |
| More Configuration | Simpler Configuration |
Advantages
| Benefit | Description |
|---|---|
| Less Boilerplate | Fewer files |
| Better Readability | Simpler structure |
| Easier Learning | Lower entry barrier |
| Better Tree Shaking | Smaller bundles |
| Improved Lazy Loading | Faster startup |
| Enterprise Ready | Scalable architecture |
Top 10 Standalone Applications Interview Questions
1. What is a Standalone Application?
Answer
A Standalone Application is an Angular application that boots directly from a standalone component without requiring an AppModule.
2. Why were Standalone Applications introduced?
Answer
They reduce boilerplate, simplify application architecture, improve tree shaking, make lazy loading easier, and provide a better developer experience.
3. How do you bootstrap a Standalone Application?
Answer
Use:
bootstrapApplication(AppComponent);
instead of:
bootstrapModule(AppModule);
4. How do you define a Standalone Component?
Answer
Set:
standalone: true
inside the @Component decorator and list required dependencies in the imports array.
5. How is routing configured?
Answer
Standalone Applications configure routing using provideRouter(routes) during application bootstrap instead of creating an AppRoutingModule.
6. Can Standalone Applications use Dependency Injection?
Answer
Yes. Angular's Dependency Injection system works exactly the same. Services can be registered using providedIn: 'root' or application providers.
7. How does lazy loading work?
Answer
Standalone Applications use loadComponent() to lazy load standalone components, reducing the initial bundle size and improving startup performance.
8. Can Standalone and NgModule-based code coexist?
Answer
Yes. Angular supports incremental migration, allowing standalone components and NgModule-based features to coexist during a transition period.
9. What are the performance benefits of Standalone Applications?
Answer
- Smaller dependency graphs
- Better tree shaking
- Easier lazy loading
- Reduced boilerplate
- Smaller bundles
- Faster startup
10. What are Angular Standalone Application best practices?
Answer
- Use Standalone Components
- Bootstrap with
bootstrapApplication() - Configure routing using
provideRouter() - Use
providedIn: 'root' - Lazy load features
- Organize applications by feature
- Combine with Signals, SSR, Hydration, and the new Control Flow
Interview Cheat Sheet
| Topic | Recommendation |
|---|---|
| Root Bootstrap | bootstrapApplication() |
| Root Component | Standalone |
| AppModule | Not Required |
| Routing | provideRouter() |
| Lazy Loading | loadComponent() |
| Services | providedIn: 'root' |
| Component Dependencies | imports |
| Angular Version | 17+ |
| Default Architecture | Standalone |
| Enterprise | Feature-Based Structure |
Summary
Standalone Applications represent the modern architecture for Angular development. By eliminating the need for AppModule, they reduce boilerplate, simplify configuration, improve tree shaking, and make lazy loading more intuitive. Combined with Standalone Components, Signals, SSR, Hydration, Defer Blocks, and the new Control Flow, Standalone Applications provide a scalable, maintainable, and high-performance foundation for enterprise Angular applications.
Key Takeaways
- ✅ Standalone Applications remove the need for
AppModule. - ✅ Applications bootstrap using
bootstrapApplication(). - ✅ Components declare dependencies through the
importsarray. - ✅ Routing is configured with
provideRouter(). - ✅ Lazy loading uses
loadComponent(). - ✅ Dependency Injection works the same as in module-based applications.
- ✅ Standalone architecture improves tree shaking and reduces bundle size.
- ✅ Angular supports gradual migration from NgModules.
- ✅ Standalone Applications are the recommended architecture for Angular 17+.
- ✅ Standalone Applications are a common topic in modern Angular interviews.
Next Article
➡️ 140-Zone-less-Angular-QA.md