两个月我肝了一个散装mini-vue3的学习分享

3,277 阅读6分钟

在去年6月份接触到vue3,上手感觉直接起飞爽爆了,就对vue3情有独钟了。之后又在github上看到了许多大佬都实现了自己的mini-vue,心想着自己也实现一个,于是我就去看大佬们的mini-vue但是。。。。。我看不懂。这就很烦!!!后来才发现知识断层太多,压根看不懂,相信许多小伙伴看源码都遇到过这种问题。后续笔者将会分享如何去学习源码并如何写出属于自己的mini-vue。

  • 先贴出mini-vue3的源码地址: mini-vue3

参考

崔大佬的mini-vue 注释很清楚很适合学习

beggar-vue

vue源码

vue.js设计与实现.霍春阳

mini-vue3介绍

采用和vue3源码相同的monorepo前端项目管理,源码结构、函数名和vue3基本一致

核心功能

  • reactivity
    • reactive 只支持普通对象和Map、Set对象的响应式代理
    • shallowReactive
    • readonly
    • shallowRedonly
    • ref
    • shallowRef
    • unref
    • proxyRefs
    • toRef
    • toRefs
    • effect
    • ReactiveEffect
    • computed
  • runtime-core
    • KeepAlive组件
    • Teleport组件
    • defineAsyncComponent
    • defineComponent
    • createAppAPI
    • onBeforeMount
    • onMounted
    • onBeforeUpdate
    • onUpdated
    • onBeforeUnmount
    • onUnmounted
    • watch
    • patch
    • emit
    • slots
    • h
    • scheduler调度器
    • createVNode
    • createRenderer
  • runtime-dom
    • createApp
    • createSSRApp
    • Transition 组件
    • ensureRenderer
    • ensureHydrationRenderer
    • render
    • hydrate
  • compiler-core
    • baseParse
    • baseCompile
    • codegen
    • transform
    • transformElement
    • transformText
    • transformExpression
    • transformBind
    • transformOn
    • transformIf
    • transformFor
  • compiler-dom
    • parse
    • compile
  • template-explorer
    • 支持编译生成render函数代码预览
  • shared
    • 基本的通用工具函数和枚举
  • vue
    • compile 返回一个render函数
    • 全局统一导出miniVue3供外部使用,目前只支持global引入和esModule方式引入
  • server-renderer
    • renderToString
    • renderVNode
  • compiler-sfc
    • 未完成

项目整体结构

image.png

如何肝出来的?

其实对于刚想学习源码的小伙伴来说,直接看代码是非常吃力的,因为源码里存在许许多多的细节、bug补丁、异常处理、环境切换等等代码。总之直接去看源码容易失去学习源码的信心。那么我们应该如何有效的学习vue3源码?下面我将把我学习源码的过程分享给大家。

开始准备

首先学习vue3源码,必须得对vue3熟悉,什么才叫熟悉?就是你得知道每个api的用法,和作用。这个大家应该都会吧,不熟悉的直接看vue3中文文档

image.png

熟悉了之后干嘛?有的人可能会说:看别人写的mini-vue。其实这种方式在笔者看来也是行不通的,首先大佬们写的mini-vue其实都是模块化了的,直接看你会无从下手。到底是从reactive模块开始?还是runtime模块开始呢?这个问题我们一会儿再说。

百行code实现super-mini-vue

有的小伙伴可能有有点疑惑了。一百行实现?不是说开始从哪个模块开始学习吗?其实写一个和vue源码结构相同的mini-vue是比较难的。这里的难不是代码难,而是模块之间的依赖关系对于初学者来说是比较难理解的,所以用一个几百行就能完成的super-mini-vue是为了解各模块之间的依赖关系,从整体上出发。笔者当时学习源码时也是从这开始的。这里实现super-mini-vue的推荐两个高质量视频

上面这两个视频是全英文的,对于笔者这个拉跨英语是听不懂的,但是有中文字幕问题不大。(看字幕学习真的效率太慢了,笔者一个6分钟的视频学了30分钟左右)

这里给出视频中实现super-mini-vue的源码 源码地址

模块化方式的学习

如果你将上述super-mini-vue学习完了之后,一定对vue原理有了初步的认识。明白了什么是响应式数据,什么是渲染函数、什么是虚拟节点。那么就可以进行下一步了,对代码进行模块化的编写并实现,笔者使用的是monorepo同vue源码一样采用项目管理方式进行构建开发。以下这几个视频是采用的monorepo实现的mini-vue

上面的视频学习完成之后你会发现vue3原理其实挺简单的,但是有得人会问,为什么没有编译模块的教程?(白嫖还嫌!!)不过编译模块嘛还是能实现的,下面是详细视频教程。

这里再给大家推荐一本Vue.js官方团队成员霍春阳大佬写的一本关于vue3源码的书籍 《vue.js设计与实现》 ,这本书对vue3原理写的非常的详细,满满的干货可以去购买看看。笔者是边看这本书边看上方视频进行整合。

进攻vue3源码

到这个阶段我想你已经对vue3源码的结构、源码运行流程、模块间的配合已经很清楚了。由于知识断层已经补充完毕,接下来就可以深入研究vue3源码的细节,剩下的只能看自己的理解能力。

总结

最后在学习完成之后一定要记 反复反复再反复的看自己实现的mini-vue ,不然你就会发现你学了这个模块忘了那个模块,这样得不偿失。

以上便是我对学习vue3源码的一些见解,没有什么原理性的代码,只是提供给大家学习的思路。后续还会持续输出一些关于vue源码实现的文章,请各位小伙伴多多支持。由于笔者语言描述能力不是太强,上述文章有错误请多批评指正。

喜欢本次文章分享请点个赞吧!! 最后再附上笔者的 mini-vue3