新特征
- 编译时候会对原生元素(div)和组件元素(component)进行分析对比,运行时候原生元素直接生成vitrual dom,组件元素就直接生成组件代码。
- 优化slots生成,生成新的组件依赖关系,避免不必要的组件渲染。之前版本如果slots模板自身发生变化,会通知调用的父组件更新。现在利用scoped(范围、作用域)只更新子组件本身了。
- 静态属性的提取。之前v2.x只对静态内容做直接输出,但是静态属性可以和静态内容一样不做比对直接输出。
1
<div id="test" class="test">{{ msg }}</div>
数据监听由object.defineProperty变为Proxy。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
1
2
3obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等):参考
- Proxy是lazy by default,初始化整个对象数据,当用某个属性用到才会被监听。
runTime资源会更小(源码支持tree-shaking)
- 源码支持tree-shaking结构, 之前的所有的功能都挂在vue对象上,vue3.x把不是必须的功能编译打包的时候按需引入。最最最基本核心代码大概10kg gziped压缩。
1
2
3
4
5
6
7
8
9//Vue2.0
import Vue from 'vue'
Vue.nextTick(() => {})
const obj = Vue.observable({})
//Vue3.0
import { nextTick, observable } from 'vue'
nextTick(() => {})
const obj = observable({})
时间分片
- cpu运行web程序机制是:主队列(主线程)需要完成所有主要任务(脚本的加载、渲染等),才能响应用户的操作。 这样用户的体验取决于Vue组件加载或者重新渲染的时间。
- Vue3的时间分片做法:将脚本运算过程切换成小段,并在每段执行完之后查看是否有用户输入处理。这样无论多少次渲染和重新渲染,应用程序都保持这响应状态。
flow变为type-script
编译器重构
- 插件化设计,便于开发者参与其中。
- 带位置的信息parser(source maps), 具体某个模板具体某一块出错信息。
- 更好的IDE工具链(eslint、vscode)