vue.js设计与实现—权衡的艺术

453 阅读2分钟

命令式与声明式

  • 命令式注重过程 获取div-设置文本内容-绑定点击事件
  • 声明式注重结果 ,类似于告诉框架我要实现一个div,文本是hello word 还有个绑定事件,至于怎么实现,由vue帮我们封装了过程
<div @click="() => alert('ok')">hello word<div>

vue内部实现是命令式,暴露给用户是声明式

性能与可维护性

性能

  • 命令式性能优于声明式
  • 声明式代码更新,需要找出差异,再进行修改
  • 命令式代码更新,由于明确知道哪发生了更新,直接进行修改

可维护性

  • 声明式可维护性优于命令式
  • 声明式只需维护结果,至于过程交给vue
  • 命令式需维护整个过程,手动完成DOM的创建、更新、删除 在保持可维护性同时让性能损耗最小

虚拟DOM的性能

  • 虚拟DOM是为最小化找出差异而出现的

innerHTML与虚拟DOM的性能比较

创建

  • innerHTML,渲染HTML字符串+创建所有的DOM元素
  • 虚拟DOM,创建javascript对象+创建所有DOM元素

创建阶段没有较大的差异,都需要新建所有的DOM元素

更新

  • 虚拟DOM与数据变化有关,innerHTML与模板大小有关 ec5a6dec83cb731cc843b07c5302619.jpg

innerHTML,虚拟DOM,原生JavaScript

image.png

  • 心智负担:创建、删除、修改DOM元素 结合心智负担、可维护性等因素,vue使用虚拟DOM。

运行时和编译时

  • 运行时 用户提供树形结构,框架向外暴露render函数
  • 编译时+运行时 用户提供html模板 框架向外暴露compiler(将html模板转化为树形结构的数据对象),render函数
  • 编译时 将HTML字符串编译成命令式代码

纯运行时无法分析用户提供的内容,编译时可以分析用户提供的内容,分析哪些内容未来可能发生变化,哪些内容永远不会发生变化,然后传递给render函数进一步进行优化。纯编译时,直接编译成JavaScript代码,性能会更好,但灵活性差,即用户提供的内容必须编译后才能用 vue3使用编译时+运行时框架,在保持灵活性的基础上,通过编译手段分析用户提供的内容,从而进一步提升更新性能