一、权衡的艺术
第一章 权衡的艺术
命令式和声明式
命令式的最大特点是关注过程,代码的本身描述的是”做事的过程“
声明式框架更加关注结果,用其实现一个功能不需要知道实现内容是什么,只需要结果
命令式框架的性能 >= 声明式框架
因为实现一个功能,在命令式框架下可以直接转化为有效代码,而声明式框架需要先做一次转换才能变成有效代码,因此把转换的差异缩到最小也只能将性能等于命令式框架
声明式代码的更新性能消耗=找出差异的性能消耗+直接修改的性能消耗
但命令式框架是关注过程,也就是实现一个功能我们就需要维护功能中的每一个过程,但是声明式框架不需要关注过程只需要维护这个结果,过程已经被封装好了。减小了代码的维护和开发效率
因此声明式框架就是在保持可维护性的同时将性能损失最小化
虚拟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、运行时+编译时:保持灵活性的基础上优化性能