Vue2 和 Vue3 都是基于 Vue.js 的前端框架,它们的目标是让开发者能够快速地构建用户界面和交互。但是,它们之间也有很多不同之处,这些不同之处主要体现在以下几个方面:

响应式原理

Vue2 和 Vue3 都使用了响应式数据绑定,也就是当数据发生变化时,视图会自动更新。但是,它们实现响应式的方式不一样。Vue2 是利用了 ES5 的 API Object.defineProperty() 来实现数据的监听和更新,这个 API 有一些局限性,比如无法检测到数组和对象的变化,也无法监听到新增或删除的属性。Vue3 中使用了 ES6 的 API Proxy 来实现更强大和灵活的数据拦截和操作,这个 API 可以解决 Vue2 中的一些问题,比如可以检测到数组和对象的变化,也可以监听到新增或删除的属性。

模板语法

Vue2 和 Vue3 都使用了 HTML 作为模板语言,让开发者可以用熟悉的标签和属性来编写界面。但是,Vue3 在模板语法上做了一些改进和扩展。比如,Vue3 支持碎片,也就是可以在模板中使用多个根标签,而 Vue2 不支持,只能有一个根标签。另外,Vue3 也增加了一些新的模板指令,比如 v-model、v-is、v-slots 等。

组件 API

Vue2 和 Vue3 都使用了组件化的思想,让开发者可以把复杂的界面拆分成可复用的小部件。但是,它们提供了不同的组件 API 来组织组件的代码。Vue2 使用了选项式 API,也就是 data、methods、computed 等选项来定义组件的状态、行为和计算属性。这种 API 在组件简单时很方便,但是在组件复杂时会导致代码混乱和难以维护。Vue3 使用了组合式 API,也就是 setup() 函数和一些新的内置函数,来实现更好的逻辑复用和关注点分离。这种 API 可以让开发者按照功能来划分代码,而不是按照选项来划分代码。

源码语言

Vue2 和 Vue3 的源码都是开源的,任何人都可以查看和修改它们。但是,它们使用了不同的编程语言来编写源码。Vue2 的源码使用了 JavaScript 作为编程语言,并且使用了 Flow 做类型检查。Flow 是一个静态类型检查器,可以帮助开发者在编译时发现一些潜在的错误和问题。Vue3 的源码使用了 TypeScript 重写,TypeScript 是一个超集

虚拟 DOM

Vue2 和 Vue3 都使用了虚拟 DOM 的技术,也就是用一个 JavaScript 对象来表示真实的 DOM 节点,这样可以提高渲染性能和跨平台能力。但是,Vue3 的虚拟 DOM 进行了一些优化,使得更新速度更快。比如,Vue3 增加了静态标记,也就是在编译时就把不会变化的节点标记出来,这样在更新时就可以跳过这些节点。另外,Vue3 也增加了元素提升,也就是把一些静态的元素提升到 render 函数之外,这样就不用每次都重新创建这些元素。还有,Vue3 也增加了事件缓存,也就是把一些事件处理函数缓存起来,这样就不用每次都重新绑定这些函数。

打包体积

Vue2 和 Vue3 都支持按需引入和模块化打包,让开发者可以根据需要选择要使用的功能和组件。但是,Vue3 的打包体积变小了,尽管增加了许多新特性,但 Vue3 被压缩后的基线大小约为 10 KB,不到 Vue2 的一半。这是因为 Vue3 使用了 tree-shaking 的技术,可以在打包时去掉一些没有用到的代码和模块。

新特性

Vue2 和 Vue3 都提供了一些新特性和功能,让开发者可以更方便地开发和扩展应用。但是,Vue3 新增了一些全局 API、模板指令、组件和生命周期钩子,让开发者可以更灵活地控制应用的行为和状态。比如,Vue3 新增了 createApp() 函数,可以用来创建一个应用实例,并且可以配置一些全局选项和插件。另外,Vue3 新增了 Teleport 组件,可以用来把子组件渲染到任意位置的 DOM 节点上。还有,Vue3 新增了 renderTracked 和 renderTriggered 这两个生命周期钩子,可以用来追踪和触发组件的渲染过程。

文档更新时间: 2023-08-11 15:20   作者:朱勇老师