字节一面,面试官问我Vue3源码,我说……

“哥,我面试字节挂了!”

小明哭丧着脸:“MD,太卷了!这 Vue3 刚转正没多久,面试官就问上我原理了,什么 reactivity 实现原理,proxy ,Vue3初始化的流程,编译优化,diff 算法的实现……直接一面就挂了!”

“面试问原理正常呀, 虽然 Vue3 刚转正,但已经发版很久了呀,你不会没关注吧? ”

小明抓了抓头发:“关注是关注了, 但源码看不懂呀 ,那一个 renderer.ts 文件就 2000 多行代码,这怎么看呀?”。

c69854fea5764b7ceeb43efe96485e55.png

“源码是难,但如果你想面大厂拿高工资,源码是绕不过的呀。面试官通过问你源码,一下子就能知道你是不是一个爱学习爱钻研的同学,还有呀,那 Vue3 项目那么大,处理的工程问题也要比我们平时做的项目复杂不知多少倍了,看看人家解决问题的思路和方式,也是非常受益的。“

“哥,源码重要性我知道,关键是看不懂……你那有没有好的 Vue3 源码学习资料呀 ,赶紧给老弟推荐推荐~”  

“你别说,还真让你赶上了,最近 github 上有一个库叫做 mini-vue , 用它来学习 Vue3 源码可以把难度降到最低。

“mini-vue 这个库主要特点是把 Vue3 源码中最核心的逻辑剥离出来,只留下核心逻辑而且带有详细的中文注释以及完善的输出,可以帮助你快速理解框架核心运行流程。”

6e0b11d1b551b3755b4f2cef0b9372b8.png

注释说明了逻辑处理的 case 是什么,非常清晰 

图片截取自mini-vue

“哇塞,还有中文注释呢,真是太贴心了,毕竟我这英文确实不咋地哈哈!”

“你再跑一下库的 example 看看, 就那个 helloworld ,然后看看控制台的输出。“

4d1bfdccbb2e7de3fb0b2aaf12c5b117.png

"这些输出是什么?等等, 难道说是程序执行的流程节点?"

“没错,就是程序执行的流程, 基于这个输出日志,你就能知道实例化一个组件的流程是什么了, 有助于你理解整个框架的执行流程, 先建立一个整体认知。”

“而且你看看输出的右侧,你可以直接点击跳转到对应的代码上,然后就可以开开心心打上断点,好好琢磨这代码的实现了。”

8b40e10e25c37f679dab2072c331bc42.png

“真是绝了, 怪不得这个库现在已经拿到 4.4k 的 star 了”

da10ea3d3513fb4b068162c63314ce9a.png

“还不只如此呢,再给你看个绝活,mini-vue 库里面的代码实现是和 Vue3 源码里面的实现保持高度一致的,比如说函数的命名吧,你看这个 diff 算法函数是 patchKeyedChildren 吧”

6e995b7ec9b2d2a1da6cc23669c7815b.png

当你看完简单版的实现后,想看看源码里面是如何实现的, 你只需要复制这个函数名,然后跑到 Vue3 里面搜索一下就可以了。

600c6653d2b15406ec9e43eee931b7ad.png

“我草,这个绝了,我看完简单版本之后,再去看源码的话,难度就降低很多了呀!

“哈哈哈,是的,这个其实也符合学习模型,如果你一上来就看特别复杂的,对你来讲就到了学习的恐慌区了,很多同学就是被吓的,一看代码量那么大,逻辑那么复杂,直接就放弃了。而学习 mini-vue 这个库就是简单模式,我再跟你说说 mini-vue 是基于什么思想做出来的吧  你以后也可以按照它的方式来实现你自己的 mini-react、mini-webpack、mini-rollup 。”

“真的是迫不及待了,哥你赶快坐下,我这就给你买罐红牛去,好好给我上一课~哈哈”

我喝了一口刚刚从冰箱拿出来的冰镇红牛,翘着二郎腿缓缓说道:“看你今天这么好学的份上,我再给你唠叨几句。像 Vue3 这么大的工程项目,它会做很多事,比如给开发环境下的用户良好的错误提示↓”

d1359f462c811273f151fd1ac2910f15.png

“你看这个,这里是在处理 HMR (热更新)↓”

804b3f3246e8364618e680d08162acfc.png

“而这些逻辑在你刚刚看源码的时候是不需要关心的,但是这部分的逻辑对于你这个新手来讲非常不好区分,我给你画个图你感受感受”

0357062892289ef1dc80cef67cb25786.png

“哈哈哈,哥你可真是灵魂画手呀,这尼玛画的这么抽象,不过我看明白了。你是指红色的方块是核心逻辑,而紫色的圆圈都是非核心的吧,比如错误提示和HMR

