当前位置: 首页 > Web前端 > vue.js

中国人的意思,中国人造的框架呢?

时间:2023-04-01 01:20:51 vue.js

大家好,我是Kason。都说中国人讲究中庸之道,但是讲究中国人为的框架吗?本文将从原理层面解释Vue如何在运行时和编译时保持适度的平衡。UI=fn(state)几乎所有的前端框架的工作原理都可以用下面的公式来概括:UI=fn(state)UI(view)可以由fn(framework)通过state(状态)来计算。然而,原则上,框架差异很大。它们按照更新粒度可以分为三类:树级更新、组件级更新、节点级更新,更新粒度没有好坏之分,只是对应不同的实现。下面我们简单了解下不同粒度更新方式的实现原理。假设有如下组件树,其中Cpn是一个自定义组件,内部结构为ul>li*2:我们要将Cpn中的一个li更新为黄色:tree-levelupdatetree-levelupdate的frame会生成一个完整的虚拟DOM树,在生成过程中,与之前的虚拟DOM树的对应节点进行比较:找到变化的节点后,执行对应的DOM操作。树级更新框架的特点是:依赖虚拟DOM,不关心触发更新的节点(因为会通过虚拟DOM的全树比较找到)。使用这种更新方法最著名的框架是React。组件级更新上面的例子,如果是组件级更新框架的话。它会找到触发更新节点所在的组件,生成该组件的虚拟DOM树(而不是整棵树的虚拟DOM树),并在执行期间与该组件之前的虚拟DOM树对应节点进行比较生成过程:找到变化的节点后,执行相应的DOM操作。组件级更新框架的特点是依赖虚拟DOM来关心触发更新的节点(虚拟DOM的比较会作用于节点所在的组件)。采用这种更新方式最著名的框架是Vue。如果节点级更新是节点级更新框架,编译时会根据状态变化对应的DOM变化直接生成相应的方法,当状态发生变化时会直接调用相应的方法。上面的例子中,颜色状态和changeColor方法在编译时会关联起来:李.节点级更新框架的特点是:不依赖虚拟DOM,依赖预编译(建立状态和改变DOM的方法之间的联系)和关心触发更新的节点(one-to-节点状态和更新方法之间的一个对应关系)。这种更新方法是最好的一个著名的框架是Svelte。ModerateVue3Vue作为组件级更新代表,更新粒度介于树级和节点级之间。是中左还是中右?Vue3说:我想反复跳转,我想在Vue3中两边包含三种树结构:描述视图的树->虚拟DOM树->真实DOM树,其中描述视图的树官方推荐使用模板语法,但也可以使用JSX。无论哪种方式,它最终都会转化为虚拟DOM树。在使用JSX时,Vue3具有React运行时的灵活性。这时候,Vue3就可以看做是React+Mobx的增强版了。在使用模板语法时,Vue3引入了预编译技术。至此,Vue3的工作流程可以细化为四个步骤:描述视图的树->VNode树->Block数组->真实DOM树其中VNode树是常规意义上的虚拟DOM树,而Block数组是VNode树中对象的状态有依赖关系,一个会变化的VNodes数组。例如,对于以下模板语法:section和div不包含state,不会变,所以会转成VNode,但是没有对应的Block。p包含状态名称,将转换为VNode和Block。当模板所在组件触发name状态变化时,需要依次创建并比较section、div、p的VNode。有了预编译技术,只需要遍历Block数组进行比较即可。使用上面的例子,只需要比较一个li节点:在这种情况下,虽然使用了使用虚拟DOM的组件级更新框架,但已经非常接近节点级更新框架。总结本文根据更新粒度介绍了三种不同类型的框架,以及Vue3在选择JSX和模板语法时在灵活性和更新粒度之间的灵活变化。可以说是符合中庸之道。可能有人会问,大部分使用Vue3的用户都能接受模板语法,为什么不干脆抛弃虚拟DOM,使用预编译技术实现真正的节点级更新呢?一方面,虚拟DOM将框架与具体的视图层分离,使得跨设备渲染更加方便。另一方面,Vue2社区生态积累了大量基于虚拟DOM的类库。如果是你,在这种情况下你会做出怎样的选择?