Vue2、Vue3 和 React 对比

238 阅读9分钟

Vue2 和 Vue3

这些差异主要涉及性能、组件构建、内置功能和 API 更改

1、性能:Vue 3 的性能得到了很大程度的提升。与 Vue 2 相比,它在捆绑大小、初始化速度和内存使用方面都有所改进。这得益于 Vue 3 中的优化编译策略和更轻量级的虚拟 DOM。

优化编译策略:Vue 3 引入了一种称为 "tree-shaking" 的编译策略,这种策略可以有效地减小应用程序的最终捆绑大小。Tree-shaking 是一种消除死代码的技术,它可以确保仅将实际用到的 Vue 功能和模块打包到生产版本中。这不仅减轻了客户端的负担,还有助于提高应用程序的加载速度。另外,Vue 3 编译器还对模板进行了优化,生成更高效的运行时代码。

更轻量级的虚拟 DOM:Vue 的虚拟 DOM 是一个在内存中表示真实 DOM 的轻量级数据结构。Vue 通过比较新旧虚拟 DOM 树来检测变化并决定如何进行最小化更新。Vue 3 采用了一种名为 "monomorphic calls" 的优化策略,它可以生成更简洁、更易于优化的 JavaScript 代码。这有助于提高虚拟 DOM 的性能,降低应用程序的整体运行时开销。

静态树及静态属性提升:Vue 3 编译器能够检测到模板中不会更改的部分(静态树和静态属性),并将其提升到渲染函数之外。这意味着这些部分在后续重新渲染时不再需要重新生成,从而减少了渲染过程中的开销。

基于 Proxy 的响应式系统:Vue 3 的响应式系统基于 ES6 Proxy 对象,它比 Vue 2 使用的 Object.defineProperty 更高效。Proxy 允许 Vue 直接拦截对象的访问和修改操作,而无需对每个属性进行递归处理。这使得 Vue 3 在检测数据变化时更加迅速,而且内存占用更低。

2、组合式 API:Vue 3 引入了一种名为组合式 API 的新组件构建方法。它允许在组件中更灵活地组织和复用逻辑,而无需使用 mixin 或高阶组件。尽管 Vue 3 仍然支持基于选项的 API,但 Vue 3 鼓励使用组合式 API 来改善代码的组织和可读性。

3、响应式系统:Vue 3 使用了一种全新的响应式系统,基于 ES6 的 Proxy 对象。这使得 Vue 3 在检测数据变化和性能方面比 Vue 2 更高效。另一方面,Vue 2 使用的是基于 ES5 的 Object.defineProperty 方法,这在某些情况下可能会导致性能瓶颈。

Vue 2 使用 Object.defineProperty 来实现数据响应式,这是一种基于 ES5 的特性。通过此方法,Vue 可以监听数据变化并在数据发生变化时触发视图的更新。

Object.defineProperty方法接受三个参数:对象(obj),属性名(prop)和描述符对象(descriptor)。描述符对象用于定义或修改对象的属性。Vue 使用 Object.defineProperty 将数据对象的每个属性转换为 getter(访问器属性)和 setter(设置器属性),以便在获取或设置属性值时触发通知。

以下是 Vue 2 使用 Object.defineProperty 的简化示例:

image.png

然而,Object.defineProperty具有一定的限制,例如它不能监听对象属性的添加和删除以及数组的变化。Vue 2 使用一些策略和技巧来解决这些问题,例如,使用 Vue.set 和 Vue.delete 方法,以及对数组方法进行变更检测。

Vue 3 改用 Proxy API 实现数据响应式,克服了Object.defineProperty的这些限制。

Vue 3 使用 Proxy API 来实现数据的响应式,这是一种基于 ES6 的特性。相较于 Vue 2 的 Object.defineProperty,Proxy API 提供了更强大的数据拦截和劫持能力,能够解决 Vue 2 中的一些限制,例如监听对象属性的添加和删除以及数组的变化。

Proxy API 允许在访问和操作对象属性时进行拦截和自定义行为。Vue 3 通过创建一个代理对象来包装原始数据对象,该代理对象可以拦截对原始数据的读取、写入和删除操作,并在数据发生变化时触发视图的更新。

以下是 Vue 3 使用 Proxy API 的简化示例:

image.png 通过使用 Proxy API,Vue 3 可以更轻松地处理动态添加和删除属性,而无需 Vue.set 和 Vue.delete 方法。此外,Vue 3 还能更好地处理数组操作,而无需对数组方法进行变更检测。

Vue 和 React

设计理念:

  • Vue 使用了一种 MVVM(Model-View-ViewModel)的设计模式,提供了一个清晰的数据绑定和组件化的解决方案。
  • React 则是一个基于 UI 组件的库,它关注于组件的组合和 UI 的可组合性。React 使用一种称为 Virtual DOM 的技术来优化渲染性

语法和模板:

  • Vue 使用了基于 HTML 的模板语法,可以直接在 HTML 文件中使用 Vue 指令和插值表达式。
  • React 使用了一种叫 JSX(JavaScript XML)的扩展语法,它允许将 HTML 和 JavaScript 代码混合编写。

