Verified migration
Vue 2 → Vue 3, verified by the real compiler.
Vue 2 hit end-of-life in December 2023. Refactyl moves your project to Vue 3 and keeps the Options API you already ship. No Composition API rewrite. Every converted .vue file is validated by @vue/compiler-sfc before handoff. Anything it can't convert keeps its Vue 2 original and gets flagged, so nothing breaks quietly.
No credit card · Docker-sandboxed · Deleted on handoff · How we handle your code →
Why this migration is hard to get right
Breaking changes are numerous and non-obvious
v-model changed its binding target (value → modelValue, input → update:modelValue). $listeners was removed. Filters were removed. The v-enter/v-leave CSS transition class names changed. A search-and-replace finds some of these; an LLM without the full breaking-change catalog misses most.
Template compilation is the only real gate
Vue 3's template compiler rejects patterns Vue 2 accepted silently. Getting a .vue file to compile with @vue/compiler-sfc is the only test that matters, not whether the syntax looks right to a model or a human reviewer.
Ecosystem packages don't have stable Vue 3 builds
Vuetify and BootstrapVue didn't have stable Vue 3 releases at Vue 2 EOL. A naive vue@3 bump silences a reactive UI without an obvious error if vue-router is still on v3. Getting the right version of each ecosystem package is a dependency research problem, not a file conversion.
How Refactyl does it
The official Vue 3 migration guide applies as deterministic rules first: filter removals, v-model binding renames, $listeners/$children removal, lifecycle hook renames. CSS transition class renames (v-enter → v-enter-from, v-leave → v-leave-from) run as a deterministic regex post-pass on every <style> block. The AI transform reliably skips <style> sections, so a deterministic fallback is required. Every converted .vue file then passes a real @vue/compiler-sfc parse + template compile gate, with one repair round if compilation fails.
Compiler: @vue/compiler-sfc (template compile) · Zero files ship unverified.
<template>
<input :value="value"
@input="$emit('input', $event.target.value)" />
</template>
<script>
export default {
props: ['value'],
filters: {
shout: v => v.toUpperCase()
}
}
</script><template>
<input :value="modelValue"
@input="$emit('update:modelValue',
$event.target.value)" />
</template>
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue']
}
</script>Measured against real alternatives
Vue 2→3 · Compiler-Verified Benchmark
Same bar as the JS→TS benchmark: the real @vue/compiler-sfc gate.
Five pinned open-source Vue 2 repos. Three tools. Judge: every converted .vue file must parse and compile with @vue/compiler-sfc. Harness and repos are public.
vue-codemod
Official CLI, results recorded per repo. Like ts-migrate, coverage is incomplete on modern repos.
Raw GPT: high v2 residue
The naive LLM leaves Vue 2 API patterns in place (beforeDestroy, this.$on, this.$set). SFCs "compile" but Vue 2 behaviour remains.
Refactyl: clean SFCs
Deterministic breaking-change rules + compiler-sfc gate + one repair round. Every file passes before handoff, or ships with a flag explaining why not.
Numbers are being benchmarked now. Results will appear here once published.
Numbers are real. Harness is public. cd backend && npx tsx bench-vue.ts all to reproduce.
Manual / raw LLM vs Refactyl
| Concern | Manual / raw LLM | Refactyl |
|---|---|---|
| Template compiler gate | Run npm run build; template errors surface then | @vue/compiler-sfc validates every .vue file before handoff |
| v-model binding rename | Easy to miss across many components | Deterministic rule, applied to every file |
| CSS transition class renames | Models skip <style> blocks; manual grep required | Deterministic regex post-pass on every <style> block |
| Ecosystem package versions | Vuetify/BootstrapVue break silently on wrong versions | Flagged as migration risks; never blindly bumped |
| vue-router version | Often bumped to untested major | Pinned to tested 4.x, not the newer 5.x major |
| Unconvertible files | Silently broken or blocked on manual review | Vue 2 original preserved; clearly flagged with reason |
FAQ
Vue 2 → Vue 3 migration: common questions
Real questions engineers ask before migrating Vue 2 to Vue 3, answered honestly.
Ready to migrate?
Run your Vue 2 repo through the real compiler.
One free migration per month, up to 100 files. No credit card. Every file gated by @vue/compiler-sfc (template compile), repaired until clean, or clearly flagged with the reason.
No credit card · Docker-sandboxed · Deleted on handoff · Never used for training