← All posts

Migrating from Vue 2 to Vue 3 without rewriting from scratch

Lessons from shipping a real migration: pragmatism over panic, and momentum over nostalgia.

Written by Adam Caruana / 3 min read

Illustration representing a Vue 2 to Vue 3 migration path with modern tooling

When Vue 3 matured, the advice I kept hearing was bleak:

migration is such a headache that it is quicker to rebuild the application from scratch.

For large teams under pressure with a big budget, that sounds almost sensible. To me, it was not acceptable as a default posture.

Throwing away working software (unless there is a strong product reason) wastes budget and carries hidden regression risk. I wanted to prove that a disciplined migration could be bounded, predictable, and compatible with how I work today.

#AI as a sidekick, not a silver bullet

The loudest complaints about Vue 2 to Vue 3 upgrades usually boil down to tedious work: adapter layers, breaking changes in APIs, edge cases in build tooling, and dozens of small edits across components. That work is real. What has shifted is how quickly you can move through it.

I stopped treating large mechanical refactors as calendar-month projects where every keystroke is manual. Used responsibly, AI tools excel at the repetitive parts of a migration: suggesting replacements for deprecated patterns, drafting boilerplate for composables, and summarising diffs so reviewers stay oriented. The outcome was not instant magic. It was compression of calendar time: tasks that might once have stretched across weeks I could advance in days when I paired the tools with judgement, tests, and clear acceptance criteria.

The lesson was practical rather than ideological. AI does not remove the need for architecture decisions or for validating behaviour in the browser. It does reduce the friction cost of saying yes to staying on supported frameworks instead of freezing an app on an ageing runtime.

#Future expansion and ecosystem gravity

The second pressure I felt was structural. Many Vue 2-era packages have slowed or stopped updates. New libraries often assume Vue 3 and the Composition API from day one. Continuing on Vue 2 did not mean stability in the sense clients imagine; it meant a shrinking pool of compatible tooling and an increasingly expensive hiring and integration story.

Upgrading was not vanity. It was about keeping the clients I work with competitive in their markets: faster security patches, access to maintained UI kits, and the ability to adopt improvements in performance and developer experience without fighting the ecosystem.

#Results on the ground

The payoff was not only internal. Clients who needed concise question-building tools stopped being blocked by a dated UI layer. After Vue 3, I could adopt shadcn-vue (the Vue port of ShadCN). It is arguably among the most expansive UI libraries in its class and, for me, among the quickest to build concise, polished tooling with. That simply was not a realistic option while I stayed pinned on Vue 2 in the shape I was in.

#Closing thoughts

Migration is still engineering work. What changed for me was refusing to treat “rewrite from scratch” as the only honest answer. With a clear inventory of dependencies, a phased plan, and tooling that accelerates the grind rather than replacing thinking, Vue 2 to Vue 3 became a managed upgrade rather than a morale sink.

If you are weighing a similar move and want a second pair of eyes on scope or risk, I am happy to talk.

Author

Adam Caruana

Founder & Lead Developer - Caruana Tech

Plymouth-based software consultant delivering web and mobile products for clients across the UK. He cares about pragmatic architecture, maintainable delivery, and communication that keeps everyone well-informed.