Upgrading a large, legacy module-based Angular application to a high-performance modern Angular architecture (version 17/18) using standalone components and Signals-based state.
Project Context
- Business Domain: FinTech / Internal Portfolio Management
- Project Context: Upgrading a legacy enterprise application from Angular 11 to Angular 17/18.
- Team Size: 3 engineers
- Period: July 2021 – Present
My Role
My role was as a Senior Frontend Developer. I was responsible for performing the standalone migration process using schematics, manually refactoring core layout imports, converting state management files to Angular Signals, and configuring the new ESBuild compilation builder.
The Challenge

The legacy Angular 11 application was structured around complex nested NgModule imports. The application suffered from slow initial page load times (large bundle size), slow rendering speed (heavy change-detection cycles), and high development friction due to boilerplate NgRx state and circular module dependencies. The goal was to modernise the app to Angular 17/18 to improve compile and runtime performance.
Architecture

- Architectural Style: Standalone Architecture, Component-Driven Design
- Frontend Framework: Angular 17/18 (Historical Context)
- State Management: Angular Signals, RxJS (for event streams)
- Styling & UI: Angular Material (v18, optimized)
- Build Tool: Vite / ESBuild (replacing Webpack via Angular CLI builder)
Technology Stack
Frontend
- Angular 17/18 (Standalone Components, Signals)
- TypeScript
- RxJS
- Angular Material
Backend
- [Not Specified in Source]
Data
- [Not Specified in Source]
Infrastructure
- ESBuild / Vite
Key Engineering Challenges
Challenge 1: Resolving NgModule Imports and Porting Standalone Components
- Challenge: Migrating complex nested module components into lazy-loaded standalone components.
- Solution: Executed an incremental porting path using Angular CLI migration schematics. Manually refactored remaining imports and registered lazy-loaded routes using
loadComponentin the router config. - Engineering Impact: Eliminated circular module dependency blocks and enabled granular chunk lazy-loading.
Challenge 2: Ticker Dashboard Rendering Lag

- Challenge: High-frequency real-time stock ticker updates triggered global change detection, causing browser lag on low-spec device screens.
- Solution: Migrated high-frequency ticker and portfolio state to Angular Signals, reducing unnecessary change-detection work and improving rendering responsiveness.
The reactive data flow follows:
Real-Time Data Feed
↓
Angular Signal
↓
Targeted Reactive Update
↓
Template View - Engineering Impact: Significantly improved dashboard browser rendering frame rates.
Technical Decisions & Trade-offs

- Standalone Component Migration: Migrated the app to Standalone Components. This aligns with modern Angular best practices, removing
NgModuleboilerplate and reducing chunk bundles, though it required manual mocking updates for existing unit tests.
Performance & Scalability
- Initial main bundle size optimized by moving to lazy-loaded routes.
- Browser rendering frame rate improved for smoother interaction on mobile devices.
- Application build compilation speed improved using the ESBuild builder.
Security
- Content Security Policy (CSP) header compliance.
- Secure routing guards.
Outcome
The application was successfully modernized to Angular 17/18 standalone architecture, reducing bundle size, improving compiler performance, and achieving lag-free dashboard rendering.
Lessons Learned
- Migrating to standalone components removes the complexity of NgModule declarations, allowing for cleaner codebases and better lazy-loading boundaries.
- Angular Signals are highly effective for optimizing performance in high-frequency rendering sections by reducing unnecessary change-detection work.
Similar case studies
Legacy ASP.NET Monolith Modernization with YARP & .NET 8
Learn how an enterprise legacy ASP.NET MVC application was modernized incrementally to .NET 8 and Angular using the Strangler Fig pattern and YARP.
Scaling Collaborative E-Learning Platforms with ASP.NET Core SignalR
Learn how a real-time e-learning platform was scaled to support high concurrent connection loads using ASP.NET Core SignalR and Angular NgRx.
About Rajdip Khavad
Rajdip Khavad is an Angular and ASP.NET Core/.NET developer specializing in enterprise applications, APIs, application modernization and performance-focused engineering. On this project, his focus was Angular modernization, rendering performance and application architecture.
