Vue3 中模板编译做了哪些优化,你知道吗?

1 PatchFlags 优化

在 Vue.js 中,patchFlags 是用于标记虚拟 DOM 节点状态的一个标志位,用于指示虚拟 DOM 节点在 diff 过程中的一些特性。通过 patchFlags,Vue.js 可以在更新视图时更高效地判断和处理节点的变化,从而提高性能。

以下是关于 patchFlags 的一些描述:

  • 作用:patchFlags 主要用于标记虚拟 DOM 节点的状态,例如节点是否为动态节点、节点是否含有动态内容、节点是否为有状态组件等信息,以便在 diff 过程中进行优化处理。
  • 优化:通过 patchFlags,Vue.js 可以在 diff 算法中快速识别哪些节点需要深入比较更新,哪些节点可以直接跳过,从而减少不必要的比较操作,提高更新性能。
  • 标记类型:常见的 patchFlags 标记类型包括静态节点、动态节点、有状态组件等,不同的标记类型对应不同的处理逻辑,有助于优化 diff 过程。
  • 动态设置:在更新虚拟 DOM 时,Vue.js 会动态设置节点的 patchFlags,根据节点内容的变化情况来确定节点的状态,以便后续的 diff 过程可以根据这些标记进行优化处理。
  • 性能提升:通过合理地使用 patchFlags,可以减少不必要的比较和更新操作,降低 diff 算法的复杂度,从而提高 Vue.js 应用的性能和响应速度。
    总的来说,patchFlags 在 Vue.js 中扮演着重要的角色,用于优化虚拟 DOM 的 diff 过程,通过标记节点的状态信息,帮助框架更高效地处理视图更新,提升应用性能。合理使用 patchFlags 可以在大型应用或频繁更新的场景下发挥重要作用,是 Vue.js 内部优化的关键机制之一。
<div>
  <h1>Hello Jiang</h1>
  <span>{
   {
   name}}</span>
</div>

此 template 经过模板编译会变成以下代码:

const {
   
  createElementVNode: _createElementVNode,
  toDisplayString: _toDisplayString,
  createTextVNode: _createTextVNode,
  openBlock: _openBlock,
  createElementBlock: _createElementBlock,
} = Vue;

return function render(_ctx, _cache, $props, $setup, $data, $options) {
   
  return (
    _openBlock(),
    _createElementBlock("div", null, [
      _createElementVNode("h1", null, "Hello Jiang"),
      _createTextVNode(),
      _createElementVNode(
        "span",
        null,
        _toDisplayString(_ctx.name),
        1 /* TEXT */
      ),
    ])
  );
};

2.创建虚拟节点

生成的虚拟 DOM 是:

{
   
	type: "div",
    __v_isVNode: true,
    children:[
       {
   type: 'h1', props: null, key: null,}
       {
   type: Symbol(), props: null, key: null,}
	   {
   type: 'span', props: null, key: null,}
    ],
    dynamicChildren:[{
   type: 'span', children: _ctx.name, patchFlag: 1}]
}```

此时生成的虚拟节点多出一个 dynamicChildren 属性。这个就是 block 的作用,block 可以收集所有后代动态节点。这样后续更新时可以直接跳过静态节点,实现靶向更新

动态标识

```javascript
export const enum PatchFlags {
   
  TEXT = 1<
  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值