前往小程序,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
Java廖志伟
2022/03/07
7710
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
​SpringBoot连接多RabbitMQ源
在实际开发中,很多场景需要异步处理,这时就需要用到RabbitMQ,而且随着场景的增多程序可能需要连接多个RabbitMQ。SpringBoot本身提供了默认的配置可以快速配置连接RabbitMQ,但是只能连接一个RabbitMQ,当需要连接多个RabbitMQ时,默认的配置就不太适用了,需要单独编写每个连接。
java之旅
2020/01/07
3K0
手把手带你Springboot整合RabbitMq ,一篇讲完
该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。(但是关于rabbitMq的安装,就不介绍了)
java进阶架构师
2020/06/16
1.7K0
手把手带你Springboot整合RabbitMq ,一篇讲完
RabbitMQ延迟消费和重复消费
转载自 https://blog.csdn.net/quliuwuyiz/article/details/79301054
allsmallpig
2021/02/25
2.4K0
RabbitMQ学习笔记(七)——RabbitMQ分布式事务框架
◆ ACID往往针对传统本地事务,分布式事务无法满足原子性和隔离性,需要舍弃传统ACID理论 ◆ 基于BASE理论,业务状态不需要在微服务系统内强一致 ◆ 基于BASE理论,订单状态要做到最终一致性即可 ◆ 为了做到最终一致性, 要保证消息不丢失,发送处理的流程要有重试机制,重试多次失败后要有告警
不愿意做鱼的小鲸鱼
2022/09/26
1.1K0
RabbitMQ学习笔记(七)——RabbitMQ分布式事务框架
【Rabbitmq篇】RabbitMQ⾼级特性----持久性,发送⽅确认,重试机制
RabbitMQ 的持久化是确保消息在服务器重启或意外故障后不会丢失的重要特性。它主要涉及到交换机(Exchange)、队列(Queue)和消息(Message)三个层面的持久化。
用户11369558
2024/11/25
1.4K0
【Rabbitmq篇】RabbitMQ⾼级特性----持久性,发送⽅确认,重试机制
RabbitMQ高级特性之延迟队列
很多时候我们想定时去做某件事情的时候我们会首先想到定时任务,quartz是个不错的选择,但是也有缺点,假如配置在项目中,集群部署会有重复执行的问题,如果持久化在mysql中,解决了集群的问题,但是过于依赖mysql,耦合严重,当然还有日志量庞大、执行时间精度、过于耗费系统资源等等问题。所以这时候使用消息队列中间件的的延时队列就是一个很好得解决方案,我们设置要触发消费的时间和必要的参数入队mq,到时监听queue的消费者自然拿到消息然后去走业务流程,这里介绍的是基于rabbitmq中间件实现的TTL版的延时队列。
黎明大大
2021/03/25
1.2K0
RabbitMQ高级特性之延迟队列
RabbitMQ学习笔记(四)——RabbitMQ与SpringBoot适配
◆ 异步消息监听容器 ◆ 原生提供RabbitTemplate,方便收发消息 ◆ 原生提供RabbitAdmin,方便队列、交换机声明 ◆ Spring Boot Config原生支持RabbitMQ
不愿意做鱼的小鲸鱼
2022/09/26
1.6K0
RabbitMQ学习笔记(四)——RabbitMQ与SpringBoot适配
RabbitMQ高级特性:死信队列
死信队列,英文缩写DLX,Dead Letter Exchange(死信交换机),当消息成为Dead message(消息过期)后,可以被重新发送到另一个交换机,这个交换机就算是DLX,其实死信交换机(队列)和正常交换机(队列)没有什么区别
科技新语
2023/04/07
2.7K0
一文搞懂Spring-AMQP
12//设置消息发送ack,默认noneconnectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);
爱撒谎的男孩
2020/03/11
1.2K0
近九万字的RabbitMQ图文详解
RabbitMQ 简介:RabbitMQ 基于 AMQP 标准,采用 Erlang 语言开发的消息中间件。
Java廖志伟
2022/03/07
1.1K0
近九万字的RabbitMQ图文详解
RabbitMQ 超详细入门篇
本人使用的是 阿里云服务器 没有的话也可以使用虚拟机… 事先使用连接工具上传了文件
Java_慈祥
2024/08/06
2.6K0
RabbitMQ 超详细入门篇
Rabbitmq延迟队列实现定时任务
开发中经常需要用到定时任务,对于商城来说,定时任务尤其多,比如优惠券定时过期、订单定时关闭、微信支付2小时未支付关闭订单等等,都需要用到定时任务,但是定时任务本身有一个问题,一般来说我们都是通过定时轮询查询数据库来判断是否有任务需要执行,也就是说不管怎么样,我们需要先查询数据库,而且有些任务对时间准确要求比较高的,需要每秒查询一次,对于系统小倒是无所谓,如果系统本身就大而且数据也多的情况下,这就不大现实了,所以需要其他方式的,当然实现的方式有多种多样的,比如Redis实现定时队列、基于优先级队列的JDK延迟队列、时间轮等。因为我们项目中本身就使用到了Rabbitmq,所以基于方便开发和维护的原则,我们使用了Rabbitmq延迟队列来实现定时任务,不知道rabbitmq是什么的和不知道springboot怎么集成Rabbitmq的可以查看我之前的文章Spring boot集成RabbitMQ
搜云库技术团队
2019/10/18
3.5K0
RabbitMQ消息队列入门及解决常见问题
两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。
不吃紫菜
2023/02/13
2.2K0
RabbitMQ消息队列入门及解决常见问题
超详细的RabbitMQ入门
消息指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。
java技术爱好者
2020/09/22
6130
超详细的RabbitMQ入门
Rabbit 高级操作
过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了时间之后消息将自动被删除。
张小驰出没
2021/12/06
4020
Rabbit 高级操作
高性能消息队列中间件MQ_part2
之前我们使用原生JAVA操作RabbitMQ较为繁琐,接下来我们使用SpringBoot整合RabbitMQ,简化代码编写。
天天Lotay
2023/02/16
4580
高性能消息队列中间件MQ_part2
RabbitMQ之消息可靠性问题(含Demo工程)
https://gitee.com/boring-yingjie/rabbit-mq-message-confirmation.git
叫我阿杰好了
2022/11/07
7920
RabbitMQ之消息可靠性问题(含Demo工程)
SpringBoot 整合 RabbitMQ 实现消息可靠传输
生产阶段通过请求确认机制,来确保消息的可靠传输。当发送消息到 RabbitMQ 服务器 之后,RabbitMQ 收到消息之后,给发送返回一个请求确认,表示RabbitMQ 服务器已成功的接收到了消息。
用户10384376
2023/02/26
3790
SpringBoot 整合 RabbitMQ 实现消息可靠传输
RabbitMQ 学习笔记3 - Java 使用 RabbitMQ 示例
本节讲述 Java 使用 RabbitMQ 的示例,和 发送者确认回调,消费者回执的内容。
张云飞Vir
2021/07/23
8150
推荐阅读
相关推荐
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档