vue原理Compile之optimize标记静态节点源码示例

yizhihongxing

Vue的Compile阶段是将模板解析成AST并分析依赖收集,生成渲染函数的阶段。在这个阶段,Vue会对静态节点进行标记,优化渲染性能。其中,有一个关键的标记项就是 optimize。

optimize的主要作用是标记已知的静态根节点。如果一个静态节点不是根节点,那么其子节点将可能会发生变化,需要被重新渲染。但是,如果该节点被标记为静态节点,则可以避免对其进行不必要的渲染。而且因为它的子节点是静态的,所以它们也会被标记为静态节点。

下面是一个例子,演示如何使用 optimize 标记静态节点。

<template>
  <div>
    <div class="static-text">This is a static text.</div>
    <p>{{dynamicText}}</p>
  </div>
</template>

在编译过程中,Vue会将其转化为AST节点,代码如下:

{
  tag: 'div',
  children: [
    {
      tag: 'div',
      attrsList: [
        {name: 'class', value: 'static-text'}
      ],
      static: true, // 静态节点标记
      parent: [Circular],
      type: 1,
      children: [
        {
          text: 'This is a static text.',
          type: 3
        }
      ]
    },
    {
      tag: 'p',
      parent: [Circular],
      type: 1,
      children: [
        {
          expression: '_s(dynamicText)', // 动态文本节点不是静态节点,不做标记
          text: '{{dynamicText}}',
          type: 2
        }
      ]
    }
  ]
}

在AST节点中,静态节点的 type 属性会被标记为 1,同时还会设置 static 属性为 true。这样,在执行 render 函数时,Vue就知道哪些节点可以被优化为静态节点。

下面再看一个 more 示例,更加直观地演示了 optimize 如何标记静态节点。

<template>
  <div>
    <div class="static-text" v-if="isShow">This is a static text.</div>
    <p>{{dynamicText}}</p>
  </div>
</template>

在编译过程中,会产生如下 AST 节点:

{
  tag: 'div',
  children: [
    {
      type: 12,
      expression: '_c("div",{staticClass:"static-text"},[_v("This is a static text.")],1)', // 运行时渲染函数表达式
      static: false, // 非静态
      ifConditions: [
        {
          exp: 'isShow',
          block: [Circular]
        }
      ]
    },
    {
      tag: 'p',
      parent: [Circular],
      type: 1,
      children: [
        {
          expression: '_s(dynamicText)',
          text: '{{dynamicText}}',
          type: 2
        }
      ]
    }
  ]
}

在这个例子中,由于 v-if 指令的存在,static 属性被标记为 false。因为 v-if 指令会根据条件动态地插入/移除节点,所以由 v-if 生成的节点不可能是静态节点。这时,Vue 会优先考虑标记那些不被 v-if 控制的静态节点。这也是 optimize 标记静态节点的难点所在。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue原理Compile之optimize标记静态节点源码示例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 优化Vue中date format的性能详解

    好的。 首先,你需要知道在 Vue.js 中如何处理日期格式化的问题。你可以使用 moment.js 或者 date-fns 等第三方库。这些库能够让日期处理变得更加方便和可靠。 但是,使用第三方库会引入额外的代码和依赖,可能会影响网站的性能。因此,优化日期格式化的性能就变得十分必要。 以下是优化日期格式化性能的几个步骤: 步骤一:避免重复计算 Vue 中的…

    Vue 2023年5月29日
    00
  • vue项目的创建的步骤(图文教程)

    下面是详细讲解Vue项目的创建的步骤: 1. 安装Vue CLI Vue CLI是一个构建Vue项目的官方脚手架工具,使用它可以快速生成一个基于Vue的项目结构,我们需要事先安装它。 可以使用以下命令安装Vue CLI: npm install -g @vue/cli 其中 -g 参数表示全局安装,如果已经安装过Vue CLI,则可以直接跳过此步。 2. 创…

    Vue 2023年5月27日
    00
  • Vue.js第二天学习笔记(vue-router)

    Vue.js第二天学习笔记(vue-router) Vue-router 是 Vue.js 官方的路由插件,它和 Vue.js 的核心深度集成,可以非常方便地进行 Web 应用程序的路由控制管理。在学习 Vue.js 前端开发过程中,理解和掌握 Vue-router 的使用是非常重要的。 安装与引用 安装 Vue-router 可以使用 npm 或者引用 C…

    Vue 2023年5月27日
    00
  • Vue 中对图片地址进行拼接的方法

    当我们在 Vue 中需要加载图片时,有时候需要动态地拼接图片的地址。下面我为大家提供两种常用方法来实现这个需求。 方法一:使用插值表达式 我们可以使用 Vue 的插值表达式来动态地拼接图片地址,具体过程如下: <template> <div> <img :src="imagePath + imageName"…

    Vue 2023年5月28日
    00
  • vue3.0-props、computed、自定义事件方式

    我来为您详细讲解一下关于Vue 3.0中的props、computed和自定义事件的使用方法。 Vue 3.0 – Props Props是Vue中用于向子组件传递数据的一种方式。用法如下: 在父组件中,通过在子组件的标签上使用属性(props),向子组件传递数据: <template> <div> <child-compone…

    Vue 2023年5月28日
    00
  • vue2.0开发实践总结之疑难篇

    Vue2.0开发实践总结之疑难篇攻略 在Vue2.0开发实践中,我们经常会遇到一些疑难问题。本攻略主要介绍Vue2.0开发中的一些常见疑难问题及其解决方法。 1. Vue组件中引入CSS文件 使用Vue开发时,可以使用<style>标签将样式写在组件内部,但是当我们需要引入外部的CSS文件时应该怎么办?我们可以使用@import或<link…

    Vue 2023年5月28日
    00
  • vue中的scope使用详解

    Vue中的Scope使用详解 在Vue中,我们可以通过在模板中使用v-for指令来遍历数据,然后使用v-bind或简写方式:将数据传递给子组件。但是,有时候我们需要将数据传递到子组件中,而不需要在父级模板中显示这些数据。为了实现这一点,Vue提供了scope属性,这可以让我们创建一个只传递特定数据子组件的插槽。 父组件和子组件之间使用Scope 假设我们有以…

    Vue 2023年5月27日
    00
  • vue实现留言板todolist功能

    下面我将为您提供详细的“vue实现留言板todolist功能”的完整攻略。 确定用户需求和页面结构 在开始开发之前,我们需要先确定用户的需求和页面结构。在这个例子中,我们假设用户需要有一个留言板和一个todolist功能。我们可以基于这个需求来确定页面结构,一般来说,可以使用下面的结构。 <template> <div> <!-…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部