美文网首页
第一节:vue3源码概览

第一节:vue3源码概览

作者: 时光如剑 | 来源:发表于2023-10-24 15:45 被阅读0次

1. 前言

从vue3 正式发版开始,到目前为止一直在使用vue3 进行项目开发, 中间也陆陆续续在源码中看些API的实现. 但一直未去整理自己的笔记, 所有的笔记看上去就很杂乱, 正好乘着这段时间项目不忙,对源码分析笔记做一个规整.

至于为什么学源码啊, vue3 设计目的啊, 和vue2 的区别, 网上一堆,我就不过多阐述了.

2. vue源码

Vue 3 的源代码存放在其 Github 官方仓库上,地址:https://github.com/vuejs/core
拉取源码到本地后, 执行pnpm 指令安装依赖

3. 目录结构

3.1 源码目录

Vue 源码的目录结构比较清晰, 除了项目架构的配置文件,最主要的两个目录:

  1. package: 源码目录,Vue3的源码都放在这里
  2. scripts: Vue3的脚本文件, 用来存放配置文件,进行编译和打包


    目录结构.png

整个项目结构中, 我们主要分析源码, 至于其他的配置文件不是我们分析的重点, 有兴趣可以研究一下源码项目配置
而所有的目录中最核心的就是packages 目录 Vue3 的源码存放在此目录种:

  1. compiler-core: 编译解析核心,与具体环境无关,主要生成AST, 并根据AST生成render()方法
  2. compiler-dom: 浏览器环境中模板解析逻辑, 如处理HTML转义, 处理v-model等指令
  3. compiler-sfc: 负责解析Vue单文件组件
  4. compiler-ssr: 服务端渲染环境中的模板解析逻辑
  5. reactivity: 响应式数据相关逻辑,Proxy 就在这里面
  6. runtime-core: 运行时与创建实例相关代码
  7. runtime-dom: 浏览器环境中的运行时核心
  8. runtime-test: 内部测试代码
  9. server-renderer: 用于SSR服务端渲染的逻辑
  10. shared: Vue3 工具库,一些通用方法
  11. size-check: 用于测试tree shaking 后代码大小的示例库
  12. template-explorer: 用于检查模板编译后的输出, 主要用于开发调试
  13. vue: Vue3 主入口文件,包括运行时和 编译器

3.2 最重要源码模块

通过目录名称我们可以看到package中最重要的模块有5个, 分别为

  1. compiler-core
  2. compiler-dom
  3. runtime-core
  4. runtime-dome
  5. reactivity

模块结构如下:

                      +---------------------+    +----------------------+
                      |                     |    |                      |
        +------------>|  @vue/compiler-dom  +--->|  @vue/compiler-core  |
        |             |                     |    |                      |
   +----+----+        +---------------------+    +----------------------+
   |         |
   |   vue   |
   |         |
   +----+----+        +---------------------+    +----------------------+    +-------------------+
        |             |                     |    |                      |    |                   |
        +------------>|  @vue/runtime-dom   +--->|  @vue/runtime-core   +--->|  @vue/reactivity  |
                      |                     |    |                      |    |                   |
                      +---------------------+    +----------------------+    +-------------------+

而这5个大模块则是vue 最为重要的三大核心

4. vue3 源码三大核心系统

4.1 源码的三大核心系统

vue的源码包含三大核心系统

  1. Reactivity模块: 响应式系统, 主要职责是监听响应式数据
  2. Runtime模块: 也可以称之为Render模块, 真正负责渲染的模块, 主要职责就是将虚拟节点渲染成真实的元素,然后显示在浏览器上
  3. Compiler模块: 编译模块系统, 主要职责就是将template模板解析,生成render方法

三大系统对应的源码目录


三大核心系统目录结构.png

而三大系统中渲染系统 + 响应式系统 就是我们在官网上看到的运行时runtime代码

4.2 三大核心系统的协同工作

vue3三大系统工作原理.png

5. 编译调试

5.1 打包源码

根据package.json文件中的脚本命令


package.json.png

这里这么多命令, 我们开始只需要了解两个dev和build

  1. dev: 实施编译, 当你修改vue源码时, 会实时打包
  2. build: 将vue源码打包存放在dist目录下
    这另个打包都是通过node运行scripts目录下对应的打包文件进行打包, 有兴趣的可以去详细分析一下vue 打包脚本



通过pnpm运行打包命令

pnpm run build

打包完成以后在packages/vue目录下生成dist目录, 目录中针对不同的模块化打包成不同的文件

打包目录.png
此时我们就可以编写测试文件

5.2 编写测试文件

在packages/vue/example目录为vue提供了很多示例页面, 每个页面都引入Vue构建后的文件./packages/vue/dist/vue.global.js
我们可以在此目录下编写的测试页面:package/vue/example/hello.html
实例代码:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    
    <!-- 引入打包后的文件 -->
    <script src="../dist/vue.global.js"></script>
  </head>
  <body>
    <!-- vue 挂载节点 -->
    <div id="app">
      <div>{{name}}</div>
    </div>
    <script>
      // 解构需要使用的API
      const { reactive, createApp, ref } = Vue

      // 创建vue 应用
      createApp({
        setup() {
          // 通过ref 生成响应式数据
          const name = ref('张三')

          // 两秒后修改响应式数据
          setTimeout(() => {
            name.value = '李四'
          }, 2000)
          return { name }
        }
      }).mount('#app')
    </script>
  </body>
</html>

5.3 调试Vue源码

在浏览器中运行测试 文件, F12打开开发工具, 在源代码栏找到测试文件打上断点


断点测试.png

此时刷新页面, 浏览器就会在断点位置停止运行, 我们可以手动点击下一步进入源码调试了


单步调试.png

进入vue源码后,就可以看到refAPI, 接收一个字符串参数"张三", 并返回调用createRef(value,false)结果


源码调试.png

6. 总结

至此我们已经完成了源码分析的第一步,在此过程中:

  1. 首先我们在github拉取vue源码
  2. 其次我们简单了解了vue源码目录结构
  3. 最后我们通过源码编写测试实例, 断点测试时,成功进入源码API

接下来我们对于源码分析按照响应式系统reactivity,渲染系统runtime,编译系统compile顺序分析

相关文章

网友评论

      本文标题:第一节:vue3源码概览

      本文链接:https://www.haomeiwen.com/subject/wbrjidtx.html