Vue 3.6 Vapor Mode 不是白拿的:功能边界、共存策略与何时别开
Vue 3.6 最热闹的就是 Vapor Mode 和 alien-signals:Vapor 在组件上开个 vapor 属性就能跳过虚拟 DOM,直操作真实 DOM,渲染对标 Solid/Svelte 5;alien-signals 重构响应式,官方口径是比 3.5 快约 1.8 倍、computed 吞吐高 30 倍以上、内存降 65%。数字很漂亮,但踩坑往往不在快不快的数字上,而在你能用什么、不能用什么。
先看清楚功能边界
Vapor Mode 是全新的编译模式,不是对旧模式的增强,它有明确的能力缺口:
- 仅支持 Composition API + ``。Options API 组件没法用 Vapor。
- `` 暂不支持。依赖 Suspense 的组件树必须继续走虚拟 DOM 路径。
app.config.globalProperties不可用。全局注入这条路在 Vapor 里断了,常用$xxx挂全局的旧代码要改写。getCurrentInstance()不可用。v-memo不支持。- Template refs 不暴露
$el/$props/$attrs/$slots/$refs——那些依赖$el拿 DOM 的写法会失效。
所以「性能敏感页面切 Vapor」这个口号,前提是你的页面没踩上面任何一条。表格列表、图表、消息流这类典型的高性能场景往往最容易中招(要么用了 Suspense,要么靠 $el 做联动)。
共存是设计好的,但要规划
官方给了 vaporInteropPlugin,允许在虚拟 DOM 应用里引入 Vapor 组件,也能单组件开 Vapor。这意味着 Vapor 和 VDOM 可以在一个项目里共存,渐进式接入是官方明确支持的路线。
共存策略的现实建议:
- 别默认全项目开 Vapor。先在性能敏感、且不依赖受限能力的子模块上开,验证
$el/Suspense/globalProperties 没被用到。 - 新组件直接用 `` + Composition API 写,保持「将来能切 Vapor」的余地——一旦用了 Options API 或挂全局属性,就回不去了。
- 想提前体验又不想升 3.6 的,可以用
vaporInteropPlugin在 3.5 项目里试 Vapor 组件。
什么时候别开
- 组件树依赖 `` 做异步加载态。
- 大量用了 Options API 的存量代码。
- 靠
globalProperties注入全局工具(axios 实例、权限函数之类)的中型项目——切过去要么改注入方式,要么放弃 Vapor。
升级本身是无痛的
官方承诺 Vue 3.6 无破坏性变更:从 3.5 升 3.6 不用改任何现有代码,npm install vue@3.6 就行,Vapor 是「按需开关」而不是「强制切换」。这是它和很多激进重构最大的区别。
一句话:Vapor Mode 值得在高性能、新写的、Composition API 的子模块上试;但把它当成「给整个老项目加速的开关」就错了——能力缺口决定了它只适合干净的新代码。先弄清边界,再谈性能。