当前位置: 首页 > 科技观察

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

时间:2023-03-14 15:12:10 科技观察

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