Skip to content

1. 权衡的艺术

1.1 命令式和声明式

  • 视图层框架通常分为命令式和声明式
  • 命令式框架更加关注过程,声明式框架更加关注结果

1.2 性能与可维护性的权衡

先说结论:声明式代码的性能不优于命令式代码的性能

理论上命令式代码可以做到极致的性能优化,因为我们明确知道哪些发生了变更,只做必要的修改就行了,而声明式代码为了实现最优的更新性能,它需要找到前后的差异并只更新变化的地方

Vue.js 要选择声明式的原因就在于声明式代码的可维护性更强,框架设计者要做的就是在保持可维护性的同时让性能损失最小化

1.3 虚拟 DOM 的性能到底如何

  • 采用虚拟 DOM 的更新技术的性能理论上不可能比原生 JavaScript 操作 DOM 更高
  • 声明式代码的更新性能消耗 = 找出差异的性能消耗 + 直接修改的性能消耗。虚拟 DOM 是为了最小化找出差异这一步的性能消耗而出现的

innerHTML 和虚拟 DOM 在创建页面时,都需要新建所有 DOM 元素,无论是纯 JavaScript 层面的计算,还是 DOM 层面的计算,其实宏观上两者差距不大,但虚拟 DOM 在更新页面时只会更新必要的元素,而 innerHTML 需要全量更新,对于 innerHTML 来说,页面越大,就意味着更新时的性能消耗越大,这时虚拟 DOM 的优势就体现出来了

补充:涉及 DOM 的运算要远比 JavaScript 层面的计算性能差(DOM 运算涉及 页面渲染、访问 DOM 需要层级查找、DOM 操作引起页面重绘)

1.4 运行时和编译时

  • 纯运行时:没有编译的过程,无法分析用户提供的内容
  • 运行时 + 编译时:可以分析用户提供的内容,在编译的时候提取可变信息将其传递给 Render 函数做进一步的优化
  • 纯编译时:直接编译成可执行的 JavaScript 代码,性能可能会更好,但是这种做法有损灵活性
  • Vue.js 3 保持了运行时 + 编译时的架构,在保持灵活性的基础上能够尽可能地去优化性能

上次更新于: