Vue3源码梳理:源码目录结构及源码阅读方法

VUE3 源码目录结构

1 ) 下载源码三种方式

  • 方式1,Download ZIP,不推荐
  • 方式2,通过https,或ssh或github cli来克隆项目
    • $ git clone https://github.com/vuejs/core.git
    • $ git clone git@github.com:vuejs/core.git
  • 方式3,点击Fork, 到自己仓库,再执行上面两步的方式下载

2 )源码目录解析

  • tsconfig.json ts 配置文件
  • rollup.config.js rollup 配置文件
  • packages
    • compiler-core: 编译器的核心库
    • compiler-dom: 编译器浏览器相关
    • compiler-ssr: 服务端渲染的编译模块
    • compiler-sfc: .vue组件的编译模块
    • reactivity: 响应性的核心模块
    • reactivity-transform: 已过期的模块,无需过于关注
    • runtime-core: 运行时核心库,内部针对不同平台进行实现
    • runtime-dom:基于浏览器的运行时
    • runtime-test:测试用的
    • server-renderer:服务端渲染库
    • sfc-playground:sfc 工具,暂时无需关注,参考:https://sfc.vuejs.org
    • shared: 存放共享工具方法等
    • size-check: 运行时包大小的检查库,暂无需关注
    • template-explorer: 提供的线上测试,暂无需关注,https://template-explorer.vuejs.org, 用于把template转化为render
    • vue: 包含测试实例,以及打包后的dist文件,src中对外暴露入口的方法
    • vue-compat: vue2的兼容性代码,以及vue的合并代码
    • global.d.ts 全局的ts声明
  • netlify.toml 自动化部署相关
  • jest.config.js 测试相关
  • api-extractor.json ts的api分析工具
  • SECURITY.md 报告漏洞,维护安全的声明
  • CHANGELOG.md 更新日志
  • BACKERS.md 赞助声明
  • test-dts 测试相关
  • scripts 配置文件相关
  • pnpm-workspace.yaml pnpm 相关配置
  • pnpm-lock.yaml 使用 pnpm 下载的依赖包版本锁文件

创建测试 实例

1 ) 需要全局安装下 pnpm

  • pnpm.io/zh/motivation
  • 安装完成,直接执行 pnpm i
  • 之后运行:npm run build
  • 编写我们的用例,在vue/examples下新建我们测试的代码目录
    • 新建reactivity目录, 在其下新建 reactive.html
    • 编写如下代码

2 )编写简单测试代码

<script src='../../dist/vue.global.js'></script><body><div id='app'></div>
</body><script>const { reactive, effect } = Vueconst obj = reactive({name: '张三'})effect(()=>{document.querySelector('#app').innerText = obj.name})const timer = setTimout(() => {clearTimeout(timer)obj.name = '李四'})
</script>

3 )开启sourceMap

  • 只有开启sourceMap才能进行debugger
  • 这样,我们就可以借助sourceMap查看打包之前的代码,而非打包之后的代码
  • 我们打包用的命令在package.json中,是:node scripts/build.js
  • 在这个文件中,我们可以看到: sourceMap ? SOURCE_MAP:true : ``, 这里开启 sourceMap的关键就在这个变量里
  • 这里的代码:SOURCE_MAP:true 最终会被 rollup 构建
  • 在rollup.config.js 中包含sourceMap的逻辑,大概在94行
  • output.sourcemap = !!process.env.SOURCE_MAP
  • 这个变量 sourcemap 在 build.js中是取决于 args.sourcemap 或 args.s
  • 而 args 是在使用了 minimist 库来生成的:const args = require('minimist')(process.argv.slice(2))
  • 这个 minimist 包是在 npmjs.com/package/minimist 中 查看 example
  • 而在vue中开启sourceMap, 其实非常简单,只需要在build命令后面添加 -s 参数即可
    • "build": "node scripts/build.js -s"

