Vue 的“未完成性”:为什么说 Vue 3 最大的优势恰恰是它的不完美
业界对 Vue 3 的评价往往陷入两种极端:要么是“完美重构的响应式引擎”,要么是“组合式 API 的激进实验”。但如果我们跳出功能对比的惯性,会观察到一种更深层的事实——Vue 3 的核心力量并不在于它完成了什么,而在于它刻意地留下了什么。这种“未完成性”并非缺陷,而是一种罕见的架构诚实:它承认前端没有银弹,并愿意将部分设计决策权交还给开发者。从 ref 与 reactive 的并存,到 script setup 与 Options API 的共存,Vue 3 的每一种“选择困难”都是对复杂现实的有意直面。
与 React 不同,React 拥有虔诚的哲学体系(如“UI 是状态的函数”),并愿意为这种纯粹性牺牲开发体验(如依赖手动 memo)。Vue 3 则呈现出一种实用主义的分裂:它的响应式系统复杂且精巧,但暴露给开发者的 API 却是渐进的、多范式的。ref 在模板中自动解包,在 JS 中却需要 .value——这种不一致常被诟病为“反直觉”。但换个角度看,这正是 Vue 对“显式”与“隐式”之间固有矛盾的真实映射:模板需要魔法,逻辑需要透明。React 选择了单向的显式,Svelte 选择了编译期的隐式,而 Vue 3 两者兼要,因此它不得不比任何框架都更频繁地触碰“不完美”的边界。
对比 Svelte,这种“未完成性”的独特价值更为明显。Svelte 通过编译时消除运行时依赖,近乎完美地实现了“重新思考响应性”。它的代码更简洁,性能更优,心智模型也更统一。但 Svelte 的致命问题恰恰在于它太“完成”了——一旦你接受它的编译时魔法,就很难再插入自己的运行时策略。Vue 3 则始终保留一个真正的运行时,支持异步组件、自定义渲染器、Reactivity 的自定义扩展,甚至允许你通过 effectScope 重新组织应用的反应边界。这意味着 Vue 不是一条高速公路,而是一片有路标但未完全硬化的原野。原野是“不完全”的,但正是这种不完全,允许探索性项目和特殊业务场景在其中开出自己的路径。
更深层来看,Vue 3 的“未完成”体现在它对自己定位的刻意收敛。它不声称自己是一个框架,而是一套可组合的工具集合——核心库、生态系统、编译策略都可以独立演进。vapor mode 实验、undici 驱动的 SSR 优化、对 Web Components 的持续接纳……这些都不像 React 那般被统一到一个宏大叙事里。Vue 3 的路线图更像一个开放的集市,官方敲定地基以后,剩下的填充物允许社区反复争论和更换。这种结构上的不封闭,让 Vue 3 更像一个活生态系统,而非一个封闭建筑。在 AI 生成、边缘渲染、流式 SSR 等新潮涌来时,Vue 的自适应能力展现出独特优势:它不需要推翻核心假设,只需要在“未完成”的回旋空间中调整模块方向。
最终,我们要诚实承认:Vue 3 的不完美也是它最脆弱的部分。多范式并存必然增加心智负担,模板语法与 JSX 之间的缝隙也会让新手困惑。但纵观前端历史,每一个伟大的框架都是在“不完美”中逼出了最佳实践——jQuery 的万能背后是 DOM 粒度的混乱,AngularJS 的魔法背后是演进停滞的苦果。Vue 3 的“未完成性”不是一种理想化的浪漫,而是对“变动是常态”这一常识的响应式适配。它拒绝用一套漂亮但僵硬的系统去封闭用户的想象力,也拒绝为了生态一致性而牺牲个性。在这个问题上,Vue 3 给出一个异类但清醒的答案:框架的最高价值,不是替你完成一切,而是为你保留想象和颠覆的空间。而在这个充满不确定的 Web 时代,保留这种“未完成”的能力,可能是比任何完美封装都更宝贵的架构资产。