构成 Vue.js 的关键要素
Vue.js 仓库
Vue.js 可以在这个仓库中找到: https://github.com/vuejs/core
有趣的是,这是 v3 的仓库。对于 v2 和更早的版本,您可以在另一个仓库中找到: https://github.com/vuejs/vue
为了本次讨论,我们将专注于核心仓库(v3)。
构成 Vue.js 的主要要素
让我们首先对 Vue.js 的实现有一个整体的理解。
Vue.js 仓库中有一个关于贡献的 markdown 文件; 如果您感兴趣,可以查看它以了解其架构。(不过,跳过也没关系。)
https://github.com/vuejs/core/blob/main/.github/contributing.md
从大的方面来说,Vue.js 包含以下主要组件:
运行时(Runtime)
运行时包含影响实际操作的所有内容 - 从渲染到组件状态管理。
这指的是在浏览器或服务器(在 SSR 的情况下)上运行的用 Vue.js 开发的 Web 应用程序的全部内容。具体包括:
组件系统
Vue.js 是一个面向组件的框架。根据用户的需求,您可以可维护地创建和封装组件以供重用。
它还提供组件之间状态共享(props/emits 或 provide/inject)和生命周期钩子等功能。
响应式系统
它跟踪组件持有的状态,并在发生变化时更新屏幕。
这种监控和响应机制称为响应式。
import { ref } from 'vue'
const count = ref(0)
// 当执行这个函数时,显示计数的屏幕也会更新
const increment = () => {
count.value++
}(仅仅通过改变一个值就能更新屏幕,这很神奇,对吧?)
虚拟 DOM 系统
虚拟 DOM 系统是 Vue.js 的另一个强大机制。它定义了一个模仿 DOM 的 JavaScript 对象在 JS 运行时中。
更新时,它将当前的虚拟 DOM 与新的虚拟 DOM 进行比较,并仅将差异反映到真实 DOM 中。
我们将在专门的章节中深入探讨这一点。
编译器(Compiler)
编译器负责将开发者接口转换为内部实现。
"开发者接口"是指"使用 Vue.js 进行 Web 应用程序开发的开发者"和"Vue 内部操作"之间的边界。
本质上,当您使用 Vue.js 编写时,有些部分显然不是纯 JavaScript - 比如模板指令或单文件组件。
Vue.js 提供这些语法并将它们转换为纯 JavaScript。
此功能仅在开发阶段使用,不是实际运行的 Web 应用程序的一部分。
(它仅仅编译为 JavaScript 代码)。
编译器有两个主要部分:
模板编译器
顾名思义,这是模板部分的编译器。
具体来说,它处理 v-if 或 v-on 等指令,用户组件标记(如 )以及插槽等功能。
SFC 编译器
正如您可能猜到的,这代表单文件组件编译器。
它允许您在单个 .vue 文件中定义组件的模板,脚本和样式。
在 script setup 中使用的函数,如 defineProps 或 defineEmits 也由此编译器提供。
这个 SFC 编译器通常与 Webpack 或 Vite 等工具结合使用。
作为其他工具插件的实现不在核心仓库中。
SFC 编译器的主要功能在核心中,但插件在不同的仓库中实现。
(参考:vitejs/vite-plugin-vue)
顺便说一下,我们将实现一个实际的 Vite 插件来操作我们的自定义 SFC 编译器。
窥探 vuejs/core 目录
现在我们对 Vue 的主要要素有了大致的了解,让我们看看实际的源代码是什么样子的(尽管我们只是在讨论目录)。
主要源代码存储在"packages"目录中。
https://github.com/vuejs/core/tree/main/packages
一些需要关注的关键目录是:
- compiler-core
- compiler-dom
- compiler-sfc
- reactivity
- runtime-core
- runtime-dom
- vue
为了理解它们的相互依赖关系,贡献指南中的图表特别有见地。
https://github.com/vuejs/core/blob/main/.github/contributing.md#package-dependencies
在这本书中,我们将为所有这些主题提供实现和解释。
