美文网首页程序员
Vue 3.0 给我们带来哪些惊喜(1)- 更快虚拟DOM渲染

Vue 3.0 给我们带来哪些惊喜(1)- 更快虚拟DOM渲染

作者: zidea | 来源:发表于2019-03-12 07:36 被阅读48次

    目标

    让大家更好地理解 vue 3.0 中对性能进行优化的机制

    参考尤雨溪的有关 vue 3.0 中性能提升和新特性的分享

    vue 3.0 的目标

    • 更快
    • 更小
    • 更容易维护
    • 更容易和 native 集成,更好的多端支持
    • 让开发更轻松

    以上就是 Vue 3.0 的特点和目的。主要提高性能。尽可能兼容 vue 2.0 API, 让 vue2.0 的用户付出最小的成本平滑过渡到 vue 3.0。

    更快

    1. 新的 vdom 实现

    如何实现 React 中的虚拟 DOM (上)
    如何实现 React 中的虚拟 DOM (下)

    • 在 vue 3.0 中我们重新推翻后重写了虚拟 DOM 的实现,100% 提升了 mounting 和 patching。在一些细节地方下了很多功夫。官方宣称渲染速度最快可以翻倍。
      更多编译时的优化以减少运行时的开销
      vdom 在运行时有许多潜在的开销,例如模板里有许多不可变动地方,而 vdom 会从新生成对应的节点。然后进行比对,这些操作做很多情况下是不必要的。这也是很多开发者在重新审视 vdom 的性能。可以在编译阶段对模板进行分析,来减少运行时的开销。
      示例
    Template = 
    `
    <Comp>
        <div>
            <span></span>
        </di>
    </Comp
    `
    
    render(){
        const Comp = resolveComponent('Comp',this)
        return createFragment([
            createComponentVNode(Comp,null,null,0),
            createElementVNode('div',null,[
                createElementVNode('span',null,null,0)
            ],2)
        ],8) /** */
    }
    
    • 通过编译时区分自定义组件和原生元素,然后在运行时分别调用不同的方法
    • 无论是常见自定义组件 createComponentVNode 和生产原生元素对应vnode 的方法 createComponentVNode 参数都是一致的
      现在将模板作为字符串传入 h 函数,然后生成 vnode 。在 vue2.0 对于原生元素(如div)和自定义组件(例如v-component),是在运行时进行区分的。说明判断需要进行开销。
      我们可以在编译时进行处理,运行时就不再判断直接生成原生元素对应的 vdom 。
      如果是组件,就直接生成对应vdom组件。
      在生成虚拟Dom, 我们的函数调用尽量形状一致,也就是具有同样的参数。这样更容易被 javascript 引擎进行优化。
      还可以在模板中直接静态的分析元素包含的子元素的类型。 div 包含 span 一个节点。我们就可以给代码留下 hint 来避免更多判断。就避免不必要的遍历。
      优化 slot 的生成
      如果每一次 首先会更新父组件然后再生成子组件。这也就是父子关联更新。同时触发了两个组件更新。把所有 slot 都生成 scope slot。生成一个lazy 的函数,当你把函数传入给子组件,由组件来决定什么时候调用这个函数。

    着进行预判或者预处理。然后运行时少了一些推测的工作

    • ,这样无疑是影响应用的性能。可以在编译阶段对着进行预判或者预处理。然后运行时少了一些推测的工作。也就是把原生元素和自定义组件进行区分然后分别处理。
    • 通过增模板的加编译时间,这就是意味着减少运行时间。解释 component fast path

    相关文章

      网友评论

        本文标题:Vue 3.0 给我们带来哪些惊喜(1)- 更快虚拟DOM渲染

        本文链接:https://www.haomeiwen.com/subject/qhvosqtx.html