本篇内容主要讲解“Vue编译优化的实现流程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue编译优化的实现流程是什么”吧!对于一个普通模板文件,如果只是标签中的内容发生了变化,那么最简单的更新方法很明显是直接替换标签中的文本内容。但是diff算法很明显做不到这一点,它会重新生成一棵虚拟DOM树,然后对两棵虚拟DOM树进行比较。很明显,与直接替换标签中的内容相比,传统diff算法需要做很多无意义的操作,如果能够去除这些无意义的操作,将会省下一笔很大的性能开销。其实,只要在模板编译时,标记出哪些节点是动态的,哪些是静态的,然后再通过虚拟DOM传递给渲染器,渲染器就能根据这些信息,直接修改对应节点,从而提高运行时性能。对于一个传统的模板:
{{bar}}
在这个模板中,只用{{ bar }}是动态内容,因此在bar变量发生变化时,只需要修改p标签内的内容就行了。因此我们在这个模板对于的虚拟D免费云主机域名OM中,加入patchFlag属性,以此来标签模板中的动态内容。对于不同的数值绑定,我们分别用不同的patch值来表示:数字1,代表节点有动态的textContent数字2,代表节点有动态的class绑定数字3,代表节点有动态的style绑定数字4,其他…我们可以新建一个枚举类型来表示这些值:这样我们就在虚拟DOM的创建阶段,将动态节点提取出来:首先我们创建收集动态节点的逻辑。然后,我们在创建虚拟节点的时候,对动态节点进行收集。然后我们修改组件渲染函数的逻辑。由于我们标记了不同的动态节点类型,因此我们可以针对性的完成靶向更新。组件的根节点必须作为Block角色,这样,从根节点开始的所有动态子代节点都会被收集到根节点的dynamicChildren数组中。除了根节点外,带有v-if、v-for这种结构化指令的节点,也会被作为Block角色,这些Block角色共同构成一棵Block树。假设有以下模板
statictext
{{title}}
默认情况下,对应的渲染函数为:在这段代码中,当ctx.title属性变化时,内容为静态文本的p标签节点也会跟着渲染一次,这很明显式不必要的。因此,我们可以使用“静态提升”,即将静态节点,提取到渲染函数之外,这样渲染函数在执行的时候,只是保持了对静态节点的引用,而不会重新创建虚拟节点。除了静态节点,对于静态props我们也可以将其进行静态提升处理。除了对节点进行静态提升外,我们还可以对于纯静态的模板进行预字符化。对于这样一个模板:我们完全可以将其预处理为:这么做的优势:大块的静态内容可以通过innerHTML直接设置,在性能上具有一定优势减少创建虚拟节点带来的额外开销减少内存占用当为组件添加内联事件时,每次新建一个组件,都会为该组件重新创建并绑定一个新的内联事件函数,为了避免这方面的无意义开销,我们可以对内联事件处理函数进行缓存。v-once指令可以是组件只渲染一次,并且即使该组件绑定了动态参数,也不会更新。它与内联事件一样,也是使用了缓存,同时通过setBlockTracking(-1)阻止该VNode被Block收集。v-once的优点:避免组件更新时重新创建虚拟DOM带来的性能开销避免无用的Diff开销到此,相信大家对“Vue编译优化的实现流程是什么”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
相关推荐: 怎么实现HTTPS POST发送FORM表单参数返回Json
今天小编给大家分享一下怎么实现HTTPS POST发送FORM表单参数返回Json的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。依赖工具类以上就…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。