第一章 权衡的艺术

命令式和声明式

命令式的最大特点是关注过程,代码的本身描述的是”做事的过程“

声明式框架更加关注结果,用其实现一个功能不需要知道实现内容是什么,只需要结果

命令式框架的性能 >= 声明式框架

因为实现一个功能,在命令式框架下可以直接转化为有效代码,而声明式框架需要先做一次转换才能变成有效代码,因此把转换的差异缩到最小也只能将性能等于命令式框架

声明式代码的更新性能消耗=找出差异的性能消耗+直接修改的性能消耗

但命令式框架是关注过程,也就是实现一个功能我们就需要维护功能中的每一个过程,但是声明式框架不需要关注过程只需要维护这个结果,过程已经被封装好了。减小了代码的维护和开发效率

因此声明式框架就是在保持可维护性的同时将性能损失最小化

虚拟DOM和innerHTML对比

创建页面时性能:

虚拟DOM innerHTML
纯javascript 创建javascript对象 渲染HTML字符串
DOM运算 创建所有DOM元素 出啊关键所有DOM元素

更新页面时性能:

虚拟DOM innerHTML
纯javascript运算 创建新的javacript对象+Diff 渲染HTML字符串
DOM运算 必要的DOM更新 销毁所有旧DOM 新建所有新DOM

更新页面时性能:

虚拟DOM innerHTML
DOM运算 必要的DOM更新 摧毁所有旧DOM
性能因素 与数据变化量相关 与模板大小相关

虚拟DOM的转换:

1、将<div><span>hellow world</span></div>标签使用compiler编译树状结构

const obj={tag:‘div’,children…}

2、使用rander函数渲染,将树状结构转换为javascript内crateElement函数

框架层:运行时、编译时以及运行时+编译时

所以框架设计分为几种类别:

1、纯运行时:没有编译过程,无法分析用户提供的内容

2、纯编译时:可以分析用户提供的内容,性能可能会更好但是有损灵活性

3、运行时+编译时:保持灵活性的基础上优化性能