Angular has a reputation for being heavyweight and complex, and for older versions that was fair. Angular 19 is a different story: signals deliver fine-grained reactivity without Zone.js magic, standalone components eliminate most NgModule boilerplate, and the build system switched to esbuild for dramatically faster builds. The framework is worth a second look if you dismissed it years ago.
What changed in 2026
- Signals are stable and the recommended reactivity model.
signal(), computed(), and effect() replace most cases where you would have used ChangeDetectionStrategy.OnPush and manual markForCheck().
- Zone.js is opt-out — new projects created with
--no-zoneless false get Zone.js for backward compat, but --zoneless (no Zone.js) is the modern path.
- NgModule is deprecated for new code. All CLI-generated components are standalone by default.
- Angular 19 dev server uses Vite under the hood via the Application Builder.
@angular/ssr (formerly Universal) is integrated into the CLI for SSR and SSG.
Setting up a project
npm install -g @angular/cli
ng new my-app --standalone --routing --style=css --zoneless
cd my-app
ng serve
The --zoneless flag is the 2026 best practice for new apps.
Core concepts in order
1. Signals — the new reactivity primitive
import { Component, signal, computed } from "@angular/core";
@Component({
selector: "app-counter",
standalone: true,
template: `
<p>Count: {{ count() }}</p>
<p>Doubled: {{ doubled() }}</p>
<button (click)="increment()">+</button>
`,
})
export class CounterComponent {
count = signal(0);
doubled = computed(() => this.count() * 2);
increment() {
this.count.update((n) => n + 1);
}
}
Signals are called like functions in templates — count() not count. computed() memoises derived values automatically.
2. Standalone components and the bootstrapping model
// main.ts
import { bootstrapApplication } from "@angular/platform-browser";
import { AppComponent } from "./app/app.component";
import { provideRouter } from "@angular/router";
import { routes } from "./app/routes";
bootstrapApplication(AppComponent, {
providers: [provideRouter(routes)],
});
No AppModule. Providers go directly in bootstrapApplication or in providers arrays in components.
3. Services and dependency injection
Angular's DI system is one of its genuine strengths. A service injected via inject() in a signal-based component:
import { Injectable, inject } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { toSignal } from "@angular/core/rxjs-interop";
@Injectable({ providedIn: "root" })
export class TaskService {
private http = inject(HttpClient);
getTasks() {
return this.http.get<Task[]>("/api/tasks");
}
}
toSignal() from @angular/core/rxjs-interop converts any Observable to a signal, bridging the RxJS and signals worlds.
Comparison: Angular vs alternatives in 2026
| Dimension |
Angular 19 |
React 19 |
Vue 3 |
Svelte 5 |
| Opinionation |
Very high |
Low |
Medium |
Medium |
| TypeScript DX |
Excellent |
Excellent |
Excellent |
Good |
| Bundle size |
Large (~50 KB gz) |
Medium |
Small |
Very small |
| Enterprise adoption |
Very high |
High |
Medium |
Low |
| Learning curve |
High |
Medium |
Low |
Low |
Angular wins in enterprise environments where team size, code consistency, and long-term maintainability outweigh initial friction.
How to pick the right track
- Enterprise app with a large team → Angular is the natural fit; its conventions eliminate architecture debates.
- Internal tool or dashboard → Angular Material + Angular CDK gives you a full component toolkit with accessibility.
- High-performance public-facing app → Enable SSR with
@angular/ssr and static pre-rendering.
- Small SPA → Vue or Svelte may be faster to ship; Angular's strengths show at scale.
How to structure an Angular 19 app
src/
app/
routes.ts # top-level route config
features/
tasks/
tasks.component.ts
task.service.ts
task.model.ts
shared/
ui/ # dumb, stateless components
data-access/ # services
Feature-based structure (not type-based) scales well past 50 components.
Common mistakes
Learning NgModule-first. Old tutorials teach NgModule because it was mandatory. It no longer is. Start with standalone.
Treating signals and RxJS as competitors. They are complements. RxJS is excellent for async event streams; signals are excellent for synchronous state. Use toSignal() at the boundary.
Skipping the Angular DevTools extension. It shows the component tree, signal values, and change detection cycles. Essential for performance debugging.
Over-injecting in components. Components should call services; services should contain logic. A component that makes HTTP calls directly is hard to test.
What to skip
- AngularJS (Angular 1) — an entirely different framework with no shared APIs; irrelevant to Angular 2+.
NgModule-centric architecture on new projects — adds boilerplate with no benefit.
ngRx for small apps — Redux-style state management is overkill for anything below ~20 interacting components; a service with signals is sufficient.
FAQ
Is Angular still relevant in 2026?
Yes. It is dominant in enterprise, government, and financial services applications. The job market for senior Angular engineers remains strong.
How hard is Angular if I already know React?
Moderate — the DI system, decorators, and RxJS are unfamiliar, but the component model maps over well. Expect two to three weeks before you feel productive.
Do I need to learn RxJS to use Angular?
You need a working knowledge of Observable, subscribe(), pipe(), and common operators (map, switchMap, takeUntilDestroyed). You do not need to master reactive programming before shipping an Angular app.
What testing tools does Angular use?
Jest (via jest-preset-angular) has largely replaced Karma/Jasmine for unit tests. Angular Testing Library is the recommended approach for component tests.
Where to go next