frontend / vue / 20_versions_and_vapor_mode.md

Vue versions, Vapor Mode, and what changed recently

5 interview angles 4 min read source

Vue versions, Vapor Mode, and what changed recently

Verified 2026-08. Cross-check ../../STACK_BASELINE.md before quoting a version in an interview.

Where things stand

Status
Vue 2 End of life since 2023-12-31. No patches, no security fixes. Migrating off it is a legitimate project to talk about.
Vue 3.5.x Current stable (3.5.41 as of 2026-08).
Vue 3.6 Release candidate (rc.2, 2026-07-22). Vapor Mode feature-complete; reactivity rewritten on alien-signals. Not shipped stable yet — say “in RC”, not “released”.

Getting the 3.6 status right is worth doing. A candidate who says “Vue 3.6 shipped Vapor Mode” is repeating blog headlines; the accurate answer is that it is feature-complete in RC with stable expected later in 2026.

What 3.4 and 3.5 actually gave you

Recent additions that change how you write code, not just version numbers:

Version Change Why it matters
3.3 defineSlots, generic components, imported types in macros typed component boundaries became practical
3.4 defineModel stable replaces the modelValue prop plus update:modelValue emit boilerplate
3.4 faster parser, rewritten reactivity effects fewer unnecessary re-computations
3.5 reactive props destructure const { x = 1 } = defineProps() stays reactive
3.5 useTemplateRef, useId proper template ref typing; SSR-safe ids
3.5 onWatcherCleanup cleanup inside watch without the callback argument
3.5 lazy hydration for async components hydrate on idle, on visible, or on interaction

If your notes still show modelValue plus emit('update:modelValue') for a two-way-bound component, they predate 3.4.

Vapor Mode

An opt-in compilation mode that compiles SFCs to imperative DOM operations with no virtual DOM. Same authoring model — templates, refs, composables — different output.

  • Opt-in per component, and Vapor and VDOM components interoperate in one app, so adoption is incremental rather than a rewrite.
  • Supports a subset of the current API. Anything depending on the VNode representation does not apply.
  • Smaller bundles and lower update cost, since there is no VNode allocation and no diff — reported in the range of Solid and Svelte for Vapor-only apps.
  • The whole runtime can be dropped from a Vapor-only build, which is where the largest bundle savings come from.

The strategic point worth making: Vue is converging with the fine-grained-reactivity camp without changing what developers write. Signals-based frameworks got there by exposing signals to the author; Vue already had refs, so only the compiler output had to change.

Alien-signals

@vue/reactivity was rewritten in 3.6 on top of alien-signals — lower overhead per dependency, better scaling in deep component trees, less memory. It is an internal change: the public ref/computed/watch API is unchanged. Mention it as evidence you follow the project, not as something that changes your code.

Migrating from Vue 2

Still a real interview topic, because plenty of production Vue 2 exists past EOL.

Vue 2 Vue 3
Object.defineProperty reactivity Proxy — new properties and array index assignment now work, so Vue.set is gone
Options API only (Composition via plugin) Composition API built in
One root node per template fragments allowed
filters removed — use computed properties or methods
$listeners, .sync folded into $attrs and v-model arguments
new Vue() global config createApp() — no global pollution between apps
Vuex Pinia
EventBus via a Vue instance removed; use props/emits, provide/inject, or a store

The migration build (@vue/compat) runs Vue 3 with Vue 2 behaviour and per-feature warnings, which is the incremental path. The honest framing for a large app is: upgrade the build tooling, move to the migration build, clear warnings feature by feature, then adopt Composition API where it pays — not all at once.

Interview angle

  • “What version of Vue would you start a project on today?” - 3.5 stable. 3.6 is in RC; you would track it and adopt Vapor Mode selectively for hot components once it ships.
  • “What is Vapor Mode and what does it change?” - opt-in compilation to direct DOM operations, no virtual DOM, interoperable with existing components. Bundle size and update cost drop; the authoring model does not change. It is Vue’s answer to Solid and Svelte.
  • “Is Vue 2 still supported?” - no, EOL since the end of 2023. Anything still on it is accruing unpatched security risk, and that is the argument you make to a product owner.
  • “How would you migrate a large Vue 2 app?” - migration build first, warnings cleared incrementally, then Composition API only where it earns its keep. A big-bang rewrite of a large app is how these projects die.
  • “What changed in 3.4/3.5 that affects how you write components?” - defineModel removed the two-way-binding boilerplate, reactive props destructure removed the props.x prefix, and useTemplateRef fixed template ref typing.