Ecosystem and Migration
|
This section documents modern, standalone Angular — signals, the built-in This content was generated with the assistance of AI and should be verified against angular.dev before being relied on in production. Angular ships a major release roughly every six months and its APIs continue to evolve: the examples here target the current major release; where a consulted source disagrees with the current documentation, the documentation wins and the difference is noted. This section’s bibliography lists the reference material consulted while preparing these pages. |
Modern Angular is standalone-first, releases on a predictable schedule, and sits in a wide ecosystem of
state-management and build tooling. This page covers the move off NgModule, how to stay current, and the
libraries most often paired with Angular.
From NgModule to standalone
An NgModule was a class with an @NgModule decorator that grouped related pieces: declarations (the
components, directives, and pipes it owned), imports (other modules whose exports it needed), providers
(services), and — for the root module — bootstrap (the component to render first). Every component had to
belong to exactly one module, so adding a component meant editing a module too.
Standalone components, directives, and pipes declare their own dependencies through the imports array on
their decorator, so NgModule is no longer needed. The app boots from a component instead of a module:
import { bootstrapApplication } from '@angular/platform-browser';
import { provideRouter } from '@angular/router';
import { provideHttpClient } from '@angular/common/http';
import { App } from './app/app';
import { routes } from './app/app.routes';
bootstrapApplication(App, {
providers: [provideRouter(routes), provideHttpClient()],
});
Two schematics automate the change to an existing codebase. The standalone migration converts declarations, drops now-empty `NgModule`s, and rewrites the bootstrap:
ng generate @angular/core:standalone
The control-flow migration rewrites *ngIf / *ngFor / *ngSwitch to the built-in @if / @for / @switch
blocks:
ng generate @angular/core:control-flow
See the NgModules guide for the legacy model and
the migrations reference for every automated schematic (standalone,
control flow, inject(), signal inputs / outputs / queries, and more).
Keeping up to date
Angular ships a major release roughly every six months, with about 18 months of long-term support (LTS) per
major after it stops being current — so at any time the current major plus the previous one or two are
supported. Upgrade with ng update, which runs version-aware schematics that patch breaking changes for you:
ng update @angular/core @angular/cli
The interactive update guide generates the exact command list and manual steps for any from/to version pair; the releases reference lists the schedule and support windows.
State management
For most apps, signals plus small services — a service that owns a signal (or a computed over several)
and exposes methods to update it — is enough and needs no dependency. Reach for a library when many unrelated
components share complex, frequently-changing state.
-
NgRx Store + Effects — a Redux-style single store with actions, reducers, selectors, and
Effectsfor side effects; the most established option. See ngrx.io. -
NgRx SignalStore — the same team’s lighter, signal-based store built from
signalStore()andwithState/withComputed/withMethodsfeatures. See the SignalStore guide. -
NGXS — a class-and-decorator store (
@State,@Action,@Selector) that many find less boilerplate-heavy than classic NgRx. See ngxs.io. -
Elf — a small, modular reactive store built on RxJS with composable feature functions and a rich set of entity helpers. See the Elf docs.
import { Injectable, computed, signal } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class CartStore {
private readonly items = signal<string[]>([]);
readonly count = computed(() => this.items().length);
add(item: string): void {
this.items.update((list) => [...list, item]);
}
}
Build, monorepo, and meta-framework tooling
-
Nx — an extensible monorepo build system with Angular generators, computation caching, and affected-only task running; a common choice for multi-app Angular workspaces. See nx.dev.
-
AnalogJS — a Vite-powered meta-framework for Angular adding file-based routing, server routes, and Markdown content, aimed at full-stack and content sites. See analogjs.org.
-
Zoneless change detection — running without Zone.js (
provideZonelessChangeDetection()), where signals and explicit notifications drive updates; covered on Lifecycle and Change Detection.