There’s an easy story to tell about complex frontend codebases: the domain is hard, the requirements changed, the deadlines were tight. Sometimes that’s true. More often, the complexity is something we built ourselves: state spread across stores, components and props that never agreed on ownership; abstractions invented to flatten differences that, in retrospect, weren’t really different.
A useful exercise is to delete every shared abstraction in a feature for fifteen minutes and inline everything. Almost always, the resulting code is shorter, clearer, and exposes a simpler structure that the abstraction was hiding. Many abstractions exist to compress duplication that wasn’t there yet — or that, once written out, would never have been worth deduplicating.
The real lever in frontend is rarely a new framework. It’s removing the layers that make the existing one feel heavier than it is.