Look, I get it. React is everywhere. Next.js is the golden child of the JavaScript world right now. I spent three years building apps with them, and honestly? They're solid. But something was... off.
I kept feeling like I was fighting the framework instead of working with it. Every project felt like I was reinventing the wheel, setting up the same boilerplate, configuring the same tools, dealing with the same frustrations.
Then I tried Vue and Nuxt for a weekend project. That was six months ago, and I haven't touched React since.
Here's why.
It happened on a random Tuesday. I was fighting with Next.js app router (again), trying to figure out why my server components weren't playing nice with my client components. The error messages were cryptic. The docs were... there, but not helpful.
I vented on Twitter, and a friend replied: "Just try Nuxt for one project. Trust me."
I rolled my eyes. I'd heard the Vue vs React debates before. But I was frustrated enough to give it a shot.
Two hours later, I had built what took me a full day in Next.js. The code was cleaner. The patterns made sense. I actually enjoyed writing it.
Vue's syntax feels like... well, like how I think. The template, script, and style sections are separated. No more JSX soup where everything is JavaScript pretending to be HTML.
<template>
<div class="card">
<h2>{{ title }}</h2>
<p>{{ description }}</p>
</div>
</template>
<script setup lang="ts">
const title = ref('My Post')
const description = ref('This is so much cleaner')
</script>
<style scoped>
.card {
padding: 2rem;
}
</style>
Compare that to the React equivalent with all the className chaos, the useState boilerplate, and CSS-in-JS debates. Vue just... works.
In Next.js, every file starts with:
import { useState, useEffect, useCallback, useMemo } from 'react'
import Link from 'next/link'
import Image from 'next/image'
import { useRouter } from 'next/navigation'
// ... and on and on
In Nuxt? Nothing. Nada. Zero imports.
<script setup>
const route = useRoute()
const router = useRouter()
const data = ref(null)
// Everything is just... there
</script>
It sounds like a small thing, but it adds up. My files are shorter, cleaner, and I spend less time managing imports.
Next.js has file-based routing, sure. But then they introduced the app router and everything got confusing. Client components vs server components, loading.tsx, error.tsx, layouts that work in mysterious ways...
Nuxt's routing is simple:
pages/index.vue → /pages/blog/[slug].vue → /blog/:slugpages/blog/index.vue → /blogThat's it. No mental gymnastics. No "wait, is this a server or client component?" anxiety.
Nuxt comes with batteries included:
useSeoMeta is chef's kiss)In the React world, every one of these requires a decision, a library, configuration, and maintenance. With Nuxt, they just work.
React's component model is powerful, but Vue's feels more... natural?
Props are defined clearly. Events are explicit. Slots are genius (sorry, React children). Two-way binding with v-model saves SO much boilerplate.
<!-- Parent -->
<CustomInput v-model="searchQuery" @submit="handleSearch" />
<!-- Child -->
<script setup>
const model = defineModel()
const emit = defineEmits(['submit'])
</script>
No onChange handlers, no value prop, no setState dance. It just works.
TypeScript in React? Sure, it works. But you're constantly fighting with types for props, refs, events, context...
TypeScript in Vue/Nuxt? It's like they were made for each other. Auto-completion everywhere. Types that make sense. Less any, more confidence.
React makes you think about performance constantly:
Vue's reactivity system just... handles it. I don't think about re-renders. The framework is smart enough to optimize for me.
I'm not going to pretend Vue/Nuxt is perfect:
The ecosystem is smaller. React has more libraries, more Stack Overflow answers, more tutorials. When you hit a niche problem, React probably has 5 solutions already.
Job market. React is still king for job postings. If you're optimizing for employability, React is the safer bet.
Some libraries are React-only. Framer Motion, Radix UI, some cool tools are React-exclusive. Vue has alternatives, but sometimes they're not as polished.
I didn't switch because React is bad. React is great. Next.js is powerful.
I switched because Vue and Nuxt make me happier. The code is cleaner. The development is faster. The mental overhead is lower.
I feel like I'm building things instead of configuring things.
Your mileage may vary. If React/Next.js works for you, that's awesome. Use what makes you productive.
But if you're feeling that friction, that constant "why is this so complicated?" feeling... give Nuxt a weekend. Build something small. See how it feels.
You might surprise yourself.
Moving my portfolio from Next.js to Nuxt took about a week. Most of that was learning Vue's patterns, not fixing problems. The Nuxt docs are excellent (seriously, they're really good).
Here's what helped:
The best part? My bundle size went down, my lighthouse scores went up, and my code became more maintainable.
Six months in, I'm building faster, shipping cleaner code, and actually enjoying the process again.
React will always have a special place in my heart. It taught me so much. But Vue and Nuxt? They feel like home.
If you're curious, my advice is simple: just try it. Don't overthink it. Build something fun. See how it feels.
You might just fall in love.
Have questions about migrating from Next.js to Nuxt? Hit me up on Twitter or shoot me an email. I'm happy to help!
My Neovim Config: LlamaVim
Explore my custom Neovim setup built on NvChad, featuring AI-powered completions, modern plugins, and a beautiful theme for an enhanced coding experience.
I Built a Terminal UI in Go and It Was More Fun Than I Expected
Bubble Tea turned my boring CLI tools into beautiful, interactive terminal applications. Here's how I fell in love with TUIs.