vue源码阅读笔记

vue源码阅读笔记

1.new Vue发生了什么

2.Vue实例的挂载实现

3.render

​ 用来把实例渲染成一个虚拟Node。 最终调用了createElement方法,并返回一个vnode。

4.虚拟DOM

参考https://github.com/snabbdom/snabbdom

###5.createElement

创建虚拟DOM的方法

_createElement方法的封装

_createElement(context, tag, data, children, normalizationType)

五个参数:

context: component类型

tag:标签,字符串或者component

data:VNodeData类型

children: 任意类型

normalizationType:子节点规范的类型

这个方法主要的流程:

  • children的规范化,涉及以下两个方法

​ normalizeChildren(children) 调用场景有两个:render是用户自己手写的、编译slot和v-for时

simpleNormalizeChildren(children) 调用场景是render函数生成的,理论上编译生成的children都是VNode类型,但这里有一个例外,就是functional component函数式组件返回的是一个数组而不是一个根节点,

  • VNode的创建

​ 先判断tag,tag是字符串类型,继续看是否为内置的一些节点,是的话直接创建一个普通的VNode,如果是已注册的组件名则通过createComponent创建一个组件类型的VNode,否则创建一个未知的标签的VNode节点。

6.update

把VNode渲染成真实的DOM

​ Vue的_update是实例的一个私有方法,它被调用的时机有两个:

  • 一个是首次渲染,

  • 一个是数据更新的时候

​ 核心是调用vm.__patch__方法。这个方法在不同的平台定义是不一样的。

7.createComponent

createElement对tag判断,当tag不是普通html标签时,以createComponent方法创建一个组件VNode

  • 构造子类构造函数
  • 安装组件钩子函数,暴露patch流程中的钩子函数,方便做一些额外操作
  • 实例化VNode

8.patch