Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Vue原理】Vue源码阅读总结大会

【Vue原理】Vue源码阅读总结大会

原创
作者头像
神仙朱
修改于 2019-08-05 03:34:58
修改于 2019-08-05 03:34:58
8080
举报

专注 Vue 源码分享,为了方便大家理解,分为了白话版和 源码版,白话版可以轻松理解工作原理和设计思想,源码版可以更清楚内部操作和 Vue的美,喜欢我就关注我的公众号,好吧兄弟,不会让你失望的

阅读源码是需要很多的勇气的,特别是对这种 Vue 源码的框架,十分抽象,使用了好多设计模式,封装得十分精密。很难短时间内能看得明白。

而我显然也是做好了心里准备 和 知识准备啦

我老早就想攻破 Vue 源码 这座城堡

但是显然我当时还没有做好准备,我认为自己不可以贸然去看,不然自己烦,自己累,还难以收获

本篇文章算是一个简单地吹水,就是跟大家谈谈我的感想,没有什么知识含量,其实也有的。

阅读源码准备了什么

1、掌握 Vue 所有API

我把 Vue 的所有 API 都详细研究使用过了一遍,而且尽量在项目中都有使用,让自己有深一点的体会

而且我对着官方文档,一个个做了详细的笔记,而且联想过了使用场景。

2、JavaScript 扎实基础

幸好自己之前花了大力气去给自己打基础,让自己现在的 JavaScript 基础还算不错。

逼着自己把很多本 JavaScript 书都看完了,并且做了详细笔记。像是【 JavaScript易维护】【JavaScript性能 】,【JavaScript 高级程序设计】【巴菲特给股东的信】看了两遍,说不上精通,也算是还可以?

3、看完 JavaScript 设计模式

光是 JavaScript 设计模式 这本书 我就看了一年半,不能说自己把所有设计模式都掌握了,掌握了大部分吧,设计模式港真真的很有趣,不然我也不会决心学

在这里推荐 张容铭的 【JavaScript设计模式】,书讲得非常透彻和详细,我是从完全不懂开始看的

也经常使用一部分,我一直以设计模式为我的项目基构。就是 能用设计模式的地方,我都尽量使用设计模式。

设计模式看起来就像是 剑客 的剑谱,有招有式,连人家武侠剧发功的时候都知道 喊出 招式的名字... 降龙十八掌!!!!

野路子难登大雅之堂,主要是不好看啊,代码为了好维护,易扩展

4、学会调试

我很大胆地说,如果你不会调试,你看 Vue 源码,或者你会想死,你会出现这个场景...

MMP,这个方法是怎么跳到 那个方法的,那个方法和 这个方法又是怎么联系起来的?

也许你可以慢慢 使用 函数名字 去寻找,但是无疑你会多消耗几倍时间,而且你会更烦

使用调试真的方便,以前我也真的不喜欢调试,觉得好像很难???

更喜欢使用 console.log 去打印信息.....

是啊,我自己写项目的时候,我还是会使用 console.log 去调试.......

那是因为我自己代码,我知道怎么跑,你 看别人的代码,还是超级抽象的框架,使用 console.log 的方式.....

放心,相信我,你会掉很多头发.........

这里,我使用的是 VSCode 去调试,真的简单又方便,我当时也真的很难去让自己又要学一个东西

但是我咬咬牙,我还是学了,感谢自己......

我可以保证,你从不懂到掌握,只要不到十分钟,简直就是 现实版的 十分钟精通到入门

好吧,下面开始说,Vue 的简单总结。

Vue 源码的简短的总结

1、封装了很多常用的函数!

为了 复用 且 易维护

常用的类型判断、 类型转换 、数据格式转换(数组转对象).....

举些例子

代码语言:txt
AI代码解释
复制
function isObject(obj) {    return obj !== null && typeof obj === 'object'}
function isUndef(v) {    return v === undefined || v === null}
function isDef(v) {    return v !== undefined && v !== null}
function toString(val) {    
    return val == null ?    '' :    
    typeof val === 'object' ?    
    JSON.stringify(val, null, 2) :    String(val)
}
function toObject(arr) {    
    var res = {};    
    for (var i = 0; i < arr.length; i++) {        
        if (arr[i]) {
            extend(res, arr[i]);
        }
    }    return res
}
....

