all writing
2026-04-27

Angular, React, or Blazor — how I actually choose

A working engineer's comparison of three frontend frameworks, based on shipping production apps in all of them.

I've shipped production apps in Angular, React, and Blazor. Not toy projects, real systems with real users and real maintenance burdens. People ask me which is best, and the honest answer is that they're good at different things. Here's how I decide, based on what each one actually feels like to build and maintain.

Angular: structure by default

Angular is opinionated, and that's its strength. It ships with routing, forms, HTTP, dependency injection, and a testing setup out of the box. Every Angular project looks broadly the same, which means an engineer who knows Angular can open any Angular codebase and find their way around.

@Component({
  selector: 'app-invoice',
  template: `<div>{{ invoice.total | currency }}</div>`,
})
export class InvoiceComponent {
  constructor(private invoices: InvoiceService) {}
}

That dependency injection and service structure is genuinely useful on large teams. The framework makes the architectural decisions so a dozen engineers don't each make their own. The cost is a steeper learning curve and more ceremony for small things. I reach for Angular on big, long-lived enterprise apps with a team that will maintain them for years. The structure pays for itself when the codebase and the headcount are large.

React: flexibility and the ecosystem

React isn't a framework, it's a library, and everything around it is a choice you make. Routing, state, data fetching, forms, all of it is a decision. That's either liberating or exhausting depending on the day.

function Invoice({ id }: { id: string }) {
  const { data } = useInvoice(id);
  return <div>{formatCurrency(data.total)}</div>;
}

What you get in return is the largest ecosystem in frontend and the most flexibility. Whatever you're trying to do, someone has built a library for it, and you can assemble exactly the stack you want. The risk is that two React projects can look nothing alike, so the discipline has to come from you and your team, not the framework. I reach for React when I want that flexibility, when the hiring pool matters (React developers are everywhere), or when I'm building on Next.js, which I covered in React Server Components.

Blazor: C# all the way down

Blazor lets you write the frontend in C#. For a team that lives in .NET, that's a real advantage: shared models between client and server, one language, no context switch, and the ability to reuse validation and DTOs across the stack.

@page "/invoice/{Id}"
<div>@Invoice.Total.ToString("C")</div>

@code {
    [Parameter] public string Id { get; set; }
    private Invoice Invoice { get; set; }
}

For internal tools and line-of-business apps where the team is already strong in C# and the frontend doesn't need to be flashy, Blazor is very productive. You stop maintaining two type systems. The tradeoffs are a smaller ecosystem than React or Angular, and, for the WebAssembly model, a heavier initial download. I use Blazor for internal ERP-style modules where the users are staff, not the public, and the priority is shipping business logic fast.

The decision, honestly

Here's the actual rule I use. Big enterprise app with a large team and a long life ahead of it: Angular, because the enforced structure keeps a dozen people consistent. Public-facing product, need the ecosystem or the hiring pool, or building on Next.js: React. Internal tool, .NET team, want to share code across client and server: Blazor.

None of these is wrong. I've seen React apps that were a mess of inconsistent patterns, and I've seen Angular apps drowning in boilerplate for what should have been simple. The framework doesn't save you from bad decisions, and it doesn't cause them either.

What actually matters more than the framework

After shipping in all three, my strong opinion is that the framework is one of the less important decisions on a project. What determines whether the app is maintainable in two years is your component boundaries, your state management discipline, how you handle data fetching and loading states, and whether your team agrees on conventions. Those problems exist in all three frameworks, and solving them well matters more than which one you picked.

So choose the one your team knows best, unless there's a specific reason not to. A team that's fluent in React will out-ship a team fumbling through their first Angular project every time, regardless of which framework is "better" on paper. Fluency beats theory. Pick the tool your people can already wield.