这个页面无疑是最难编写的,但我们认为它也是非常重要的。或许你曾遇到了一些问题并且已经用其他的框架解决了。你来这里的目的是看看 Vue 是否有更好的解决方案。这也是我们在此想要回答的。
客观来说,作为核心团队成员,显然我们会更偏爱 Vue,认为对于某些问题来讲用 Vue 解决会更好。如果没有这点信念,我们也就不会整天为此忙活了。但是在此,我们想尽可能地公平和准确地来描述一切。其他的框架也有显著的优点,例如 React 庞大的生态系统,或者像是 Knockout 对浏览器的支持覆盖到了 IE6。我们会尝试着把这些内容全部列出来。
我们也希望得到
你
的帮助,来使文档保持最新状态,因为 JavaScript 的世界进步得太快。如果你注意到一个不准确或似乎不太正确的地方,请
提交问题
让我们知道。
第三方 benchmark
,它专注于渲染/更新非常简单的组件树的真实性能。
渲染函数
,甚至
支持 JSX
。然而,我们默认推荐的还是模板。任何合乎规范的 HTML 都是合法的 Vue 模板,这也带来了一些特有的优势:
对于很多习惯了 HTML 的开发者来说,模板比起 JSX 读写起来更自然。这里当然有主观偏好的成分,但如果这种区别会导致开发效率的提升,那么它就有客观的价值存在。
基于 HTML 的模板使得将已有的应用逐步迁移到 Vue 更为容易。
这也使得设计师和新人开发者更容易理解和参与到项目中。
你甚至可以使用其他模板预处理器,比如 Pug 来书写 Vue 的模板。
有些开发者认为模板意味着需要学习额外的 DSL (Domain-Specific Language 领域特定语言) 才能进行开发——我们认为这种区别是比较肤浅的。首先,JSX 并不是没有学习成本的——它是基于 JS 之上的一套额外语法。同时,正如同熟悉 JS 的人学习 JSX 会很容易一样,熟悉 HTML 的人学习 Vue 的模板语法也是很容易的。最后,DSL 的存在使得我们可以让开发者用更少的代码做更多的事,比如
v-on
的各种修饰符,在 JSX 中实现对应的功能会需要多得多的代码。
更抽象一点来看,我们可以把组件区分为两类:一类是偏视图表现的 (presentational),一类则是偏逻辑的 (logical)。我们推荐在前者中使用模板,在后者中使用 JSX 或渲染函数。这两类组件的比例会根据应用类型的不同有所变化,但整体来说我们发现表现类的组件远远多于逻辑类组件。
CSS Modules
),CSS 作用域在 React 中是通过 CSS-in-JS 的方案实现的 (比如
styled-components
和
emotion
)。这引入了一个新的面向组件的样式范例,它和普通的 CSS 撰写过程是有区别的。另外,虽然在构建时将 CSS 提取到一个单独的样式表是支持的,但 bundle 里通常还是需要一个运行时程序来让这些样式生效。当你能够利用 JavaScript 灵活处理样式的同时,也需要权衡 bundle 的尺寸和运行时的开销。
如果你是一个 CSS-in-JS 的爱好者,许多主流的 CSS-in-JS 库也都支持 Vue (比如
styled-components-vue
和
vue-emotion
)。这里 React 和 Vue 主要的区别是,Vue 设置样式的默认方法是
单文件组件
里类似
style
的标签。
单文件组件
让你可以在同一个文件里完全控制 CSS,将其作为组件代码的一部分。
<style scoped> @media (min-width: 250px) { .list-container:hover { background: orange; } } </style>
|
这个可选
scoped
attribute 会自动添加一个唯一的 attribute (比如
data-v-21e5b78
) 为组件内 CSS 指定作用域,编译的时候
.list-container:hover
会被编译成类似
.list-container[data-v-21e5b78]:hover
。
最后,Vue 的单文件组件里的样式设置是非常灵活的。通过
vue-loader
,你可以使用任意预处理器、后处理器,甚至深度集成
CSS Modules
——全部都在
<style>
标签内。
Redux 本身
也可以非常容易的集成在 Vue 应用中。实际上,Vue 更进一步地采用了这种模式 (
Vuex
),更加深入集成 Vue 的状态管理解决方案 Vuex 相信能为你带来更好的开发体验。
两者另一个重要差异是,Vue 的路由库和状态管理库都是由官方维护支持且与核心库同步更新的。React 则是选择把这些问题交给社区维护,因此创建了一个更分散的生态系统。但相对的,React 的生态系统相比 Vue 更加繁荣。
最后,Vue 提供了
CLI 脚手架
,能让你通过交互式的脚手架引导非常容易地构建项目。你甚至可以使用它
快速开发组件的原型
。React 在这方面也提供了
create-react-app
,但是现在还存在一些局限性:
它不允许在项目生成时进行任何配置,而 Vue CLI 运行于可升级的运行时依赖之上,该运行时可以通过
插件
进行扩展。
它只提供一个构建单页面应用的默认选项,而 Vue 提供了各种用途的模板。
它不能用用户自建的
预设配置
构建项目,这对企业环境下预先建立约定是特别有用的。
而要注意的是这些限制是故意设计的,这有它的优势。例如,如果你的项目需求非常简单,你就不需要自定义生成过程。你能把它作为一个依赖来更新。如果阅读更多关于
不同的设计理念
。
指南
就可以建立简单的应用程序。
Weex
会进行官方合作,Weex 是阿里巴巴发起的跨平台用户界面开发框架,同时也正在 Apache 基金会进行项目孵化,Weex 允许你使用 Vue 语法开发不仅仅可以运行在浏览器端,还能被用于开发 iOS 和 Android 上的原生应用的组件。
在现在,Weex 还在积极发展,成熟度也不能和 React Native 相抗衡。但是,Weex 的发展是由世界上最大的电子商务企业的需求在驱动,Vue 团队也会和 Weex 团队积极合作确保为开发者带来良好的开发体验。
另一个选择是
NativeScript-Vue
,一个用 Vue.js 构建完全原生应用的
NativeScript
插件。
Vue CLI
旨在成为 Vue 生态系统中标准的基础工具。它使得多样化的构建工具通过妥善的默认配置无缝协作在一起。这样你就可以专注在应用本身,而不会在配置上花费太多时间。同时,它也提供了根据实际需求调整每个工具配置的灵活性。
类型声明
和
组件装饰器
,并且知道有大量用户在生产环境中使用 Vue + TS 的组合。我们也和微软的 TS / VSCode 团队进行着积极的合作,目标是为 Vue + TS 用户提供更好的类型检查和 IDE 开发体验。
浏览具体的数据
做更细粒度的对比,不过速度应该不是决定性的因素。
AOT
和
tree-shaking
技术后使得最终的代码体积减小了许多。但即使如此,一个包含了 Vuex + Vue Router 的 Vue 项目 (gzip 之后 30kB) 相比使用了这些优化的
angular-cli
生成的默认项目尺寸 (~65KB) 还是要小得多。
指南
投入开发。
Angular 的学习曲线是非常陡峭的——作为一个框架,它的 API 面积比起 Vue 要大得多,你也因此需要理解更多的概念才能开始有效率地工作。当然,Angular 本身的复杂度是因为它的设计目标就是只针对大型的复杂应用;但不可否认的是,这也使得它对于经验不甚丰富的开发者相当的不友好。
模板
与
数据模型
层:
Vue 在普通 JavaScript 对象上建立响应,提供自动化的计算属性。在 Ember 中需要将所有东西放在 Ember 对象内,并且手工为计算属性声明依赖。
Vue 的模板语法可以用全功能的 JavaScript 表达式,而 Handlebars 的语法和帮助函数相比来说非常受限。
在性能上,Vue 比 Ember
好很多
,即使是 Ember 3.x 的最新 Glimmer 引擎。Vue 能够自动批量更新,而 Ember 在性能敏感的场景时需要手动管理。
浏览器支持
以及其他方面的表现也是让人印象深刻的。它最低能支持到 IE6,而 Vue 最低只能支持到 IE9。
随着时间的推移,Knockout 的发展已有所放缓,并且略显有点老旧了。比如,它的组件系统缺少完备的生命周期事件方法,尽管这些在现在是非常常见的。以及相比于
Vue
调用子组件的接口它的方法显得有点笨重。
如果你有兴趣研究,你还会发现二者在接口设计的理念上是不同的。这可以通过各自创建的
simple Todo List
体现出来。或许有点主观,但是很多人认为 Vue 的 API 接口更简单结构更优雅。
遍历 DOM 树
而不是虚拟 DOM,但实际上用的还是脏检查机制,因此和 AngularJS 患有相同的性能问题。
更多成熟工具的支持。Vue 提供官方支持
webpack
和
Browserify
,而 Riot 是依靠社区来建立集成系统。