4 ) 进行debugger

  • 基于之前的live-server打开的http访问的页面:http://127.0.0.1:5500/**/code/vue-next-3.2.37/packages/vue/examples/reactivity/reactive.html
    • 我们点击chrome的Sources面板,向下可看到Page, Filesystem子面板,选择Page面板,查看当前页面对应的html文件里的代码,我们可看到 reactive.html 文件
    • 只有这一个html文件以及dist/vue.global.js的js文件
  • 重新运行 build 命令, 在dist目录中,发现生成了一些 map.js 文件
    • 同样,按上述步骤操作,查看 Page 子面板,等一会儿发现,同步了一堆文件:
    • vue, compiler-core/src, compiler-dom/src, reactivity/src, runtime-core/src, runtime-dom/src, shared/src
  • 现在我想调试,如上代码中的 reactive api, 我在 reactivity/src/reactive.ts 中找到 reactive 函数并打上一个断点,即可调试了

如何阅读源码

1 ) 关于误区

  • 误区:
    • 把源代码中的每一行代码都读明白,这会导致 事倍功半
  • 正确:
    • 摒弃边缘情况,仅阅读核心逻辑,一些边缘的和一些条件可适当忽略
    • 跟随一条主线, 下面三大块不是同时的,而是跟着一条线来走完
      • 响应性
      • 运行时
      • 编译器

2 )关于调试流程

  • 基于上述源码,我们可以测试我们的功能
  • 但是为了研究出具体的功能,我们可以自行搭建一套类似vue的框架来简化核心流程

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

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

相关文章

常见统计学习方法特点总结

1. 概述 方法适用问题模型特点模型类型学习策略损失函数学习算法1感知机二分类分离超平面判别模型极小化误分点到超平面距离误分点到超平面距离SGD2KNN多分类&#xff0c;回归特征空间&#xff0c;样本点判别模型---3朴素贝叶斯多分类特征与类别的联合概率分布&#xff0c;条件…

【CMU 15-445】Proj2 Hash Index

EXTENDIBLE HASH INDEX 通关记录Task1 Read/Write Page Guards移动构造函数Drop方法移动赋值运算符析构函数UpgradeRead函数FetchPageBasic、FetchPageRead、FetchPageWrite、NewPageGuarded Task2 Extendible Hash Table PagesHeaderPageDirectoryPageBucketPage Task3 Extend…

飞天使-linux操作的一些技巧与知识点5

文章目录 roles批量替换文件 role 的依赖关系role 的实际案例 roles tasks 和 handlers &#xff0c;那怎样组织 playbook 才是最好的方式呢&#xff1f;简 单的回答就是&#xff1a;使用 Roles Roles 基于一个已知的文件结构&#xff0c;去自动的加载 vars&#xff0c;tasks 以…

Python字典去重竟然比集合去重快速40多倍

这里写目录标题 对比代码结果图代码解析 对比代码 from glob import glob from tqdm import tqdm import time path_listglob("E:/sky_150b/任务组_20231207_2023/*.jsonl") # for two in tqdm(path_list): onepath_list[0]with open(one,"r",encoding&q…

【C++】POCO学习总结(十):Poco::Util::Application(应用程序框架)

【C】郭老二博文之&#xff1a;C目录 1、Poco::Util::Application 应用框架 1.1 应用程序基本功能 Poco::Util::Application是POCO实现的的应用程序框架&#xff0c;支持功能如下&#xff1a; 命令行参数处理配置文件初始化和关机日志 1.2 命令行程序和守护进程 POCO支持…

Java架构师系统架构实现高内聚低耦合

目录 1 导语2 边界内聚耦合概述3 聚焦内聚4 关注耦合5 如何实现高内聚低耦合6 内聚耦合规划不当的效果7 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 架构设计的核心维度,从系统的扩展性、高性能、高可用、高安全性和伸缩性五个维度进行了探讨,并介绍了…

【Docker】进阶之路:(一)容器技术发展史

【Docker】进阶之路&#xff1a;&#xff08;一&#xff09;容器技术发展史 什么是容器为什么需要容器容器技术的发展历程Docker容器是如何工作的 什么是容器 容器作为一种先进的虚拟化技术&#xff0c;已然成为了云原生时代软件开发和运维的标准基础设施。在了解容器技术之前…

抖音本地生活服务商申请入口在哪里?具体流程是怎样的?

