Ever since React 19 dropped late last year, it feels like everyone has been talking about the same thing. But as we move through mid-2025, the question isn't really "is React 19 out?" anymore. It’s more like, "which features actually matter for me right now, and which ones should I just ignore for a while?"
To be honest, I’m not the type of person who feels the need to use the latest version just because it’s the latest. For me, a major version update isn't a loyalty test; it's a calculation of how much risk we're taking on during migration.
Looking at the new features, some definitely change how we write code daily.
Actions make handling async functions in forms much cleaner since React now
manages pending states and error handling for you. Then there's the use API
for reading promises or context, and one of the most practical changes is that
ref can now be passed directly as a prop, saving us from the whole
forwardRef ritual in many cases.
But there’s one common misunderstanding: the link between React 19 and Server Components (RSC). A lot of teams feel that upgrading to React 19 means they must move to an RSC architecture. That’s not necessarily true. If you’re still using Vite for an SPA, you can use React 19 without a total architectural overhaul. Mixing these two decisions usually just traps teams in unnecessary rewrites.
So, how am I handling this?
I think a pragmatic approach makes more sense. For features like Actions in forms, I’d say they are worth adopting now if you have full control over that part of the user experience. It can cut out a lot of the boilerplate we usually write manually to manage loading states.
However, I wouldn't make things like using use(promise) as your primary data
layer the standard just yet. It’s great when paired with Suspense, but it’s no
replacement for a mature caching strategy like TanStack Query. Also, regarding
the hype around a new compiler that magically optimizes performance—I'd rather
wait until our toolchain is actually ready. We don't have to chase everything at
once.
My own migration strategy is usually more like surgery on my dependencies. I start by checking what’s blocking me—whether it's testing libraries, UI kits, or types that are still stuck on version 18. I usually upgrade React and its types in one small Pull Request, fix the breaking changes, and then slowly experiment with new patterns on small, low-risk features.
The main point is: don't launch a massive project titled "Migrate to React 19." Just do it incrementally whenever you actually touch a piece of code that needs the new features.
Of course, my approach has its downsides too. There might be faster ways to do it, but for me, this is much safer for keeping a production app stable.
I'll leave it there.