npx @bryceo/me

A Decade with React: From v0.14 to Today

January 5, 2026

I didn’t start with React because it was cool or popular. I started because I needed something that could handle a really interactive web app at work back in 2015. At the time, I’d been building interfaces with YUI and maintaining AlloyUI(layer on top of YUI). Those frameworks taught me a lot about interactivity and the UI, but they often felt heavy and awkward, especially when your app needed to respond and update multiple parts of the page at the same time. When my team first started using React, it was revolutionary. JSX, Components, uni-directional data flow, reactive UI updates, and the semi-functional nature of it all. It completely changed the way I looked at the development of the App I was working on and it fundamentally gave me a new mental model for UI.

Early Days: Class Components and Small Wins

Seeing React's component architecture, reactivity, and data flow, React felt like a huge win. Breaking UI into small, sharable components was a revelation after writing monolithic view layers. Component encapsulation was incredible and easily sharable. The uni-directional data flow made state predictable—a huge relief after wrestling with two-way bindings in YUI.

But React v0.14 wasn't all sunshine and roses. Lifecycle methods were useful, but trying to track down a subtle bug in componentDidUpdate felt cumbersome. Class components were boilerplate-y and required lots of this.handleChange = this.handleChange.bind(this);. And global state? In bigger apps, I remember debugging entire app rerenders, even when only one small widget changed. Debugging performance became its own job.

Another win was the boom of tooling like hot reloading, React DevTools, and all the ecosystem around React were lifesavers. They made the development loop quicker, and it also felt like React developers were all speaking a similar language of how to do things.

Hooks

Then hooks came. I still remember replacing a bulky boilerplate of class component with functional ones using useState and useEffect. It felt right. No more wrestling with this, no more half-remembered lifecycle rules.

Custom hooks unlocked shareable logic that traveled well between apps. But as we all know by now useEffect was both a blessing and a trap. Early on, I loved how effects made async work feel straightforward and could be quick escape hatches. But as apps grew, managing dependencies across multiple effects became its own mental overhead. Debugging effects became the daily headache and made me long for simpler times of class components.

Memoization introduced its own brand of pain. useMemo, useCallback these tools are powerful when you really need them, but figuring out why a component is re-rendering could still be exhausting. Measuring renders, adding memoization, chasing performance regressions…

I still really like the design of hooks, especially the shareability, but a bad useEffect can sink the whole internet.

Server Complexity and Async Challenges

Next came React’s expansion into server components and async paradigms. These were really powerful but it also seemed to level up the complexity of React 100x. Stream UI from the server, executing react code on the server, it all started blurring client-server boundaries. And this started to cloud the mental model of React for me.

Server driven UI opens possibilities, but managing hydration, async data, and suspense boundaries adds a layer of mental overhead. Sometimes I catch myself longing for the simpler days of predictable state updates.

Now What?

Despite the growing pains, I still reach for React first when it comes to UI because I am most familiar with it. I still appreciate component architecture, uni-directional data flow, JSX, and the functional nature to it. I do find myself curious to explore using something like SolidJS or Svelte, as I am sure those projects have learned from the best parts of React.

React has grown a lot over the past decade, and at the end of the day, React’s complexity is a by product of solving harder problems. And even though those problems can be frustrating, the tool still does what I came to it for: it helps me build rich, interactive, maintainable UIs that users care about.

I'm sure I will try out Svelte or Solid(a little here) more, the idea of signals and more fine grain updates appeal to me. But for now, and primarily because of the projects I am working on, I will stick with React.