你说说不定过了几年,判断是否是一个对象,不再是 什么 typeof obj=="object"

如果没有封装,那岂不是所有代码涉及到的都要改一遍,且不说如果有很多个都变了.....那你就头大了

节点操作兼容函数

addClass ,removeClass,createElement,appendChild,removeChild

代码语言:txt
AI代码解释
复制
function addClass(el, cls) {    
    if (!cls || !(cls = cls.trim())) return
    if (el.classList) {        
        if (cls.indexOf(' ') > -1) {
            cls.split(/\s+/).forEach(function(c) { return el.classList.add(c); });
        } else {
            el.classList.add(cls);
        }

    } else {        
       var cur = " " + (el.getAttribute('class') || '') + " ";        
       if (cur.indexOf(' ' + cls + ' ') < 0) {
            el.setAttribute('class', (cur + cls).trim());
       }
    }
}
....

这些函数都很有用,所以我都记下来了,毕竟是 框架封装的,肯定是最完善的

2、真的用了很多设计模式

就我看到的设计模式就有

观察者模式、状态模式、节流模式、 参与者模式、备忘录模式、单例模式

装饰者模式、组合继承模式、链模式.........

我怀疑 Vue 把所有的设计模式都用完了.... 真的..... 如果你不懂设计模式

你真不会领悟到他这么写的精髓

我就选 Vue 常用的一个设计模式来讲

【参与者模式】

Vue 封装的很多函数都是用了 参与者模式,也可以叫做柯里化

先来简单解释下 参与者模式

1、保存第一次调用 传入参数

2、返回定制函数,函数内使用 参数

简单实现像这样

代码语言:txt
AI代码解释
复制
function add(a){    
    return function(b){ return a+b }
}
// 为了定制函数,把第一次调用时的参数闭包保存
add5 = add(5)var result  = add5(9)

看一下 Vue其中一个 使用柯里化 的封装函数

makeMap

创建 对象 map,返回函数,用于后面查找 某个东西是否存在 map 中

代码语言:txt
AI代码解释
复制
function makeMap( str,  expectsLowerCase ) {    
    var map = Object.create(null);   
    var list = str.split(',');    
    for (var i = 0; i < list.length; i++) {
        map[list[i]] = true;
    }    
    return expectsLowerCase ?        
        function(val) { return map[val.toLowerCase()]; } :        
        function(val) { return map[val]; }
}
        
// 应用
var isUnaryTag = makeMap(   
 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +  
 'link,meta,param,source,track,wbr');
 
// 查找 area 标签是否存在 上面保存过的 字符串中
isUnaryTag('area')
3、使用很多闭包!

据我看过的地方

1、解析组件模板 使用了闭包作为缓存,为了重复解析

2、cached 函数,一个专门使用闭包 为缓存的函数

3、上面所讲到 的 柯里化所有涉及的函数,makeMap,parthPath,

4、createPatchFunction 当属篇幅最大的使用闭包的函数了,把一堆函数作为闭包,然后返回 一个函数。他最大的作用是 比较更新DOM 节点

4、使用很多标志位

Vue 常用标志位来

1、表明是否已经做了某件事

_isMounted:dom 是否已经挂载

_isDestroyed :组件是否已经摧毁

pending:表明更新回调的 setTimeout 已经执行

waiting:是否已经初始化更新队列,在等待新的成员进入对垒

flushing:更新队列是否已经开始逐个更新成员

......

2、指明当前东西的身份

isStatic:是否是静态节点

isComment:是否是注释节点

isCloned:是否是克隆节点

isOnce:是否有v-once 指令(如果有当前指令,会跳过编译)

_isComponent:是否是组件

.....

多用标志位,控制流程,替代多余的判断(直接判断标志位来确认身份,不用做太多的判断),减少开销

上面那些变量,大家没看源码,可能有些懵逼,没关系,就当先知道有这个东西就好了

Vue 源码分几步走

我给自己定的任务是 分为两个部分

Vue 的主体内容

1、依赖收集

2、依赖更新

