Vue3源码调试-第一篇

news2024/9/22 15:33:07

前言

相信大家在前端从业生涯中都会被问到过,有了解过Vue源码吗?我是没有的,所以今天就来读好吧,浅浅读一下,顺便记录一下。

那究竟怎么读,从哪里读,我就不啰嗦了,直接给大家一个链接,这篇文章给了大家一个方向,可以理解为项目前期的环境部署吧

如何调试Vue3源码? - CherishTheYouth - 博客园 (cnblogs.com)

那岂不是,直接看这里就好了?没必要把文章写下去了?当然不是,下面,我将根据文章给的exmaple页面(todomvc.html),一步一步调试,揭开Vue的奥秘!

开始

因为Vue项目太大了,我觉得直接硬着头皮看有点太干了,也看不懂,变量引用来引用去的,还全是英文,真的很难,除非是看视频,但是我看了几个视频,也是东一处西一处的,那只能自己调试领悟的才更深刻 

Debugger

开局映入眼帘的就是一个经典的ES6对象解构,写过vue的朋友应该都用过这些方法,那我们现在的目的就是了解他们的底层

因此直接一手debugger,然后交给浏览器

 然后,我们跟着调试,点击步骤(F9),右侧还能清晰的看到当前debugger到的作用于的变量值

1. createApp

连续点击了几个步骤,来到了createApp,很熟悉,这里是创建vue的地方 

我们继续往下

 来到这里,要加个debugger,不然一下就跳过去了,浏览器给我跳到了另一个文件(packages/runtime-dom/src/index.ts)

再继续往下

1. ensureRenderer

 来到一个ensureRenderer()的方法,根据上一张图片以及这张图片,我们能推断出,这个方法会返回一个对象,然后这个对象再继续调用createApp的方法

const app = ensureRenderer().createApp(...args)

然后捏 vue啥也不说,直接return一个renderder出来

// 此部分代码和上一张调试的图片一样

const rendererOptions = /*#__PURE__*/ extend({ patchProp }, nodeOps)

// lazy create the renderer - this makes core renderer logic tree-shakable
// in case the user only imports reactivity utilities from Vue.
let renderer: Renderer<Element | ShadowRoot> | HydrationRenderer

let enabledHydration = false

function ensureRenderer() {
  // eslint-disable-next-line no-console
  console.log(rendererOptions)
  return (
    renderer ||
    (renderer = createRenderer<Node, Element | ShadowRoot>(rendererOptions))
  )
}

那么,在初始阶段,renderer只是声明了,但是并未赋值,所以是undefiend,那么必然会执行createRedenrer()这个方法,并重新赋值给renderer

1. createRedenrer
【rendererOptions】

这里还给了个rendererOptions的参数,我不知道他是哪里来的,很好奇,就加了个打印

但其实,我们也能从上面的代码看到,rendererOptions是这里声明的

const rendererOptions = /*#__PURE__*/ extend({ patchProp }, nodeOps)

好啊好啊,extend的又是啥,patchProp又是啥,nodeOps又又是啥

【rendererOptions】 extend

直接ctrl+点击,我们找到了这个位于shared/general.ts下的extend,好家伙,原来他就是Object.assign,只是换了个名字,一般我们会在浅拷贝这里用到这个方法

【rendererOptions】 patchProp、nodeOps

这俩兄弟都是直接引入的,patchProp是一个方法,nodeOps是个对象,有一大堆属性和方法

那么,结合控制台以及extend的乔装术,我可以推断,rendererOptions就是把patchProps和nodeOps的属性及方法融合到一起了,可以进入下一关!

2. baseCreateRenderer

createRenderer来自于packages/runtime-core/src/renderer.ts,莫非他就是负责渲染工作的,失敬失敬,只见他又要调用别的方法,这一瞬间,我慌了神!

在同个文件夹下,我找到了这个方法,小小折叠了一下代码,千百来行,可以看出这是一个很多代码的方法

看一下这个方法的return,有createApp,在方法里是叫createAppAPI,我们前面打断点的地方就是需要这个返回值才能进行下一步的操作,因此,这个baseCreateRenderer我愿封他为神

 

这个方法里面还有许多的内部方法,也就是八股文经常问的闭包,失敬失敬,我看这篇文章就先到这里收尾,下篇文章在来着重看看这个baseCreateRenderer方法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python dash框架 油气田可视化软件设计文档

V1.1:机器学习框架(神经网络) 时间范围优化 表格布局优化 添加前端设计元素布局 V1.0&#xff1a;基础布局和对应计算函数 要求 首先第一部分是通过神经网络预测天然气流量&#xff0c;其中输入开始时间和截止时间是为了显示这一段时间内的天然气流量预测结果 第二部分&…

小型空气净化器可以除猫毛吗?宠物空气净化器评测推荐

前段时间我有个病人&#xff0c;诊断出来肺结节&#xff0c;他第一反应就是说他家养着好几只猫&#xff0c;会不会是吸入宠物毛发导致的肺结节。有些结节确实跟宠物有关系&#xff0c;如果是对毛发过敏、或者是对排泄物过敏&#xff0c;养宠物就会增加患结节的概率。不过就算是…

推荐一款AI智能编程助手CodeGeeX

最近&#xff0c;使用了一款AI智能编程助手CodeGeeX&#xff0c;感觉还不错&#xff0c;推荐给大家。 官网地址&#xff1a;https://codegeex.cn/ 一、安装教程 IDEA中安装插件&#xff1a;https://codegeex.cn/downloadGuide#idea VSCode中安装插件&#xff1a;https://codege…

八股(5)——数据库

