Framework debates online are mostly noise. Everyone has skin in the game of whatever they learned first. So I decided to actually build the same application in all three major frontend frameworks and form opinions from doing the work, not from argument threads.
The app: a real-time task management tool. Kanban board, drag and drop, live updates via WebSocket, local state management, and a REST API integration. Enough complexity to stress-test each framework's approach to the things that actually matter in production apps.
React (7 Days)
React is the default for good reason. The ecosystem is vast, the community is enormous, and when you get stuck there's almost certainly someone who got stuck in the same way and wrote about it. The hooks model has matured and React 19's automatic compiler optimisations make performance less of a manual concern than it used to be.
What I liked: The composability model is genuinely excellent. Custom hooks make complex stateful logic reusable in a way that felt more natural than Vue's composables (though they're conceptually similar). Finding solutions to problems was almost never a struggle — the ecosystem covers basically everything.
What annoyed me: The state management story is still fragmented. I used Zustand for this project because it's currently the sane choice, but the number of competing options (Redux, Zustand, Jotai, Recoil, Valtio) suggests the ecosystem hasn't converged and probably won't. The useEffect mental model, despite years of education, still produces subtle bugs in people who haven't deeply internalised the dependency array rules.
Bundle size: 142KB (gzipped). Typical for React apps.
Vue 3 (5 Days)
Vue 3 with the Composition API is, in my opinion, underrated. The template syntax is intuitive enough that junior developers pick it up faster than JSX, and the Composition API gives you the same compositional power as React hooks with slightly less ceremony.
What I liked: Reactivity is genuinely simpler in Vue. ref() and reactive() are more intuitive than the React mental model of "everything that changes must go through setState or a setter." The template compiler optimisations are excellent — Vue 3 is fast with very little developer effort.
What annoyed me: The documentation, while good, feels slightly behind React's community documentation in breadth. Some advanced patterns required more searching. The ecosystem is smaller, and I found one case where the drag-and-drop library I wanted didn't have a Vue 3 wrapper and I had to write my own.
Bundle size: 118KB (gzipped).
Svelte (4 Days)
Svelte was the surprise of this experiment. The developer experience is the cleanest of the three by a significant margin. The syntax is closer to writing HTML and JavaScript normally, without framework-specific abstractions for everything. It compiles away the framework at build time rather than shipping a runtime, which produces genuinely small bundles.
What I liked: The code is just cleaner. Fewer abstractions, less boilerplate, more readable. The compiled approach means the runtime bundle is tiny. Building this app in Svelte took the least time, which surprised me.
What annoyed me: The ecosystem is significantly smaller. For two specific features I needed, there were no maintained Svelte libraries and I had to use vanilla JavaScript wrappers. The Svelte 5 runes system (released during this project) introduced a different reactivity model than Svelte 4, and navigating the transitional documentation was occasionally confusing.
Bundle size: 38KB (gzipped). Not a typo.
The Honest Verdict
For a team with diverse experience: React. The ecosystem breadth and hiring pool win. For a small team that wants developer experience over ecosystem: Vue 3 or Svelte — both are genuinely nicer to work in day-to-day. For maximum performance and minimal bundle size: Svelte, but budget extra time for anything the ecosystem doesn't cover.
There's no wrong answer. But there is a wrong reason — picking a framework because of what you're comfortable defending in an argument rather than what fits your team and project.