不论是抖音的本地生活业务&#xff0c;还是后来的支付宝、视频号的本地生活业务&#xff0c;因为市场体量足够庞大&#xff0c;市场前景广阔&#xff0c;一直很受各大创业者的追捧。那么&#xff0c;如此火热的本地生活项目&#xff0c;想要申请成为服务商&#xff0c;具体的申…

列表标签的介绍与使用

列表的作用&#xff1a; 整齐、整洁、有序&#xff0c;它作为布局会更加自由和方便。 根据使用情景不同&#xff0c;列表可以分为三大类&#xff1a;无序列表、有序列表和自定义列表 无序列表 <ul> 标签表示 HTML 页面中项目的无序列表&#xff0c;一般会以项目符号呈…

深入了解linux下网卡防火墙selinux

深入了解linux下网卡防火墙selinux 在Linux系统中&#xff0c;网络安全是非常重要的。为了保护系统免受恶意攻击和未经授权的访问&#xff0c;我们可以使用防火墙来限制网络流量。而在Linux下&#xff0c;我们可以使用SELinux&#xff08;Security-Enhanced Linux&#xff09;…

Java调试技巧之垃圾回收机制解析

Java作为一种高级编程语言&#xff0c;以其跨平台、面向对象、自动内存管理等特性而广受开发者的喜爱。其中&#xff0c;自动内存管理是Java的一大亮点&#xff0c;通过垃圾回收机制实现对内存的自动分配和释放&#xff0c;极大地简化了开发者的工作。本文将深入探讨Java的垃圾…

mysql数据库文件丢失恢复---惜分飞

客户服务器重启,mysql相关数据文件丢失 通过底层工具进行分析,无法正确恢复数据库名字,一个个单个ibd文件(而且很多本身是错误的) 对于这种情况,通过mysql block扫描恢复出来page文件 恢复出来客户需要数据 这个客户出现该故障的原因大概率是由于文件系统损坏导致.最终…

C语言进阶之路-数据结构篇

目录 一、学习目标 二、数据结构 1.基本概念 线性关系&#xff1a; 非线性关系&#xff1a; 存储形式 2. 算法分析 2.1 时间复杂度 2.2 空间复杂度 2.3 时空复杂度互换 总结 一、学习目标 了解数据结构的基本概念了解算法的分析方法 二、数据结构 1.基本概念 数据结…

测试bug分析

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1…

Nacos源码解读11——客户端怎么读取最新的配置信息

项目启动怎么读取的配置信息 自动装配 SpringBoot 自动装配机制 加载 WEB/INF spring.factories 会将如下几个Bean加载到ioc 容器中 BeanConditionalOnMissingBeanpublic NacosConfigProperties nacosConfigProperties() {return new NacosConfigProperties();}BeanCondition…

【算法Hot100系列】两数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【rabbitMQ】模拟work queue,实现单个队列绑定多个消费者

上一篇&#xff1a; springboot整合rabbitMQ模拟简单收发消息 https://blog.csdn.net/m0_67930426/article/details/134904766?spm1001.2014.3001.5502 在这篇文章的基础上进行操作 基本思路&#xff1a; 1.在rabbitMQ控制台创建一个新的队列 2.在publisher服务中定义一个…

MySQL中的数据类型

MySQL中的数据类型 大家好&#xff0c;我是微赚淘客系统的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨MySQL中的数据类型&#xff0c;这是数据库设计中至关重要的一部分。数据库作为程序的底层支持&#xff0c;数据类型的选择…

[python]利用whl轮子文件python3.12安装talib

ta-lib目前很多人使用&#xff0c;网上也有很多人下载whl文件直接pip安装即可&#xff0c;但是最新版本3.12没有出来&#xff0c;因此本人独家制作python 3.12版本whl文件&#xff0c;从源码开始编译生成。TA-Lib-0.4.28-cp312-cp312-win-amd64.whl &#xff0c;注意这个whl文件…

Java 多线程下的单例模式

单例对象&#xff08;Singleton&#xff09;是一种常用的设计模式。在Java应用中&#xff0c;单例对象能保证在一个JVM中&#xff0c;该对象只有一个实例存在。正是由于这个特 点&#xff0c;单例对象通常作为程序中的存放配置信息的载体&#xff0c;因为它能保证其他对象读到一…