# vue源码 - 开始

# 1、源码目录

├── benchmarks                  性能、基准测试
├── dist                        构建打包的输出目录
├── examples                    案例目录
├── flow                        flow 语法的类型声明
├── packages                    一些额外的包,比如:负责服务端渲染的包 vue-server-renderer、配合 vue-loader 使用的的 vue-template-compiler,还有 weex 相关的
│   ├── vue-server-renderer
│   ├── vue-template-compiler
│   ├── weex-template-compiler
│   └── weex-vue-framework
├── scripts                     所有的配置文件的存放位置,比如 rollup 的配置文件
├── src                         vue 源码目录
│   ├── compiler                编译器
│   ├── core                    运行时的核心包
│   │   ├── components          全局组件,比如 keep-alive
│   │   ├── config.js           一些默认配置项
│   │   ├── global-api          全局 API,比如熟悉的:Vue.use()、Vue.component() 等
│   │   ├── instance            Vue 实例相关的,比如 Vue 构造函数就在这个目录下
│   │   ├── observer            响应式原理
│   │   ├── util                工具方法
│   │   └── vdom                虚拟 DOM 相关,比如熟悉的 patch 算法就在这儿
│   ├── platforms               平台相关的编译器代码
│   │   ├── web
│   │   └── weex
│   ├── server                  服务端渲染相关
├── test                        测试目录
├── types                       TS 类型声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 2、流程总图

流程总图

# 3、流程总结

new Vue => this._init => 调用一些初始化方法,其中包含 initState 方法 => 进入响应式流程 => 初始化了一些方法,并使用 Object.defineProperty 劫持了 getter 和 setter 方法 => getter调用 dep.depend 收集依赖,setter 调用 dep.nottify 通知更新 => Dep.notify 调用 watcher.update,然后就进入了异步更新阶段 => 做了一些判断,最后会调用 nextTick 方法 => 再调用 timerFunc 方法,优先使用微任务,然后宏任务,Promise => MutationObserver => setImmediate => setTimeout,其意愿总是尽快执行 => 然后调用 watcher.run => watcher.get => 重置调度状态。

挂载阶段:进入挂载阶段会调用 beforeMount 钩子 => new Watcher => 回调 updateComponent 方法 => 继续调用 _update() => 然后进入 __patch__阶段,也就是VNode节点的创建以及更新 => 经过一些逻辑处理,最终调用 patchVnode 方法更新节点 => 然后判断新旧节点是否存在子节点 => 进入 diff 过程

# 4、参考

https://juejin.cn/post/6949370458793836580

上次更新: 4/10/2022, 10:26:50 AM