当前位置: 首页 > news >正文

Vue3源码调试-第二篇

前言

上篇我们见到一个很厉害的方法,这篇我们来看看

baseCreateRenderer

首先,方法太多了,我也不一个一个数有多少个了,因为我们着重使用createApp方法,那么我们就跟着代码走,用到哪个方法就分析哪个方法

1. 方法重载

上篇漏看了个东西,这里有个ts的函数重载

就是他可以接受不同类型,数量的参数,但是这些重载只是声明了不同参数的类型,数量,但不具体实现,只有最下边那个2000多行的要实现,并且要对所有重载都有具体的实现,我也是半桶水,大家懂的可以评论区补充,这里我就不误人子弟了哈哈

2. createApp: createAppAPI(render, hydrate)  

上篇我们看到Return里面有返回createApp方法,这里我们直接来看看

createAppAPI很着急,直接就是调用了起来,那必然 CreateAPP是createAPPAPI方法的return,render和hydrate作为参数传入,那我们也要看看他俩是个啥

1. render

render是个小小方法,由于暂时没有调用到,这里不做具体分析,因为暂时没有太多信息能让我看懂这个方法,所以先不纠结

2. hydrate

hydrate是个变量,他的类型是一个方法,完了还带个[0],没看懂

这里也不纠结,继续往下走

3. createAppAPI

createAppAPI在另一个文件packages/runtime-core/src/apiCreateApp.ts

而且他貌似也不干活,他return了一个createApp方法出来

 那就是,如果要程序继续下去,这个方法得调用它,我们回顾到上一篇的createApp,仔细一看,是有调用的!还给了参数

那就就可以继续往下走

createApp

到这里有点懵,那两个参数rootComponent, rootProps是哪里提供的,来打个断点看看

经过我一波调试+打印,原来rootComponent就是我们在html的配置

好,既然都已经用到这些参数了,那就说明事情已经逐步进入正轨啊哈哈哈

接着上上张图,我们看到有个叫做!isFunction的判断,isFunction的代码在此

export const isFunction = (val: unknown): val is Function =>typeof val === 'function'

那我们传入的参数是个obj,显然不是个方法,因此会进入这个if

这里就是,如果是个对象,就需要对传入的对象进行一个浅拷贝,妙蛙,那在这个方法内对rootComponent下的所有属性进行操作时,都不会影响到用户的初始配置,但是引用类型还是会有影响,毕竟不是深拷贝,目前只能这么推断,只能继续往下看

接下来是一个if判断,rootProps != null 并且 rootProps不是一个对象,就会进入这个if,但这里我们的rootProps是null,因此不会进入

再往下,是一些赋值操作

再再往下,给app给了个方法,然后有个__CPMPAT__变量,我在这个页面没找到,但是全局很多地方都有,在dev.js和config都能看见,输出结果是false,所以没有进入这个if

接着,我在全局搜索了这个变量,在许多地方都用了这个变量,但是基本上就是找不到在哪里定义的,直到在一个dev.js的文件找到了

 我尝试修改他的值,再重新打包调试,发现__COMPAT__的值会因为这里的修改而发生改变,因此只能暂定是这里定义的,然后不深究,继续往下调试

接着,createApp返回了一个app变量,也就是在上面的那个app,这里再回顾一下,因为刚才没细看

可以看出很多熟悉的方法:use、mixin、component、directive、mout、onUnmout、unmount...

接着,又返回到index.ts这里了,我们的app终于获取到值了,真是山路十八弯啊,太曲折了 

这里可以简单概括下,因为有点跳

[createApp] (todomvc.html)  ↓

[createApp] (index.ts)  ↓           ←

[ensureRenderer] (index.ts)  ↓         ↖

[createRenderer] (renderer.ts)  ↓          ↑

[baseCreateRenderer] (renderer.ts)  ↓  ↑

[createAppAPI] (apiCreateApp.ts)  ↓      ↑

[createApp] (apiCreateApp.ts)   →          ↑

目前,跟着调试走的话,baseCreateRenderer方法就只能解释到这里了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 跨界融合:Scratch与硬件的创新集成
  • 网站上线3个多月了,还没有被百度收录怎么办?
  • 配置PXE预启动执行环境:Kickstart自动化无人值守安装
  • 玉米病害-目标检测数据集(包括VOC格式、YOLO格式)
  • ArrayList与顺序表
  • 基于Vue3和Node.js的完整增删改查项目实现教程:从后端封装到前端调用
  • 【Go - 每日一小问: 对未初始化的的 chan 进行读写,会怎么样?为什么?】
  • Android笔试面试题AI答之Kotlin常见考点总结
  • 【Android】Navigation动态设置Graph和Launch参数
  • Qt详解QPropertyAnimation创建属性动画
  • SQLserver中的日期时间
  • 牛津大学发布首篇《Transformer多模态学习》综述论文,23页pdf涵盖310篇文献全面阐述MMT的理论与应用
  • 智能废弃瓶子垃圾箱:城市环境的绿色守护者
  • javascript语句之switch
  • 鸿蒙(API 12 Beta3版)【使用ImagePacker完成图片编码】图片开发指导
  • 【知识碎片】第三方登录弹窗效果
  • 2017-08-04 前端日报
  • 4. 路由到控制器 - Laravel从零开始教程
  • CSS盒模型深入
  • ES6语法详解(一)
  • flask接收请求并推入栈
  • HashMap ConcurrentHashMap
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java方法详解
  • java中的hashCode
  • Laravel 菜鸟晋级之路
  • mockjs让前端开发独立于后端
  • Python - 闭包Closure
  • SpingCloudBus整合RabbitMQ
  • web标准化(下)
  • 多线程事务回滚
  • 技术发展面试
  • 利用jquery编写加法运算验证码
  • 区块链将重新定义世界
  • 学习ES6 变量的解构赋值
  • 一份游戏开发学习路线
  • 因为阿里,他们成了“杭漂”
  • 2017年360最后一道编程题
  • MyCAT水平分库
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define用法
  • (1)Hilt的基本概念和使用
  • (1)STL算法之遍历容器
  • (2)空速传感器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Java)【深基9.例1】选举学生会
  • (二)c52学习之旅-简单了解单片机
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二十三)Flask之高频面试点
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)kafka实战——kafka源码编译启动
  • ***检测工具之RKHunter AIDE
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .java 9 找不到符号_java找不到符号