实现 vue3 的核心逻辑,忽略边缘 case,旨在理解 vue3 的设计理念
目前已实现了 reactivity、runtime-core 和 runtime-dom 模块
- 使用
rollup
打包,支持ESModule
和CommonJS
两种模块化方案
基于TDD
的**,每个功能都是先编写相应的单元测试,然后再去进行实现,可以直接使用jest
运行单元测试查看结果
- 实现
effect
核心逻辑,基于proxy
完成依赖收集和触发依赖 - 实现
effect
的scheduler
和stop
功能,为runtime-core
的数据更新和视图异步渲染提供基础支持 - 实现
reactive
响应式对象核心特性,支持将嵌套对象也转成reactive
对象 - 实现
reactive
相关 API,如isReactive
、isProxy
- 实现
readonly
和shallowReadonly
,以及isReadonly
判断是否为readonly
对象 - 实现
ref
的核心特性 - 实现
ref
的相关 API,如isRef
、unRef
、proxyRefs
- 复用
effect
中的ReactiveEffect
类实现computed
计算属性
- 实现
vnode
- 实现
ShapeFlags
位运算标识vnode
类型,目前主要支持组件类型、Element
类型、Text
类型的vnode
- 实现组件的
props
初始化逻辑 - 实现默认插槽、具名插槽和作用域插槽
-
props
支持传入onXxx
用于监听xxx
事件,如onClick
可监听click
事件 - 实现组件的
emit
逻辑 - 实现组件的
setup API
,能够在setup
中获取到props
和context
- 实现组件的
render
函数中通过this
访问setup
返回的setupState
,基于proxy
实现 - 实现
getCurrentInstance
,可在setup
中调用获取当前组件实例 - 实现
provide/inject
- 在
render
函数中可通过this.$el
获取组件的根挂载点DOM
对象 - 在
render
函数中可通过this.$props
访问setup
中的props
- 抽离
Element
的渲染相关逻辑成自定义渲染器接口,并在runtime-dom
模块中实现具体接口完成DOM
环境下的渲染 - 使用
diff
算法实现Element
的更新逻辑 - 实现组件的更新逻辑
- 实现
nextTick
,可在setup
中访问到更新后的组件实例
在学习vue3
源码实现mini-vue
的过程中,把自己的一些心得全都记录了下来,在掘金上发布了一个专栏,每一个功能对应的实现思路都有记录