Vue.js框架中权衡的艺术

2022-09-19 14:13:01 浏览数 (1)


theme: juejin

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

前言

8月更文活动又开始了,冲这奖品也得肝一肝,先给自己定个小目标,活动结束之前,先肝个7篇,完成个最基础的任务。

无奈,平时积累的文章不够,恰好,上个月读了一段时间《Vue.js设计与实现》,有整理部分笔记,先发几篇。

所以,后面几篇内容都是对这本书内容的整理总结

详细情况可以查看专栏学习理解《Vue.js设计与实现》

《Vue.js 设计与实现》是Vue.js官方团队成员 霍春阳 倾力打造,基于Vue.js3 深入解析Vue.js设计细节。

这本书一大特点就是贵,定价120,到手价格90。

设计框架里到处都体现了权衡的艺术

牛逼!!!

其实说人话就是 就是设计时的技术方案的选型,然后为什么选这个,不选那个,高大上一点就是 权衡。

命令式 和 声明式的权衡

视图层的框架一般分为 命令式和声明式。

命令式框架:如Jquery和原生js,更关注更改视图,修改dom的过程。

声明式框架:如vue,更关注结果,操作dom,修改dom的过程我们不用关心,vue去帮我们我们完成,我们只需要告诉框架我们需要什么样的东西

以一个操作dom的场景为例子

  • 获取一个dom
  • 设置文本内容hello world
  • 为其绑定点击事件
  • 当点击时弹出ok ```js // jquery 实现 $('#app') // 获取div .text("hello world") // 设置文本内容 .on("click",()=>{ alert('ok') }) // 增加监听事件

// 原生js实现 const div = document.querySelector('#app') // 获取div div.innnerText = 'hello world' // 设置文本内容 div.addEventListner('clilk',() => { alert('ok') } }) // 增加监听事件

// vue 实现

hello word

``` 命令式框架,更加符合人脑处理事情的思路,面向过程,一步一步去做。

声明式框架,更加傻瓜式一些,只需要告诉框架,我需要的结果,但是如果告诉框架,有框架自定义的一套规范,有学习成本和使用成本。

权衡之后,vue 决定按 一套 声明式框架来设计

性能与可维护的权衡

命令式框架的性能 优于 声明式的框架的性能

简单来说,就是jquery 性能优于 vue

当我们需要更新dom时

  • 对于vue 框架来说,修改dom 需要先找到真实dom 和虚拟dom的差异,更新dom有差异的地方。
  • 对于jquery 框架来说,修改dom 直接去修改就可以了。

vue 等声明式框架的更新性能消耗 = 直接修改的性能消耗 找出差异的性能消耗

jquery 等命令式框架的更新性能消耗 = 直接修改的性能消耗

所以说,jquery 性能优于 vue

当然了vue的可维护性更强,所以我们需要做的是,努力减小找出差异的性能消耗,这样就可以使vue的性能无限接近jquery

因此我们提出了虚拟dom,来最小化找出差异

虚拟DOM的性能

其实性能这个东西,很难直接说,好不好,没有对比就没有伤害

我们把它和原生js 修改dom 进行对比

虚拟dom 简单来讲它就是将HTML的DOM,用一套JS对象来表示。

为了更好的说明虚拟dom的性能,我们用innerHTML来比较。

innerHTML 是html5 提出的一个新的获取操作dom的方法。

不知道这个api的可以去查一查,活着看下我之前写的dom bom博客,

从零开始学习dom bom

innerHTML

  • 可以获取调用元素的所有子节点对应的html片段
  • 可以是根据指定的值创建DOM树,替换原有的元素节点

一般我们插入大量新HTML标记时,使用innerHTML 与 通过多次DOM操作先创建节点再指定它们之间的关系相比,效率更高,因为在设置innerHTML 时就会先创建一个HTML解析器,这个解析是在浏览器级别的基础上代码(c )运行的,因此比执行js 快得多,当然也会带来 创建销毁 html 解析器也有性能消耗。所以控制使用次数。

当新建页面时

代码语言:javascript复制
const html = 	`
  <div><span>...</span></div>
`
div.innerHTML = html

通过 innerHtml 创建页面的性能 = HTML字符串拼接的计算量 innerHTML的DOM计算量

通过 虚拟dom 创建页面的性能 = 创建虚拟dom的计算量 创建真实DOM的计算量

innerHTML

虚拟DOM

JavaScript运算

拼接html字符串

创建虚拟dom

DOM构建

新建所有dom元素

新建所有dom元素

新建页面时,JavaScript运算和DOM构建层面相差不大,innerHTML 性能甚至优于 虚拟dom

当更新页面时

innerHTML

虚拟DOM

JavaScript运算

拼接html字符串

创建虚拟dom diff算法

DOM构建性能因素

销毁旧dom新建新dom与模版大小相关

必要的dom更新与数据变化量相关

更新dom 时,虚拟DOM性能更加优越

修改dom的三个方法对比

innerHTML

虚拟dom

原生js(createElement)

心智负担重等性能差

心智负担小可维护性高性能不错

心智负担大可维护性差性能高

权衡之后,vue 使用的 虚拟dom 性能是很不错的,目前没有更好的方案

运行时和编译时的权衡

设计一个框架时,一般有三种选择

纯运行时

我个人理解,纯运行时,就比如jquery,或者和命令式框架写法相似

纯编译时

比如Svelte, 0运行时,直接编译成可执行的js代码,因此性能更好。

运行时 编译时

vue react 都是运行时 编译时。

<template><jsx>

代码都会在编译时被打包成被渲染成 树形结构。在运行时,执行render进行渲染。

0 人点赞