八股&#xff08;5&#xff09;——数据库 4.1 数据库基础什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性&#xff1f;主键和外键有什么区别?为什么不推荐使用外键与级联&#xff1f;什么是 ER 图&#xff1…

TD学习笔记————中级教程总结(中)

目录 四、生成艺术 问题: CHOP TO放置后直接报错 附着不上线 五、Python Lists 与 Python Dictionaries 问题: 使用for的格式要求 显示numRows错误 List中表格定义报错 六、Replicate 与 Instance 问题: 传递处理好的噪音后不变化 Renderpass区分线和字时不起作用…

安科瑞智能物联网关:重塑能源管理新纪元,远程智控尽在“掌”握

在数字化转型浪潮中&#xff0c;能源管理与工业自动化领域正经历着前所未有的变革。安科瑞智能物联网关-智能通信管理机不仅重新定义了智能监控与保护装置的通信管理模式&#xff0c;更为能源数据采集与远程控制提供了前所未有的高效解决方案。 安科瑞智能物联网关&#xff0c…

qt开发环境搭建Qt Creator并创建Demo项目

一 Qt Creator工具下载&#xff1a;工具下载链接&#xff1a; Index of /archive/online_installers/4.8 (qt.io) 下载后点击安装&#xff0c;没有账号得先注册一个账号&#xff0c;如下图&#xff0c;然后点击下一步 随便填点&#xff0c;我填"abc"&#xff0c;然…

Unity读取Android本地图片

unity读取Android本地图片 一、安卓读取路径 安卓路径&#xff1a;“file:///storage/emulated/0/”自己图片的路径 例&#xff1a;“file:///storage/emulated/0/small.jpg” 二、unity搭建 使用UI简单搭个界面 三、新建一个脚本 代码内容如下 using System.Collectio…

Android自定义简单TextView

自定义属性 <declare-styleable name"TextView"><!--name 属性名称format 格式&#xff1a;string 文字 color颜色dimension 宽高 字体大小 integer数字reference 资源引用(drawable)--><attr name"YiRanText" format"string"/&…

Sora:视频生成模型

​2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型 Sora: openai.com/sora Sora的能力 Sora是生成视频为主要能力的模型&#xff0c;能够&#xff1a; 1. 文/图生成视频 openai sora文生视频案例&#xff1a; Prompt: Historical footage of…

自动化立体仓库设施及设备:汇总总结

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是关于自动化立体仓库的详细介绍&#xff0c;包括其分类、系统组成、基本设施…

SylixOS 网卡混杂模式和组播模式

基本概念 混杂模式&#xff1a; Promiscuous mode&#xff0c;是电脑网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流&#xff0c;而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下&#xff0c;此时网卡只接受来自网络端口的目的地址指向自己的…

《征服数据结构》LRU缓存

摘要&#xff1a; 1&#xff0c;LRU的介绍 2&#xff0c;LRU元素的添加 3&#xff0c;LRU元素的读取 4&#xff0c;LRU完整代码实现 1&#xff0c;LRU的介绍 LRU(Least Recently Used)最近最少使用&#xff0c;它是一种缓存淘汰策略。也就是说在缓存容量满的时候&#xff0c;我…

vue2 part2

数据代理 通过defineProperty里面传入obj2和x&#xff0c;然后get和set下读取接收下然后再接收set中给对象x用value接收下&#xff0c;这样就能两个数据读取和接收了 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>何…

printk 操作等级:修改系统日志等级

这是系统日志的等级&#xff0c;在kern_levels.h文件里面 这是printk 函数前面部分先消息等级&#xff0c;中间部分就是&#xff0c;应用层调的printf的格式化字&#xff0c;后面部分就是可变参数 所以信息的等级大于终端的等级才会被打印&#xff0c;命令&#xff0c;cat /pro…

远程连接vscode无法转到定义

遇到用vscode打开远程服务器运行代码的过程中&#xff0c;无法利用插件跳转到定义&#xff08;ctrl鼠标左键///或者F12&#xff09; 问题可能出在两个地方&#xff0c;一个是插件&#xff0c;找到python插件 点击扩展设置&#xff0c;找到language server设置 这里选中pylance…

springboot调用sap接口传输数据,RFC协议接口调用,包含linux,windows部署

背景&#xff1a;我这边需要将一串数组写入到sap系统中&#xff0c;原本希望sap能提供rest形式接口&#xff0c;可惜sap开发那边说sap对外都是rfc接口&#xff0c;现在记录一下sap接口对接&#xff0c;给其他小伙伴提供点经验。 1、首先必须有对应的原料&#xff0c;驱动jar包…

Web应用服务器Tomcat

一、tomcat Tomcat是Java语言开发的&#xff0c;Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat属于轻量级应用服务器&#xff0c;在中小型系统和并发…

【微信小程序】自定义组件 - 数据监听器

1. 什么是数据监听器 2. 数据监听器的基本用法 组件的 UI 结构如下&#xff1a; 组件的 .js 文件代码如下&#xff1a; 3. 监听对象属性的变化 数据监听器 - 案例 案例效果 2. 渲染 UI 结构 3. 定义 button 的事件处理函数 4. 监听对象中指定属性的变化 5. 监听对象中所…

Vite + Vue 3 项目中实现路由自动化完整步骤。

下面是从创建项目到实现路由自动化的完整步骤 在 Vite Vue 3 项目中实现路由自动化可以通过使用文件系统路由生成器来简化路由管理过程。以下是实现路由自动化的完整步骤&#xff1a; 1.创建 Vite Vue 3 项目 如果你还没有一个 Vite Vue 3 项目&#xff0c;可以使用以下命令…