与其他框架比较

Angular

虽然可能不适用于所有人,但使用 Vue 而不是 Angular 有几个原因。

有趣的是,Angular 2 和 Vue 在解决这些 Angular 1 问题方面存在一些相似之处。

React

React 和 Vue.js 确实有一个共同点,即它们都提供响应式和可组合的视图组件。当然,它们之间也存在很多差异。

首先,内部实现从根本上不同。React 的渲染利用了虚拟 DOM - 实际 DOM 应该是什么样子的内存中表示。当状态发生变化时,React 会对虚拟 DOM 进行完全重新渲染,对其进行差异比较,然后修补实际 DOM。

虚拟 DOM 方法提供了一种在任何时间点描述视图的功能方式,这非常好。因为它不使用可观察对象,并且在每次更新时都重新渲染整个应用程序,因此视图在定义上保证与数据同步。它还为同构 JavaScript 应用程序打开了可能性。

Vue.js 没有使用虚拟 DOM,而是使用实际 DOM 作为模板,并保留对实际节点的引用以进行数据绑定。这将 Vue.js 限制在存在 DOM 的环境中。然而,与普遍的误解相反,虚拟 DOM 并没有使 React 比其他任何东西都快,实际上,Vue.js 在热更新方面比 React 性能更出色,并且几乎不需要手动调整优化。使用 React,你需要在所有地方实现 shouldComponentUpdate 并使用不可变数据结构来实现完全优化的重新渲染。

从 API 角度来看,React(或 JSX)的一个问题是,渲染函数通常涉及很多逻辑,最终看起来更像一段程序(实际上它就是),而不是界面的视觉表示。对于某些开发人员来说,这是一个优势,但对于像我这样的设计师/开发人员混合体来说,拥有一个模板使得更容易直观地思考设计和 CSS。JSX 与 JavaScript 逻辑混合在一起打破了我需要将代码映射到设计的视觉模型。相比之下,Vue.js 为轻量级数据绑定 DSL 付出了代价,因此我们拥有一个可视化扫描的模板,并将逻辑封装到指令和过滤器中。

React 的另一个问题是,由于 DOM 更新完全委托给虚拟 DOM,因此当你实际上想要控制 DOM 本身时,这有点棘手(虽然理论上你可以,但当你这样做时,你实际上是在与库作对)。对于需要即时自定义 DOM 操作的应用程序,特别是具有复杂时间要求的动画,这可能会成为一个相当令人讨厌的限制。在这方面,Vue.js 允许更大的灵活性,并且有 多个使用 Vue.js 构建的 FWA/Awwwards 获奖网站

一些额外的说明

Ember

Ember 是一个功能齐全的框架,旨在高度意见化。它提供了许多既定的约定,一旦你熟悉了它们,它就可以使你非常高效。但是,这也意味着学习曲线很高,灵活性受到影响。当你试图在意见化的框架和一组松散耦合的工具之间进行选择时,这是一个权衡。后者为你提供了更多自由,但也要求你做出更多架构决策。

也就是说,将 Vue.js 核心与 Ember 的模板和对象模型层进行比较可能更好。

Polymer

Polymer 是另一个由 Google 赞助的项目,事实上,它也是 Vue.js 的灵感来源。Vue.js 的组件可以与 Polymer 的自定义元素进行松散比较,两者都提供非常相似的开发风格。最大的区别是 Polymer 是建立在最新的 Web Components 功能之上的,并且需要非凡的 polyfill 才能在不支持这些功能的浏览器中工作(性能下降)。相比之下,Vue.js 在 IE9 及更高版本中无需任何依赖项即可工作。

此外,在 Polymer 1.0 中,团队确实限制了其数据绑定系统,以弥补性能问题。例如,Polymer 模板中支持的唯一表达式是布尔否定和单个方法调用。它的计算属性实现也不够灵活。

最后,在部署到生产环境时,Polymer 元素需要通过一个名为 vulcanizer 的 Polymer 专用工具进行捆绑。相比之下,单个文件 Vue 组件可以利用 Webpack 生态系统提供的一切,因此您可以在 Vue 组件中轻松使用 ES6 和任何您想要的 CSS 预处理器。

Riot

Riot 2.0 提供了类似的基于组件的开发模型(在 Riot 中称为“标签”),具有最小且设计精美的 API。我认为 Riot 和 Vue 在设计理念上有很多共同点。然而,尽管比 Riot 重一些,但 Vue 确实提供了一些比 Riot 显著的优势。