# fed-e-task-03-02
**Repository Path**: zhangxiaofeng66/fed-e-task-03-02
## Basic Information
- **Project Name**: fed-e-task-03-02
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-02-19
- **Last Updated**: 2021-02-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#### 一、请简述 Vue 首次渲染的过程。
1、首先是Vue初始化,初始化实例成员和静态成员。
>实例成员包含:实例方法,事件,生命周期;
静态成员包含:添加的全局方法,如:Vue.use, Vue.extend, Vue.mixin, Vue.set等方法。
2、调用Vue的构造函数 new Vue()
> Vue的构造函数调用了this._init()方法,_init()调用this.$mount(), this.$mount()共有两个。
第一个this.$mount()(入口文件entry-runtime-with-compiler.js)的核心作用是判断是否有render选项,如果没有render,把模板编译成render函数,它是通过compileToFunctions()函数,帮我们把模板编译成render函数的,它会把render函数存在options.render中.
第二个this.$mount()(入口文件是runtime/index.js)如果是运行版本,会重新获取el,然后执行mountComponent()方法。
3、调用mountComponent()方法,mountComponent()(src/core/instance/lifecycle.js)中定义的,在mountComponent()中,首先会判断render选项,如果没有render,但是传入了模板,并且当前是开发环境的话会发送警告,警告运行时版本不支持编译器。接下来会触发beforeMount这个生命周期中的钩子函数。
4、调用updateComponent()方法,在这个方法中定义了vm._update()和vm._render(), vm._render()渲染,渲染的是虚拟dom,vm._update()更新,将虚拟dom转换成真是dom,并挂在到页面上。
5、创建Watcher实例,传递了updateComponent函数,它是在Watcher内部调用的,在Wather创建完以后调用get方法。
6、触发生命周期中的钩子函数mounted(),最终返回vm实例。
#### 二、请简述 Vue 响应式原理。
###### 1、initState() ——> initData() ——> obseve()
初始化了 _data、_props、methods 等
###### 2、observe(value)
判断value是否是对象,如果不是对象直接返回,然后value对象是否有__ob__,如果有直接返回,如果没有则创建observer对象,返回observer对象。
###### 3、Observer
- 对对象做响应式处理,调用walk方法
- 对数组做响应式处理
###### 4、defineReactive
为一个对象定义一个响应式的属性,每一个属性对应一个 dep 对象:
- 如果该属性的值是对象,继续调用 observe
- 如果给属性赋新值,继续调用 observe
- 如果数据更新发送通知
###### 5、Dep类
- 依赖对象
- 记录watch对象
- 发送通知
###### 6、Watch类
#### 三、请简述虚拟 DOM 中 Key 的作用和好处。
>key值的作用是为了给虚拟DOM提供一个唯一的标识,方便在操作DOM时新旧节点比较,从而提高diff算法效率。
#### 四、请简述 Vue 中模板编译的过程。
1、通过入口函数compileToFunctions先从缓存中加载编译好的render函数,如果缓存中没有则调用compile函数,在compile函数中先合并options,然后调用baseCompile函数。
2、baseCompile函数:
|____ 解析器(parse)将template转换成AST tree(抽象语法树);
|____ 优化器(optimize)标记AST tree中静态sub trees;检测到静态树,设置为静态,不需要在每次重新渲染的时候重新生成节点
|____ 通过generate将优化过的AST tree生成js代码。
3、通过compileToFunctions函数继续把上一步生成的字符串js代码转换为函数,通过调用createFunciton,当render和staticRenderFns初始化完毕,挂载到Vue实例options对应的属性中。