“哈哈哈,看来我的画功还是不错的,你一下就明白了,就是这个道理。而我们学习源码的时候第一步就是先摸清这个核心逻辑,这个也称之为 happy path, 相当于一棵大树的树干。把这个拿下后,后面我们就可以自己看了,代码逻辑里面无非就是处理各种各样的 edge case(边缘情况)。你有没有发现,其实这是对 Vue3 框架做了功能上的拆分。”

“我擦,又学到了,我已经感受到了,把 Vue3 整体拆分变小,然后这样难度就直线下降了,而我们再把 happy path 理解透彻,这一步学完之后再去理解那些 HMR 或者错误提示的逻辑,也会变得更简单。”

“对的,这个就是任务拆分的思想,你可以横着切,也可以纵着切,想怎么切就怎么切,如果从算法思想的角度来讲的话就是……”

“就是分而治之的思想!” 小明赶紧把他知道的名词抢先回答出来,生怕别人不知道他学过算法。

a1917780a1f0eb219dce292450dad1ff.png

“哎呀,可以呀小明,看来你算法学得不错嘛。所以这个 mini-vue 库对于想学习源码的同学来讲非常有意义,现在作者已经完成了三大模块的编写了。”

“噢?三大模块是啥?我这还真不知道”

“三大模块是指 reactivity(响应式模块)、runtime-core(运行时模块)、compiler(编译模块), Vue3 的核心就是这三大模块。现在 Vue3 的源码是采用 monorepo 的形式, 分了好多模块,不过对于你这初学者来讲,研究透三大模块就够你面试用了

"哦了哦了,我这就去把 mini-vue clone 下来好好学习学习,回头面试的时候争取搞定面试官!哥,那我学习 mini-vue 遇见问题的话可还得麻烦你呀,哈哈哈~"

“你可以直接加 mini-vue 作者的微信,我们都叫他大崔哥。有问题直接问他就好了嘛 ,我有问题也是直接问他, 关于 mini-vue 上的问题他会回答你的,放心好了”

e04e31905c9ffa54efd65450694ba918.png

↑扫码添加 mini-vue 作者 大崔哥 微信↑

"我这就赶紧加上大崔哥哈哈哈~开心"

"我再给你说件更开心的事。头几个月前,大崔哥基于他这个库出了一套视频课程,带着你一行一行写代码,最后带你实现一个你自己的 mini-vue,那可真是nb大了。因为学习编程其实主要是学习解决问题背后的思考过程。"

"我透个底,我能这么清楚 mini-vue 库,就是因为我跟着他的视频课程全部敲了一遍,给你看看我自己实现的 mini-vue ,这在面试的时候能给我加不少分呢。"

"哎呀,哥,你不厚道呀,有这么好的学习资料怎么不早和小弟我分享分享呀,吃独食呀你这是,赶紧给我介绍介绍"

3fcf5cf4677e3c88842b980251f56f29.png

"他这个课还真挺超出我预期的,你平时看到过写单元测试的项目吗?没有吧,更别提在讲课的时候用单元测试,大崔哥在讲课的时候会先写一个单元测试,然后再去写功能的实现,这还没有完,最后一步用重构手法来让代码变得可读性非常高"

"什么什么?这名词有点多呀,又是单元测试又是重构手法的,等等,如果我没记错的话,这应该叫做 TDD 吧?"

"小明这名词你懂得还真不少呢哈哈~就是 TDD ,我也是看完这个课才了解到的,他先写一个测试,就是为了告诉大家目标是什么, 然后写代码实现这一步也特别有讲究, 比如会使用 TPP 来做小步骤的拆分,先实现一个具体的逻辑,然后慢慢重构成通用的逻辑,让你看到逻辑逐渐成形的整个思考过程,最后一步再用重构手法,这个就是我之前推荐你看的《重构》这本书里面的技巧,大崔哥都融入在课程里了。"

ca2550563af25be72dd8445f771063ba.png

"这个就是你说的编程学习就是学习解决问题背后的思考过程吧? 那可真是太妙了, 我之前也买过一些课, 那些老师讲课时候直接把代码就敲到完美了,我还纳闷怎么老师都那么厉害,不需要思考的吗 ?"

"哈哈,是的,其实你看的那些课程老师的代码直接敲到完美,都是因为备课了。但是他们省略了最关键的,就是思考如何把代码变完美的这个过程, 大崔哥出的这个视频课倒是满足了我。"

"刚刚说的都是课程里面涉及的编程思想,除了这个,大崔哥还是一位 vim 党, 那敲代码的速度行如流水,看他敲代码真的是非常爽,这不我这几天也开始准备学习 vim 了嘛。" 我拿出了刚买的 hhkb,敲了敲空格键。