组件和状态管理:

  • Vue 提供了单文件组件(SFC)的概念,这使得 HTML、CSS 和 JavaScript 可以在一个文件中进行组织和管理。Vue 还有一个内置的状态管理系统,叫做 Vuex,它可以帮助管理复杂的应用状态。
  • React 只关注 UI 组件的构建,并且组件通常是通过 JavaScript 和 JSX 来定义的。React 依赖于外部库,如 Redux 或 MobX,来进行复杂的状态管理。

vue2、vue3、react区别

  1. 数据响应式:

    • Vue 2 使用 Object.defineProperty 实现数据响应式。这是一种基于 ES5 的特性,有一定的限制,例如不能监听对象属性的添加和删除以及数组的变化。
    • Vue 3 使用 Proxy API 实现数据响应式,优化了 Vue 2 的限制。Proxy API 是基于 ES6 的特性,能够更好地处理动态添加和删除属性以及数组操作。
    • React 则使用一种称为 Virtual DOM 的技术来优化渲染性能。它不使用数据响应式,而是在每次更新时对比新旧虚拟 DOM 树,计算最小的更新操作。
  2. 组件和逻辑组织:

    • Vue 2 使用 Options API 来组织组件的逻辑,这使得在开发小型应用时更容易上手。但在大型应用中,相关的逻辑可能会分散在不同的选项中。
    • Vue 3 提供了一种新的 API,称为组合 API(Composition API),它提供了一种更灵活的方式来组织和重用逻辑代码,同时兼容 Options API。
    • React 使用 Hooks(React 16.8 引入)来实现逻辑重用和更好的代码组织。Hooks 是一种在函数组件中使用状态和其他 React 功能的方式。
  3. 性能优化:

    • Vue 2 提供了高性能的渲染策略,通过依赖跟踪和数据变化的精确监听来实现高效的组件重新渲染。但它的性能可能受到数据响应式的一些限制。
    • Vue 3 提供了许多性能改进,包括更小的框架大小、更快的虚拟 DOM 实现(模版编译、运行时性能)和更好的代理 API(Proxy API)数据响应系统。
    • React 使用 Virtual DOM 和 diffing 算法来确定何时需要更新 DOM。性能方面,Vue 3 和 React 都表现出色,实际差异可能取决于具体的应用和使用场景。
  4. 语法和模板:

    • Vue 2 和 Vue 3 都使用了基于 HTML 的模板语法,可以直接在 HTML 文件中使用 VueVue 2、Vue 3 和 React 是前端开发中最受欢迎的框架/库。下面是这三者之间的一些主要区别和特点:
  5. 数据响应式:

    • Vue 2 使用 Object.defineProperty 实现数据的响应式,这是一种基于 ES5 的特性。但它有一些限制,例如不能检测到对象属性的添加和删除以及数组的变化。
    • Vue 3 使用 Proxy API 实现数据响应式,这是一种基于 ES6 的特性。它克服了 Object.defineProperty 的限制,可以检测对象属性的添加和删除以及数组的变化。
    • React 依赖于组件状态(state)和生命周期方法或 Hooks 来实现数据响应。React 不会自动检测数据变化,需要手动调用 setState 或使用 useState Hook 来触发组件重新渲染。
  6. 逻辑重用:

    • Vue 2 中,逻辑重用主要依赖于 Mixins。但 Mixins 有一些缺点,例如命名冲突、隐式依赖和不清晰的来源。
    • Vue 3 引入了组合 API(Composition API),提供了一种更灵活的方式来组织和重用逻辑代码。这使得 Vue 3 在处理大型应用和逻辑复杂度方面变得更加强大。
    • React 使用 Hooks 来实现逻辑重用和代码组织。Hooks 是一种在函数组件中使用状态和其他 React 功能的方式,同时还支持逻辑重用和更好的代码组织。
  7. 性能:

    • Vue 2 在性能方面表现良好,但它的虚拟 DOM 实现和依赖追踪系统在某些情况下可能不如 React 高效。
    • Vue 3 提供了许多性能改进,包括更小的框架大小、更快的虚拟 DOM 实现(模板编译、运行时性能)和更好的 Proxy API 数据响应系统。这些改进使得 Vue 3 在性能方面与 React 更加接近。
    • React 使用 Virtual DOM 和 diffing 算法来确定何时需要更新 DOM。React 也在持续优化性能,例如通过使用时间分片(Time Slicing)和 Concurrent Mode 等技术。
  8. 代码和模板:

    • Vue 2 和 Vue 3 都使用了基于 HTML 的模板语法,可以直接在 HTML 文件中使用 Vue 指令和插值表达式。Vue 还支持单文件组件(SFC),将 HTML、CSS 和 JavaScript 代码组织在一个文件中。
    • React 使用 JSX(JavaScript XML)扩展语法,允许将 HTML 和 JavaScript 代码混合编写。这提供了更强大的表达能力,但可能需要一些时间来适应。
  9. 生命周期和状态管理:

    • Vue 2 和 Vue 3 都有自己的生命周期方法,用于在不同阶段处理组件逻辑。Vue 使用内置的状态管理系统 Vuex 来管理复杂的应用状态。
    • React 通过组件生命周期方法和状态(state)来处理组件逻辑。React 依赖于外部库,如 Redux 或 MobX,来进行复杂的状态管理。