为什么要学源码
- 技术是
第一生产力
- 学习 API 的设计目的、
思路
、取舍 - 学习优秀的
代码风格
- 学习组织代码的方式
- 学习实现方法的技巧
- 学习 ES67 新 API、TS 高级用法
- 不给自己设限,不要让你周围人的技术上限成为你的上限
面试加分项
- 装逼利器
学习源码副作用
画虎不成反类犬
(强行上马 vue3,自己焦头烂额、项目难以维护、同事苦不堪言)- 为了用而用,而不是因地制宜
- 喜欢炫技写一下看似搞大上,实际
没有可读性
,影响团队协作的奇技淫巧
vue3 设计动机与目的
更好的逻辑复用与代码组织
- vue2 option api 的代码风格将同一逻辑点的代码分散在各处,会导致读者关注点分离,也不利于代码的逻辑复用;而 vue3 composition api 将同一业务逻辑的代码聚合在一起命名为 useXXX 函数,再通过 setup 将不同的逻辑组装起来并返回给组件 data,明显更方便逻辑复用。
- vue2 mixin 用于逻辑复用的时候容易导致命名冲突和数据来源不清晰;而 vue3 provide/inject 配合 composition api 可以很方便的找到数据来源并通过解构重命名,明显更方便逻辑复用。
更好的类型推导
- 在 methods 中 this 指向组件实例而不是 method 本身,不利于类型推导。
- 例如 this.router、this.store,每个新的插件都会需要向 Vue 追加类型定义。
更新前后对比
优化
- 打包更小(全局 API tree-shaking)
- 渲染、更新更快,内存占用减少
使用 proxy 取代 Object.defineProperty
v-model 代替以前的 v-model 和.sync
- 生命周期变更 例如 destroyed beforeDestroy 改为 unmounted beforeUnmount
- 自定义指令 API 与生命周期保持一致
- Diff 算法的提升(静态标记、静态提升)
新特性
Template 支持多个根标签
composition API 实现逻辑模块化和复用
- Teleport 传送门组件 代码块挂载到任意位置
- Suspense 悬停组件 异步加载组件使用(实验属性)
- 使用 @vue/runtime-core 的 createRenderer 自定义渲染器(跨平台利器)
- 使用 ts 编写源码,更好的类型推导、更好的适配 ts
更多变化
- v3.cn.vuejs.org/guide/migra…
疑问解答
问题一:compostion api 根本没有解决任何问题,只是追逐新玩意的东西
尤雨溪
: 不同意这个观点。
Vue 最开始很小,但是现在被广泛应用到不同级别复杂度的业务领域,有些可以基于 option API 很轻松处理,但是有些不可以。例如下面的场景: