DEV Community

Cover image for React and Vue Are Turning Into the Same Framework

React and Vue Are Turning Into the Same Framework

Nazar Boyko on September 28, 2026

Before diving into this article, I have to say that I haven't been a front-end developer for a very, very long time 😁 I just analyze architectures ...
Collapse
 
nyaomaru profile image
nyaomaru •

The filter example was especially interesting to me. 😸

Your hand-written useMemo had exactly the cache boundary you wanted products and query. But the compiler grouped the filter into a larger cache block that also depends on picked, so selecting a row causes the filter to run again.

That feels like a really good example of the limit of compiler inference.

React Compiler can remove a lot of manual memoization, but it also proves why manual useMemo is still useful when we need precise control over the cache boundary.

I’ve read quite a bit of React’s internals over the years, and I’m also still unsure about the direction of Server Components. I sometimes wonder whether making the component itself such a central unit of server work was the right trade-off. The fact that Next.js has had to work on making RSC navigation feel faster makes that question even more interesting to me.

On the rendering side, I personally think Vue 3 has had a technical advantage over React for quite a while. Its compiler-informed VDOM, patch flags, and increasingly fine-grained update model are very compelling, and Vapor pushes that much further. From a purely technical perspective, I often prefer Vue’s approach.

But I completely agree with your point that framework selection is rarely decided by technical quality alone.

Solid and Svelte are obvious examples.
Their performance can be excellent, but adoption is harder because fewer developers know them. Even between Vue and React, I’ve been involved in cases where React was chosen despite preferring Vue technically, because hiring, ecosystem size, existing team knowledge, and long-term maintainability mattered more.

What I think is changing now is AI.

As AI-assisted development gets better, “our team doesn’t know this framework yet” may become a much smaller problem. That could make it easier to choose technologies based more on what we actually want to use.

But it also creates a completely new selection criterion:

How well does AI understand this framework or library?

A technically excellent library may still be difficult to adopt if agents don’t know it well, generate outdated patterns, or cannot reliably debug it. So I think future technology selection won’t only be about performance, DX, ecosystem, community, and hiring anymore.

We’ll also have to consider how well AI can support the stack.

I’m actually working on a Nuxt → React migration right now. React wasn’t chosen because I think it is technically better than Vue. We chose it after considering the future team, the skills of the existing members, and the development speed we can get with AI.

That difference between “the technology I think is technically better” and “the technology that makes the most sense for the organization” may become even more interesting in the AI era. 🐱

Collapse
 
nazar-boyko profile image
Nazar Boyko •

Thanks for this 😊
The AI angle is one I didn't have in the article, and my guess is it mostly helps React, since how well an agent knows a framework follows how much code exists for it. Vapor is a small example of the flip side, it's new and it drops the Options API, so I'd expect agents to keep writing code it doesn't support for a while.

Collapse
 
nyaomaru profile image
nyaomaru •

Yeah, that was actually one of the reasons I chose React for the migration. AI already has an enormous amount of React context to work with. 😸

And Vapor is a good example of the opposite problem.
Personally, I see Composition API as one of the most important shifts that came with Vue 3, especially for larger applications and TypeScript-heavy codebases. So if I were maintaining an older Options API-heavy Vue codebase today, I’d already be thinking about gradually moving toward Composition API regardless of Vapor.

Still, Vapor raises a new problem: even if the framework direction is clear, AI agents may keep generating older Vue patterns that Vapor doesn’t support for quite a while.

Anyway, I’m really curious to see where Vapor goes from here 😸

Thread Thread
 
nazar-boyko profile image
Nazar Boyko •

Agreed, moving to Composition API pays off on its own, and it also leaves the codebase a lot closer to trying Vapor later! And by the way, good luck with the Nuxt → React migration 😊

Collapse
 
shubhradev profile image
Shubhra Pokhariya •

Nazar, really enjoyed this one, especially that you ran the real compiler output instead of trusting the diagrams.

On the point about keeping an existing codebase, React Compiler doesn't have to be all or nothing. With compilationMode: 'annotation' and the "use memo" directive, you can adopt it one component at a time and widen it as you get confident.

The catch is that components the compiler can't handle get skipped instead of failing the build, so "compiler enabled" doesn't mean every component is optimized. The Memo badge in React DevTools shows which components were actually compiled, and the ESLint plugin catches violations of the compiler's rules.

Collapse
 
nazar-boyko profile image
Nazar Boyko •

Thanks! 😊 I only ran the compiler on one small file for the post, so I don't know how it goes on a real app. Have you tried it anywhere? If you rolled it out with annotation mode, how much got skipped on the first pass, and what was the usual reason?

Collapse
 
shubhradev profile image
Shubhra Pokhariya •

I haven't tried React Compiler on a real app yet, so I can't give you a real number for how much gets skipped. I was going off the incremental adoption path in the React Compiler docs.

From what I've read, components can be skipped when the compiler finds things it can't safely optimize, such as violations of the Rules of React, unsupported patterns, or incompatible libraries. The ESLint plugin surfaces those diagnostics, so that's probably where I'd start before putting a number on how much a real codebase would need to change.

Thread Thread
 
nazar-boyko profile image
Nazar Boyko •

Fair enough, same boat then 😄
If either of us tries it on a real app, the compiler's logger option prints every function it skips along with the reason, so that would give the number pretty fast.

Thread Thread
 
nazar-boyko profile image
Nazar Boyko •

@shubhradev I went back to the example from the post and ran the version with the hand-written useMemo through the compiler too!

With the useMemo left in, the compiler kept my boundary, so the filter only re-runs on products or query. Without it you get the bigger block keyed on picked from the post.

Then I dropped query from the deps array on purpose and the compiler skipped the whole ProductList with "Existing memoization could not be preserved". The build didn't complain, ProductRow still got compiled, and I only saw it because I had the logger on.

It's one small file, so I might be reading too much into it, but my guess is that stale deps arrays would be a big part of what gets skipped in an older codebase. So I think you're right about starting with the ESLint plugin, it would've flagged that missing dep right in the editor, long before I went digging through logger output.

Thread Thread
 
shubhradev profile image
Shubhra Pokhariya •

Thanks for going back and running that, Nazar. The missing-dep case is a good one to see, since the build stays quiet and the component just gets skipped. That's a solid argument for turning on the ESLint plugin first. The logger tip is useful too, so I'll use it if I try this on a real app.

Collapse
 
sika_vasia_c04f8b19da4964 profile image
Vasia •

Really enjoyed this comparison! Thanks for taking the time to dig beyond the usual "React vs Vue" arguments and look at how both ecosystems are evolving with compilers and reactivity. The point that the two are converging technically while still having very different mental models was especially interesting.

Great read!

Collapse
 
nazar-boyko profile image
Nazar Boyko •

Thanks, glad you liked it! 😊

Collapse
 
beusebiu profile image
Eusebiu Balan •

I ended up with both in one product. Vue on the web, React Native on the phones, and I write both.

What costs me time switching between them is where state is allowed to change. In Vue I mutate a ref and the screen follows. In React I catch myself doing the same thing and then spend a while on why nothing re-rendered.

So your mental model section matches what I see more than the compiler part does. The output converging does not help my hands much.

Collapse
 
kyisaiah47 profile image
kyisaiah47 •

Did the comparison use production builds with the same update trace? That would separate compiler output from runtime behavior.

Collapse
 
nazar-boyko profile image
Nazar Boyko •

Nope, there's no runtime benchmark in this one.

Some comments have been hidden by the post's author - find out more