Vnode是如何产生的?

源码 流程图

在这里插入图片描述

源码解读

Vue.js2.0中有两种生成方式:第一种是直接在Vue对象的option中添加render字段;第二种是像Vue.js 1.x版本那样写一个模板或者指定一个el根元素,它会首先转换成模板,经过HTMI语法解析器生成一个 ast 抽象语法树,对语法树做优化,然后把语法树转换成代码片段,最后通过代码片段生成function添加到option的render字段中。
在整个过程中,特别值得一提的是ast语法树优化的过程,它主要做了两件事情:

  1. 会检测出静态的class名和attributes,这样它们在初始化渲染之后就永远都不会再被比
    对了。
  2. 会检测出最大的静态子树(就是不需要动态性的子树)并且从渲染函数中萃取出来。这
    样在每次重渲染时,它就会直接重用完全相同的Vnode,同时跳过比对。
    接下来我们可以通过一段简单的代码看一下编译后的渲染函数。代码示例如下:
<div id="app">
<h1>Hello {{who}}</h1>
</div>

<script>
new Vue({
	el:'#app',
	data:{
		who:'DDFE'
	}
})
</script>

经过一系列的编译操作之后生成的render方法。示例如下:

with (this) (
return _h(_e('div',
{staticAttrs;{"id":"app"}}),
[_h(_e('h1'),]
[("Hello "+ _s(who))]
})

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 03:06:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 03:06:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 03:06:03       87 阅读
  4. Python语言-面向对象

    2024-04-22 03:06:03       96 阅读

热门阅读

  1. 【面经】4月9日 腾讯/csig/腾讯云/一面/1h30m

    2024-04-22 03:06:03       33 阅读
  2. LeetCode 3.无重复字符发最长字串

    2024-04-22 03:06:03       39 阅读
  3. 提高写作效率:ChatGPT写作攻略

    2024-04-22 03:06:03       40 阅读
  4. 修改Ubuntu的镜像源为清华镜像源

    2024-04-22 03:06:03       34 阅读
  5. lv_table

    2024-04-22 03:06:03       31 阅读
  6. 关于UAC标准音频数据传输端点的最大包长问题

    2024-04-22 03:06:03       36 阅读
  7. 算法:堆(优先队列)

    2024-04-22 03:06:03       40 阅读