efb6322ea73554066c758586afd1832e.png

"哇塞,听你说的我都心动了,那他这个课程讲了多少 mini-vue 库里面的内容呀?"

"全部!可以实现一个同 mini-vue 一个级别库,三大模块全部都有,目前已经更新到 compiler 模块了,你自己瞅瞅"

上滑下方图片查看完整大纲

6da5d21ee181fd211a98695a3c32e79c.png

如果你想详细了解课程

扫码添加大崔哥微信

知无不言,言无不尽

▼ 

bc7be7aa8a827b757a7274d5628a01da.png

“还有大崔哥在讲双端 diff 算法的时候用了得有 15 个单元测试 case 来一点点驱动出逻辑实现,让我知其然也知其所以然。其实他用的还是拆分的思想,把大的任务拆分成小任务然后逐一击破,听起来非常爽!”

“当然了,用大崔哥的话就是‘只有手写一遍,才能真正的掌握源码’,这个观点我是非常认同的,如果你光看书的话,那只是走马观花而已,不自己思考一遍的话那你过几天就都忘了。并且一些细节自己实现出来也是非常有成就感的。”

"哈哈,我也想自己实现一遍,但是哥你说我这水平比较差的同学能不能实现出来呀?这个我比较担心呢!"

"这个你放心吧,大崔哥在课程里面一行代码都没有跳过,而且基于课程还整了一个 repo ,一节课对应一个 github commit ,你听完课如果想看看代码的话,找到对应的 git commit 就可以了,非常贴心。"

ce4340a3be41379251e936f83a5bc5bc.png

"哇塞,这个有点极客呀,是我喜欢的风格"

"哈哈,还有更极客的,大崔哥还把 github discussions 作为课程内容的沉淀,我们把自己实现的 mini-vue 库和平时基于课程总结的资料全部都写在这里,还有平时一些常见的问题也整理到这里了,大崔哥的理念就是用做开源的方式来做课程。"

9cce0b8110a14b3caf891cea72f45723.png

"用做开源的方式做课程,这个理念好棒呀,能看出大崔哥特别喜欢开源,技术倒是没问题了,不过他讲课水平怎么样?我之前买的某个平台的课程,内容是不错,不过讲师的讲课水平真的是……"

"这个你放心吧,大崔哥讲课特别有条理性,而且一点都不拖泥带水。他不仅技术强,而且之前在培训机构做了2年专业讲师,还服务过字节的青训营,现在是做自由职业独立讲师了,他的课程就是他的产品,不管是群里面的答疑还是对课程质量的把控上,要比我知道的培训机构都要负责的多。毕竟独立讲师没有雄厚的资金去打广告,主要是做产品口碑,名声砸了谁还会买他的课呢。"

7bc230a02e49b4c80aaca6d2343a77d6.png

"这是大崔哥的 b站,你可以先去听听他讲课的风格,跟你讲,全是干货,质量都要比一些付费的课程来的高, 上周我给大家分享的 webpack 实现原理就是我从他这偷学来的哈哈。 "

846e612792fdc7d0b5995418ddf25413.png

(大崔哥B站ID : 阿崔cxr,超多前端干货视频等你来看)

"还有呀,学员群里面的学习气氛特别好,大家一起抱团学习,你问问题的时候其他学员也都会帮你出主意。大崔哥也是全程在群里答疑,课后服务我是相当的满意了"

14e9d89f69e5a637829595176a771a13.png

"那我就放心了,是心动的感觉!我要冲了!!! 等等哥,这课那么有特色,会不会很贵呀,小弟我这钱包还是有点瘪的……"

"放心好了,这课程才几百块钱,在我看来可以学到那么多编程思想和 Vue3 源码级别的知识,是非常非常值的,群里已经有同学靠自己实现的 mini-vue 拿到阿里 offer 了。你想想几百块钱的课,换大厂的 offer ,你说这几百块钱贵不贵?投资自己的大脑永远都不会吃亏的。"

"大崔哥还把试听课放到了 B 站上,你可以先去听一听,有意思的是他一口气放了前5集视频,对课程内容是相当的自信呀"

扫码添加大崔哥

获取前5节试听课链接

e994e6c00030311f5b1e885e8e89a2be.png

"是,投资自己的大脑永远都不会吃亏!!!平时花钱充游戏买衣服的时候一点都不心疼, 我现在买知识心疼个什么劲,更别说这东西学好了还可以涨工资,哈哈哈,哥,我悟了~ 我这就和大崔哥要试听课链接的"

"这就对了,年轻人就该有此觉悟嘛, 学到本事去哪里都不怕。"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值