3、Virtual DOM ,dom 节点 生成虚拟Vnode 节点

4、Compile, 模板编译

5、Diff、Patch, 节点比较更新

6、NextTick ,延迟执行回调

7、Render, 渲染机制

8、LifeCircle ,生命周期

9、Model ,双向绑定

10、Event ,事件机制

Vue 组件选项

1、computed

2、filter

3、mixin

4、directive

5、slot

6、props

7、watch

我就大约以这些为我的学习目标进行 源码阅读的,每一块都是一个非常大的内容,每一块内容都不是几天能看完的,有时候还需要一点灵感。当然还有很多内容,但是我的目标也并不是全部,一字不漏读完,我要的是他的精髓即可,或许等我掌握了这些,再去开发其他的内容,这样或许更简单

反正我始终提醒自己不要焦躁,因为这个东西真的是急不来,长期以往,不要妄想一步登天,一开始总会很难,但是久了也一样很难,哈哈哈哈哈

如果你有兴趣也读源码,我们可以一起讨论学习....

最后

源码我也没有看完,看了大概四个月,脑子涨得很,也就大概看了 百分之六七十吧,剩下一些打算慢慢看,真的装不下了.....

而我也打算自己出一个Vue 源码系列,算是把自己的阅读心得再二次总结如果你也有兴趣跟我一起阅读源码,就加入我吧,关注我的公众号哦,文章排版会好看很多

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初学者也能看懂的 Vue3 源码中那些实用的基础工具函数
写相对很难的源码,耗费了自己的时间和精力,也没收获多少阅读点赞,其实是一件挺受打击的事情。从阅读量和读者受益方面来看,不能促进作者持续输出文章。
若川
2021/09/07
8650
从Vue.js源码中我学到的几个实用函数
如果想看Vuejs源码,不知道如何下手,一般推荐配置Sourcemap,针对单个问题调试来看,如何调试Vuejs源码,我的vuex源码文章中写了。
若川
2021/04/23
2.6K0
从Vue.js源码中我学到的几个实用函数
Vue 源码解析 (二)initProxy 初始化代理
上面例子直接在魔板中使用 msg 变量,但是他没有在 data 中定义,此时 warnNonPresent 会处理抛出警告如图所示
公众号---人生代码
2021/05/08
8700
学习尤雨溪写的 Vue3 源码中的简单工具函数
粗略阅读了川哥的文章之后,感觉这期跟上一期不一样。上一期主要学习如何实现某个功能,而这一期主要是学习 Vue3 源码中的工具函数,以及 Vue3 源码的一些调试技巧。虽然看起来偏基础,但我觉得很考验一个程序员的基本功和耐心。
若川
2021/09/07
1.2K0
初学者也能看懂的 Vue2 源码中那些实用的基础工具函数
想学源码,极力推荐之前我写的《学习源码整体架构系列》 包含jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、vue-next-release、vue-this、create-vue、玩具vite等10余篇源码文章。
若川
2021/11/10
9810
vue源码中值得学习的方法
作者:chinamasters https://segmentfault.com/a/1190000025157159
桃翁
2020/10/23
7360
vue源码中值得学习的方法
【源码共读】Vue2工具函数
点击在线地址查看,会发现该文件实际上有很多函数。实际上就是Vue2的工具函数库。下面就来简单学习一下。因为源码用的是ts,理解起来可能会加点成本,所以下面讲解会把类型部分去掉(其实是本人的ts水平不高,很难很好的解释)
赤蓝紫
2023/03/06
8580
【源码共读】Vue2工具函数
初学者也能看懂的 Vue3 源码中那些实用的基础工具函数
我们也可以通过ts文件,查看使用函数的位置。同时在VSCode运行调试JS代码,我们比较推荐韩老师写的code runner插件。
用户7108768
2021/09/19
4390
Vue底层判断标签的性能优化方法
在vue中,如果写div、span等正常的html标签,vue会解析成传统的html标签,但当写不是这些标签的时候,vue会认为他是一个组件,例如:。是如何做到这种判断的呢,首先自己来实现一个这样的判断
骤雨重山
2023/04/27
2560
Vue0.11版本源码阅读系列六:过渡原理
可以看到也是通过指令的方式,这个版本只有支持两个类,一个是进入的时候添加的v-enter,另一个是离开时候添加的v-leave。
街角小林
2022/03/21
5320
Vue 源码解析之工具方法
检测是否是正则表达式 export function isRegExp (v) { return _toString.call(v) === '[object RegExp]' }
公众号---人生代码
2021/03/16
4150
结合Vue案例梳理前端设计模式
设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。它是为了可重用代码,让代码更容易的被他人理解并保证代码的可靠性。
@超人
2023/05/12
5840
结合Vue案例梳理前端设计模式
写给小白(自己)的vue3源码导读!
目前社区有很多 Vue3 的源码解析文章,但是质量层次不齐,不够系统和全面,总是一个知识点一个知识点的解读,这样我在拜读中,会出现断层,无法将整个vue3的知识体系融合,于是只能自己操刀来了
用户7413032
2022/03/24
1.4K0
写给小白(自己)的vue3源码导读!
Vue(v2.6.11)万行源码生啃,就硬刚!
众所周知,以下代码就是 vue 的一种直接上手方式。通过 cdn 可以在线打开 vue.js。一个文件,一万行源码,是万千开发者赖以生存的利器,它究竟做了什么?让人品味。
掘金安东尼
2024/01/27
4230
Vue(v2.6.11)万行源码生啃,就硬刚!
Vue源码阅读 - 文件结构与运行机制
vue已是目前国内前端web端三分天下之一,同时也作为本人主要技术栈之一,在日常使用中知其然也好奇着所以然,另外最近的社区涌现了一大票vue源码阅读类的文章,在下借这个机会从大家的文章和讨论中汲取了一些营养,同时对一些阅读源码时的想法进行总结,出产一些文章,作为自己思考的总结,本人水平有限,欢迎留言讨论~
前端下午茶
2018/10/22
5290
Vue源码阅读 - 文件结构与运行机制
Vue3源码阅读笔记之数据响应式
总结:Vue3中的数据响应式实现是一个较为独立的实现,适合单独分析学习哈。上文是删除了部分支线逻辑的版本,只保留了主线逻辑,大家如果想看完整的实现,还是建议去读源码哦。
wanyicheng
2021/04/12
7620
你可能不需要 jQuery!使用原生 JavaScript 进行开发
  很多的 JavaScript 开发人员,包括我在内,都很喜欢 jQuery。因为它的简单,因为它有很多丰富的插件可供使用,和其它优秀的工具一样,jQuery 让我们开发人员能够更轻松的开发网站和 Web 应用。
