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

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前端测试开发watch监听data的数据变化

    当我们在使用Vue进行前端开发时,数据是我们不可避免的要处理的部分。而在开发时,我们需要不断地验证各种场景下数据的正确性,这就需要我们进行前端测试开发。 Vue为我们提供了watch属性,可以监听指定变量的变化并在变化时进行一些操作,如更新DOM或调用我们自己的函数等。 下面是watch监听data数据变化的完整攻略: 步骤1:为要监听的数据添加watch属…

    Vue 2023年5月29日
    00
  • Vue插件报错:Vue.js is detected on this page.问题解决

    当我们在使用Vue插件进行开发时,有时候会遇到如下报错信息: Vue.js is detected on this page. 这个报错信息的意思是,页面中已经存在了一个Vue实例,而插件试图再次创建Vue实例,从而导致冲突。一般情况下,这个报错信息会与具体的错误信息一起显示。 解决这个问题的方法有两类: 调整插件的使用方式,避免与现有的Vue实例产生冲突。…

    Vue 2023年5月27日
    00
  • 通过vue-cli3构建一个SSR应用程序的方法

    构建一个SSR应用程序的过程相比较普通的SPA应用程序增加了许多复杂操作,但是通过Vue-cli3进行构建,可以简化这个过程。以下是构建一个SSR应用程序的详细步骤: 安装Vue-cli3 如果尚未安装Vue-cli3,请使用以下命令安装: npm install -g @vue/cli 创建一个Vue项目 vue create my-ssr-app cd …

    Vue 2023年5月27日
    00
  • 如何使用HBuilderX把vue项目打包成apk

    下面是使用HBuilderX将Vue项目打包成APK的攻略: 确保环境配置正确 在使用HBuilderX打包Vue项目之前,需要先确保一些环境配置已经正确安装。具体需要安装的软件如下: JDK环境:移动端应用打包需要使用到Java环境,所以首先需要下载和安装JDK。下载JDK的网址为:https://www.oracle.com/technetwork/cn…

    Vue 2023年5月28日
    00
  • 详解使用VueJS开发项目中的兼容问题

    详解使用VueJS开发项目中的兼容问题 当我们使用VueJS开发项目时,兼容问题是我们需要关注的一个重要因素。在不同的浏览器、不同的设备上,VueJS可能表现出不同的行为,甚至会出现兼容性问题。本文将从以下几个方面来讲解VueJS的兼容问题。 1. 兼容性测试 在开发VueJS项目时,我们应该在不同的浏览器和设备上测试项目的兼容性。可以使用一些自动化测试工具…

    Vue 2023年5月27日
    00
  • vue的常用组件操作方法应用分析

    下面我就来详细讲解一下vue的常用组件操作方法应用分析。 一、组件的创建 Vue的组件是由Vue的实例构造器Vue.extend()生成的。使用组件,我们需要先定义它,然后在Vue实例的components属性中声明,最后在模板中使用即可。 1. 定义组件 定义组件就是定义一个Vue的实例构造器,它包括组件的名称、模板、数据、方法等。 // 定义组件 var…

    Vue 2023年5月27日
    00
  • 前端Vue单元测试入门教程

    关于“前端Vue单元测试入门教程”的完整攻略,我可以从以下几个方面进行详细讲解: 1. 什么是单元测试 单元测试是一种软件测试技术,它是对代码中最小的可测试单元进行检查和验证,以保证该单元代码的功能符合定义的要求。单元测试通常是前端开发中的必要流程,它可以帮助开发者在开发过程中及时发现问题,减少开发周期,保证代码的可靠性和稳定性。 2. Vue单元测试的基本…

    Vue 2023年5月28日
    00
  • vue.js或js实现中文A-Z排序的方法

    我来给你讲一下“vue.js或js实现中文A-Z排序的方法”的完整攻略。 1. 安装第三方库 pinyin 在 Vue.js 或 js 中实现中文 A-Z 排序需要用到拼音转换,我们可以使用第三方库 pinyin。可以在终端中运行以下指令进行安装: npm install pinyin –save 2. 调用 pinyin 库进行排序 2.1 Vue.js…

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