快速了解vue3.0新特性
场景:vue3.0源码已经发布了半年了,尤雨溪大大最近也频繁开课更新进展,虽然公司项目里面引入3.0还需要一段时间的沉淀,但是不妨碍我们可以大致了解下3.0的新特性和修改
主要参考的相关链接:
// Composition API详情:
'https://composition-api.vuejs.org/api.html#advanced-reactivity-apis'
// monorepo结构介绍
'https://trunkbaseddevelopment.com/monorepos/'
// 用户意见收集RFC
'https://github.com/vuejs/rfcs/blob/function-apis/active-rfcs/0000-function-api.md'
// vue3.0源码的github地址
'https://github.com/vuejs/vue-next'
// 尤雨溪4.21B站直播ppt
'https://juejin.im/post/5e9f6b3251882573a855cd52'
// 尤雨溪5.28发布微博
'https://increment.com/frontend/making-vue-3/'
// 尤雨溪6.4直播ppt
'https://mp.weixin.qq.com/s?__biz=MzA4MDU1MDExMg==&mid=2247483829&idx=1&sn=75ef516c9174cda030db48d4ab5722e3&chksm=9fa3c03aa8d4492c5d49866df093f61aeb3f8484bf6b75ad87a63d207cfdc3d18910fe42702f&token=454539811&lang=zh_CN#rd'
// 阮一峰的ES6
'https://es6.ruanyifeng.com/#docs/proxy'
总结:从6个方面抛出新特性,感兴趣的小伙伴自己去找源码深入~

1、双向绑定
2.0现有限制:
1、无法检测到新的属性添加/删除
2、无法监听数组的变化
3、需要深度遍历,浪费内存
3.0优化:
1、允许框架拦截对象上的操作
2、Proxy默认可以支持数组
3、多层对象嵌套,使用懒代理
【注意:要看这部分源码,先保证对阮一峰的ES6博客中Proxy、Reflect、Set和Map有一定程度的了解】
核心:主要通过函数reactive()给对象新增一个Proxy对象监听内部的属性来实现数据监听,部分源码如下

解析:通过observed = new Proxy(target, handle);
给每一个传入的target对象包一个Proxy对象,有操作时触发handle
方法;
其中let toProxy = new WeakMap()
,WeakMap是弱引用,key为对象,用于缓存代理的target,let toRaw = new WeakMap()
,用于缓存observed,避免重复代理;
handle方法中有get()和set(),在get()中执行track()依赖收集,在set()中执行trigger()触发更新。
2、虚拟DOM
2.0VDOM性能瓶颈:
1、虽然vue能够保证触发更新的组件最小化,但单个组件部分变化需要遍历该组件的整个vdom树
2、传统vdom性能跟模版大小正相关,跟动态节点的数量无关
3.0优化工作
1、将AST基于动态节点指令(if,for,slot)切割为嵌套的区块
2、主动检测模版中的静态节点
3、给元素一个追踪标记,无论层级嵌套多深,更新时可以直接遍历动态节点
3.0的新策略将vdom更新性能与模版大小解耦,变为与动态节点的数量相关,整体比vue2性能提升2~5倍。
3、Tree-Shaking
2.0现有限制: 并不是每个人都使用框架的所有功能,但仍需下载/解析相应代码
3.0优化:将大多数全局API和内部组件移至ES模块导出,tree-shaking更友好
4月份的数据显示,vue2.0的运行时大小是22.5kb,3.0在13.5kb。
4、Composition API
// Composition API详情:
'https://composition-api.vuejs.org/api.html#advanced-reactivity-apis'
这部分内容实在太多,给一个网站大家可以自己去查看~
5、使用TS
整个3.0的源码都是用ts重构的,TypeScript的好处是有类型检查~
6、内部模块解耦
神奇的monorepo结构
// monorepo结构介绍
'https://trunkbaseddevelopment.com/monorepos/'