跟着阿笨一起玩NET
2018/09/19
1.2K0
你可能不需要 jQuery!使用原生 JavaScript 进行开发
剖析Vue原理&实现双向绑定MVVM
本文能帮你做什么? 1、了解vue的双向数据绑定原理以及核心代码模块 2、缓解好奇心的同时了解如何实现双向绑定 为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简化改造,相对较简陋,并未考虑到数组的处理、数据的循环依赖等,也难免存在一些问题,欢迎大家指正。不过这些并不会影响大家的阅读和理解,相信看完本文后对大家在阅读vue源码的时候会更有帮助 本文所有相关代码均在github上面可找到 https://github.com/DMQ/mvvm 相信大家对mvvm双向绑定应该都不陌生了,一言不
小时光
2018/01/29
3.2K0
Vue0.11版本源码阅读系列三:指令编译
因为vue指令很多,功能也很多,所以会有很多针对一些情况的特殊处理,这些逻辑如果不是对vue很熟悉的话一时间是看不懂的,所以我们只看一些基本逻辑。
街角小林
2022/03/21
1.2K0
Vue0.11版本源码阅读系列三:指令编译
【Vue原理】依赖收集 - 源码版之引用数据类型
这一篇内容是针对 引用数据类型的数据的 依赖收集分析,因为引用类型数据要复杂些,必须分开写
神仙朱
2019/08/02
5890
【Vue原理】依赖收集 - 源码版之引用数据类型
推荐阅读
相关推荐
初学者也能看懂的 Vue3 源码中那些实用的基础工具函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档