What is Angular?
Angular is a web framework for building fast, reliable applications that scale with both the size of the product and the size of the development team. It is maintained by a dedicated team at Google and provides a full application platform - not just a UI rendering library.
That distinction matters. Many frontend tools today focus narrowly on rendering or state management and leave the rest of an application's architecture to you. Angular takes the opposite stance. It ships first-party solutions for components, templates, routing, forms, HTTP, dependency injection, testing, internationalization, and security - all designed to work together. The trade-off is opinion: Angular has strong defaults and expects you to follow them. The payoff is consistency, especially at scale.
Angular is committed to stability for some of Google's largest products. Every commit is checked against hundreds of thousands of tests in the company's internal monorepo.- angular.dev
Why teams choose it
Angular is a good fit for many business applications because it provides an opinionated, scalable structure out of the box. The features below are not optional plugins - they are part of the framework itself, designed to work as one system:
- Component-based UI development with a consistent compilation model for templates, styles, and metadata.
- TypeScript-first application code - the framework's APIs are typed and the project is configured to use TypeScript on day one.
- Templates with declarative binding and control flow, including built-in
@if,@for, and@switchsyntax. - Dependency injection for shared services and cross-cutting concerns.
- First-party solutions for forms, HTTP, routing, testing, internationalization, security, and animations.
- Modern reactivity with Angular Signals - fine-grained, compile-time-aware state.
- A modern build pipeline that uses Vite and esbuild under the Angular CLI.
For teams operating at scale, Angular also brings predictable release schedules with Long Term Support windows, first-party update tools (ng update) that run automated code transformations for routine breaking changes, and a release process verified commit-by-commit against Google's internal monorepo. Stability is treated as a feature, not an afterthought.
Components and services - the application model
Angular applications are built from components. A component combines TypeScript code, an HTML template, styling, inputs, outputs, and lifecycle behavior into a single reusable UI unit.
In larger applications, features are organized around application domains and user workflows. The convention is to keep components focused on presentation and interaction, then move reusable business logic, API calls, and state coordination into services. The recommended structure for feature code:
- Pages - route-level screens and workflow entry points.
- Components - reusable UI pieces used by pages and other components.
- Services - data access, state coordination, and feature-level logic.
- Models - TypeScript interfaces and types for frontend data contracts.
- Guards and resolvers - navigation checks and preloaded route data, where needed.
The component
- Render UI from inputs
- Handle user interaction
- Hold view-local state in signals
- Emit outputs to parent components
- Stay thin - delegate logic to services
The service
- Call the API
- Coordinate feature-wide state
- Centralize URL construction and auth headers
- Map API responses into frontend models
- Provide a testable seam between UI and network
The split is not bureaucratic. It is what makes Angular components reusable and testable - and it is what lets large applications add features without their components becoming impossible to read.
Templates and signals - the new declarative core
Angular templates bind UI to component state. They are HTML extended with control flow and bindings, and they exist for view logic - not complex business rules. If a template's condition becomes hard to read, the calculation should move into the component or a service.
Modern Angular uses built-in control flow syntax that reads like plain code:
The reactive state behind that template is held in Angular Signals - the framework's fine-grained reactivity model. A signal stores reactive state. A computed derives state from other signals. The compiler knows which signals each part of the view depends on, so it updates only what actually changed.
Use signals for component-local state and derived values. For feature-wide state, keep ownership clear and avoid duplicating the same state across unrelated components. Mixing signals and observables casually is a common source of trouble - pick a pattern per feature and stay consistent.
Dependency injection
Angular's dependency injection system makes shared services available throughout the application without any component having to construct its dependencies by hand. Use services for responsibilities that should not live directly in UI components:
- API access
- Authentication and session helpers
- Feature state coordination
- Formatting and mapping helpers
- Cross-cutting browser integrations
Keep service methods focused and typed. Prefer returning typed data structures over loosely shaped objects. The reason is testability: when a component receives a service through DI, you can substitute a fake implementation in tests without touching the network. That seam is the difference between a UI you can iterate on quickly and one you cannot.
Routing, forms, HTTP
Angular ships the framework essentials as first-party features, not as ecosystem add-ons.
Routing. Angular supports client-side routing for single-page applications, including lazy-loading, route guards, and data resolvers. For multi-app hosting or static-hosting scenarios, be careful with deep links and fallback behavior: internal paths should be tested against the final deployed output, not just in local development. If an application is deployed under sub-paths, make sure baseHref, asset URLs, and route fallback behavior match the hosting platform.
Forms. Angular provides a standardized system for form participation and validation - user input collection, validation messages, disabled and loading states, and mapping form values into request DTOs. Keep API request shapes separate from form state when the API contract and screen model differ. That keeps forms ergonomic without leaking UI-only fields into backend requests.
HTTP. Use Angular services as the boundary between UI components and backend APIs. Components should call typed service methods rather than constructing URLs or HTTP request options inline. Good service boundaries make it easier to centralize URL construction, add authentication headers via interceptors, normalize error handling, map API responses into frontend models, and test components without real network calls.
Security and performance
Angular includes built-in security protections, including HTML sanitization for common binding scenarios and support for Trusted Types. Continue to treat all server data and user input as untrusted - the framework's defaults help, but they are not a substitute for backend authorization.
- Do not bypass Angular sanitization unless there is a reviewed, explicit reason.
- Avoid rendering raw HTML from users or external systems.
- Keep secrets out of frontend code and static configuration.
- Enforce authorization on backend APIs, not only in client-side navigation.
Performance follows similar discipline. Angular is designed for large applications, but speed still depends on how the app is built. Lazy-load feature areas where practical. Keep components small and data flow clear. Use signals or observables consistently rather than mixing state patterns casually. Avoid expensive calculations directly in templates. Keep bundle size visible during production builds. Use deferred loading for heavy UI blocks when it improves first-load behavior.
Vite and esbuild under the hood
Angular's modern build pipeline is one of the most consequential changes the framework has shipped in years. The Angular CLI now uses Vite for the development server and esbuild for compilation. The two tools sit underneath the CLI, not next to it - you call ng serve or ng build, and the CLI orchestrates Vite and esbuild on your behalf.
What that buys an Angular team is the same speed Vite users in other ecosystems already see: cold starts in milliseconds, surgical Hot Module Replacement, and production builds that benefit from esbuild's native-speed compilation. Angular projects with hundreds of thousands of lines of code can now build in under a minute - a regime that was simply not on the table with the previous Webpack-based pipeline.
The important practical note: the Angular CLI is still the source of truth for the build. Do not replace it with Vite directly, even though Vite is inside it. Angular has framework-specific compilation steps - template type-checking, component metadata, DI graph wiring - that the CLI orchestrates. Reach for the CLI; let it reach for Vite.
When to reach for Angular
Angular is a strong fit when the application is large, long-lived, and built by a team rather than an individual. The features that make Angular feel heavy on a small project - opinionated structure, DI, framework-managed routing and forms, a full CLI - are the same features that pay off when ten engineers are committing to the same codebase every week.
Choose Angular when:
- You are building a serious business application with a long expected lifetime.
- The team values consistency and shared conventions over per-developer flexibility.
- You need first-party answers for routing, forms, HTTP, and testing, with no decision fatigue about which library to pick for each.
- You want a stable release schedule with automated migration tools when major versions ship.
Reach for something lighter when the application is small, throwaway, or fundamentally a marketing site rather than an application. Angular is built for the cases where structure pays for itself - and the framework does not pretend otherwise.