kiwilili / plasticien-mini-vue

mini-vue

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mini-vue

author

实现 vue3 的核心逻辑,忽略边缘 case,旨在理解 vue3 的设计理念

目前已实现了 reactivity、runtime-core 和 runtime-dom 模块

Features

  • 使用rollup打包,支持ESModuleCommonJS两种模块化方案

reactivity

基于TDD的**,每个功能都是先编写相应的单元测试,然后再去进行实现,可以直接使用jest运行单元测试查看结果

  • 实现effect核心逻辑,基于proxy完成依赖收集和触发依赖
  • 实现effectschedulerstop功能,为runtime-core的数据更新和视图异步渲染提供基础支持
  • 实现reactive响应式对象核心特性,支持将嵌套对象也转成reactive对象
  • 实现reactive相关 API,如isReactiveisProxy
  • 实现readonlyshallowReadonly,以及isReadonly判断是否为readonly对象
  • 实现ref的核心特性
  • 实现ref的相关 API,如isRefunRefproxyRefs
  • 复用effect中的ReactiveEffect类实现computed计算属性

runtime-core

  • 实现vnode
  • 实现ShapeFlags位运算标识vnode类型,目前主要支持组件类型、Element类型、Text类型的vnode
  • 实现组件的props初始化逻辑
  • 实现默认插槽、具名插槽和作用域插槽
  • props支持传入onXxx用于监听xxx事件,如onClick可监听click事件
  • 实现组件的emit逻辑
  • 实现组件的setup API,能够在setup中获取到propscontext
  • 实现组件的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的过程中,把自己的一些心得全都记录了下来,在掘金上发布了一个专栏,每一个功能对应的实现思路都有记录

掘金专栏 -- 手把手带你实现 mini-vue

About

mini-vue


Languages

Language:JavaScript 62.8%Language:TypeScript 37.2%