一、 源码优化
目的是让代码更易于开发和维护。
1. 更好的代码管理方式:monorepo
- Vue.js 2.0
源码托管在 src 目录。
所有功能依赖 Vue.js 运行。
- Vue.js 3.0
monorepo
的方式维护,根据功能将不同的模块拆分到 packages 目录下面不同的子目录。monorepo
把这些模块拆分到不同的 package 中,每个 package 有各自的 API、类型定义和测试。一些 package可以独立于
Vue.js
使用,如果只想使用Vue.js 3.0
的响应式能力,可以单独依赖这个响应式库而不用去依赖整个Vue.js
,减小了引用包的体积大小。
2. 有类型的 JavaScript:TypeScript
- Vue.js 2.0
- 选用
Flow
做类型检查。对于一些复杂场景类型的检查,支持得并不好。
- Vue.js 3.0
- 源码自身采用了
TypeScript
开发。TypeScript
类型语言非常有利于代码的维护,做类型检查。
二、 性能优化
1. 源码体积优化
移除一些冷门的
feature
(如filter
、inline-template
等);引入
tree-shaking
的技术,减少打包体积。
2. 数据劫持优化
- Vue.js 1.x 和 Vue.js 2.x
- 通过
Object.defineProperty
这个 API 去劫持数据的getter
和setter
。并不能检测对象属性的添加和删除。
- Vue.js 3.0
- 使用了
Proxy
API 做数据劫持。对于对象的属性的增加和删除都能检测到。真正访问到的内部对象才会变成响应式 ,而不是无脑递归。
3. 编译优化
- Vue.js 2.0
数据更新并触发重新渲染的粒度是组件级的。会导致
vnode
的性能跟模版大小正相关,跟动态节点的数量无关,当一些组件的整个模版内只有少量动态节点时,这些遍历都是性能的浪费。
patch
阶段耗时相对较多。
- Vue.js 3.0
编译阶段对静态模板的分析,编译生成了
Block tree
。在编译阶段优化编译的结果,来实现运行时
patch
过程的优化。编译阶段还包含了对
Slot
的编译优化、事件侦听函数的缓存优化,并且在运行时重写了diff
算法。
三、 语法 API 优化:Composition API
Vue.js 3.0
提供了Composition API
。
1. 优化逻辑组织
- Vue.js 1.x 和 Vue.js 2.x
- 逻辑关注点是非常分散。
- Vue.js 3.0
Composition API
将某个逻辑关注点相关的代码全都放在一个函数里,逻辑集中。
2. 优化逻辑复用
- Vue.js 2.0
mixins
去复用逻辑。
- Vue.js 3.0
- 复用逻辑这个函数为
hook
函数,然后在组件中使用。
3. 引入 RFC
:使每个版本改动可控
全称是
Request For Comments
,旨在为新功能进入框架提供一个一致且受控的路径。Vue.js 3.0
版本有很多重大的改动,每一条改动都会有对应的RFC
,通过阅读这些RFC
,你可以了解每一个feature
采用或被废弃掉的前因后果。