1.框架设计概览
框架设计概览¶
命令式和声明式¶
- 命令式:注重过程,通过“面条式”代码来控制界面和交互逻辑,典型的例子:jQuery。
-
声明式:在一个模板中定义交互逻辑,框架解析该模板并实现命令式的功能,例子:Vue Template。
-
命令式代码更新消耗 = 直接修改
- 声明式代码更新消耗 = 查找差异 + 直接修改
命令式的好处是效率高,但可维护性低;声明式的好处是可维护性好,但性能不如命令式(因为声明式本质就是封装了命令式的代码)。 声明式框架通过优化“更新性能”来实现性能无限趋近于命令式。
如果我们能够最小化找出差异的性能消耗,就可以让声明式代码的性能无限接近命令式代码的性能。
虚拟 DOM 的性能¶
对于有很多元素的网页,虚拟DOM的性能远高于对元素设置 innerHTML,因为虚拟DOM只是JavaScript对象,而 innerHTML 渲染真实DOM是HTML字符串。 虚拟DOM只更新节点中变化的地方,这依赖于 Diff 算法。 虽然原生JS可以直接修改变化的节点,但是对于复杂的网页维护成本过高。
运行时和编译时¶
- 运行时:把虚拟DOM树结构(JS对象)渲染成真实DOM
- 编译时:把模板(如 Vue Template)转换成 VNode 对象,再调用运行时渲染 Vue3 是一个编译时+运行时框架
框架设计¶
- 提升开发体验:通过在开发模式中打印利于 debug 的信息
- 控制框架体积:通过 Tree-Shaking 移除用不执行的代码
- 根据不同平台输出不同产物:Web/ESM/CJS 等
- 特性开关:允许用户手动开关一些特性,比如说 Vue2 的 OptionsAPI 特性
- 错误处理:有统一的错误处理函数
- 良好的 TypeScript 支持:Vue3 中含有大量的 TS 支持代码
Vue3 的设计思路¶
- Vue3是一个声明式框架,模板即声明。
- 渲染器:通过渲染器可以把虚拟DOM对象转换为真实DOM,其基本原理是递归解析虚拟DOM树,使用
document.createElement
方法创建真实DOM元素,并在元素上挂载各种属性,最后把真实DOM挂载到指定的DOM节点之下。 - 组件:组件的本质是虚拟DOM的集合,包含 render 方法和各种属性。
- 模板的原理:通过编译器把 把 template 模板编译成 render 函数。render 函数用于返回虚拟DOM对象。