简单的芝士 vue-Deep Dive (一)

69 阅读3分钟

一>.Intro

1)DOM

文档对象模型(DOM)是一个网络文档的编程接口。它代表页面,以便程序可以改变文档的结构、风格和内容。DOM 将文档表示为节点和对象;这样,编程语言就可以与页面交互。

HTML映射到一系列DOM节点,然后我们就可以使用js操作进行DOM交互

比如,我要更改某个DOM中某个节点的内容,

那么在背后发生了什么

  1. 检索元素
  2. 更新节点
  3. 更新浏览器

一个网页可以由很多节点组成,这就意味着DOM数可以有数千个节点

搜索和更新数千个节点可能会导致很慢,这就是vue和其他框架有一种叫做虚拟Dom的东西

虚拟节点

A way of representing the actual DOM with js object

例如:

Vue知道如何使用该虚拟dom节点,并挂载到dom上,更新在浏览器中看到的内容

vue基于我们的模板创建一个渲染函数,返回一个虚拟dom节点,如下图:

当组件更改的时候,render函数将重新运行,他将创建另一个虚拟节点,然后发送旧的vnode 和新的vnode到vue中的补丁函数中进行比较,并以最高效的方式在我们的网页上进行更新,如下图

我们可以将虚拟dom和真实dom比较为蓝图和建筑的关系

假设我想更改一下29楼的布局,有两种解决办法,

  1. 拆除29楼,重建
  2. 画一个蓝图,比较新旧布局,把不一样的拆除然后重建

vue有三个核心模块

  1. 响应模块(Reactive Module)
  2. 编译器模块(Compiler Module)
  3. 渲染模块(Render Module)

1)响应模块

允许我们创建js响应对象,并可以观察其变化。**当使用这些对象的代码运行时,他们会被跟踪,**如果响应对象发生变化,他们可以在以后运行

2)编译模块

知道如何获取HTML模板,并将他们编译成渲染函数,这可能在浏览器中运行时存在,但更多的是在构建vue项目中存在,这样浏览器就只接收渲染函数

3)渲染模块的代码包含在网页上渲染组件的三个不同阶段

  1. 渲染阶段 (Render Phase) ,调用render函数,返回虚拟dom节点
  2. 挂载阶段 (Mount Phase) 使用虚拟dom节点,并调用dom API 创建网页
  3. 补丁阶段(Patch Phase) 将新旧dom节点进行比较并更新网页部分的变化

现在,我们实操一下:

  1. 现在有一个组件,他已经被显示在了浏览器上,在这背后发生了什么
  2. 模板编译器将HTML编译成渲染函数
  3. 初始化响应对象,使用响应模块
  4. 在渲染函数中,我们进入渲染阶段
  5. 调用render函数,他引用了响应对象,我们现在观察响应对象的变化,render函数将返回虚拟dom节点
  6. 在挂载阶段,调用mount函数,使用虚拟节点创建web页面
  7. 如果响应对象发生任何变化,因为她正在被监视,所以渲染器会再次调用render函数,创建新的dom节点,新旧节点发送到补丁函数中,然后根据需要更新节点