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:
对应的模板就是:
编译器与渲染器
模板的声明UI是需要通过Vue的编译器进行转换成虚拟DOM,虚拟DOM则需要通过渲染器转换成真实DOM。
对于编译器来说,模板就是一个普通的字符串,它会分析该字符 串并生成一个功能与之相同的渲染函数。
template 标签里的内容就是模板内容,编译器会把模板内容 编译成渲染函数并添加到 script 标签块的组件对象上,所以最终 在浏览器里运行的代码就是:
渲染器就是将render函数返回的虚拟DOM渲染成真实DOM:
render的转换思路:
接受两个参数:虚拟DOM对象和真实DOM元素,首先创建一个空元素,然后遍历虚拟DOM对象为元素添加属性和事件,如果有children就递归调用渲染函数,最终将生成的元素添加到真实DOM节点上的。
组件思想
一句话总结:组件就是一 组 DOM 元素的封装,这组 DOM 元素就是组件要渲染的内容,因此我们可以定义一个函数来代表组件。
小结
组件的实现依赖于渲染器,模板的编译依赖于编译 器,并且编译后生成的代码是根据渲染器和虚拟 DOM 的设计决定的,因此 Vue.js 的各个模块之间是互相关联、互相制约的,共同构成一个 有机整体。因此,我们在学习 Vue.js 原理的时候,应该把各个模块结合到一起去看,才能明白到底是怎么回事。
参考文献:《Vue.js 设计与实现》