一文带你理解Vue的设计思路(声明式UI、虚拟DOM、编译器、渲染器)

187 阅读3分钟

Vue.js 的设计是非常庞大的,但是再庞大的项目都会有一条主要的思路,本文将重点介绍Vue.js 的设计思想,介绍其中的重要模块,和它们之间的配合及运作机制。

声明式UI

学过Vue的都知道,它是一个声明式的 UI 框架,意思是说用户在使用 Vue.js 3 开发页面时是声明式地描述 UI 的。减少开发者的心智负担,提高开发效率

编写一个前端页面通常包括下面的内容:

  • DOM 元素:例如是 div 标签还是 a 标签。
  • 属性:如 a 标签的 href 属性,再如 id、class 等通用属性。
  • 事件:如 click、keydown 等。
  • 元素的层级结构:DOM 树的层级结构,既有子节点,又有父节点。

在Vue中我们可以这样来编写:

  • 使用与 HTML 标签一致的方式来描述 DOM 元素
  • 使用与 HTML 标签一致的方式来描述属性
  • 使用 : 或 v-bind 来描述动态绑定的属性
  • 使用 @ 或 v-on 来描述事件,例如点击事件
  • 使用与 HTML 标签一致的方式来描述层级结构

除了Vue推荐的模板语法外,还可以用js对象来描述UI:

image.png

对应的模板就是:

image.png

编译器与渲染器

模板的声明UI是需要通过Vue的编译器进行转换成虚拟DOM,虚拟DOM则需要通过渲染器转换成真实DOM。

对于编译器来说,模板就是一个普通的字符串,它会分析该字符 串并生成一个功能与之相同的渲染函数。

image.png

template 标签里的内容就是模板内容,编译器会把模板内容 编译成渲染函数并添加到 script 标签块的组件对象上,所以最终 在浏览器里运行的代码就是:

image.png

渲染器就是将render函数返回的虚拟DOM渲染成真实DOM:

image.png

render的转换思路:

接受两个参数:虚拟DOM对象和真实DOM元素,首先创建一个空元素,然后遍历虚拟DOM对象为元素添加属性和事件,如果有children就递归调用渲染函数,最终将生成的元素添加到真实DOM节点上的。

组件思想

一句话总结:组件就是一 组 DOM 元素的封装,这组 DOM 元素就是组件要渲染的内容,因此我们可以定义一个函数来代表组件。

小结

组件的实现依赖于渲染器,模板的编译依赖于编译 器,并且编译后生成的代码是根据渲染器和虚拟 DOM 的设计决定的,因此 Vue.js 的各个模块之间是互相关联、互相制约的,共同构成一个 有机整体。因此,我们在学习 Vue.js 原理的时候,应该把各个模块结合到一起去看,才能明白到底是怎么回事。

参考文献:《Vue.js 设计与实现》