vue/vue2.0/模板编译原理

27 阅读2分钟

笔记

  • 渲染的整个过程 image.png
  • 模板编译就是将模板(tempalte)里面的html内容转化成渲染函数的过程。它的工作流程:
  1. 先将模板转化成ast(细分为解析器功能),
  2. 再遍历ast标记静态节点(细分为优化器功能),
  3. 最后用ast生成渲染函数(细分为代码生成器功能)。

模板编译

模板编译就是将模板(tempalte)里面的html内容转化成渲染函数的过程。

解析器(template转ast)

将template转成ast的过程,由如下几个解析器组合而成。

  • HTML解析器
  • 文本解析器
  • 过滤器解析器

HTML解析器

解析HTML模板的过程就是循环的过程,简单来说就是用HTML模板字符串来循环,每轮循环都从HTML模板中截取一小段字符串,然后重复以上过程,直到HTML模板被截成一个空字符串时结束循环,解析完毕。

文本解析器

文本解析器是对HTML解析器解析出来的文本进行二次加工。文本分两种类型,一种是纯文本,另一种是带变量的文本。如果是纯文本,不需要进行任何处理;但如果是带变量的文本,那么需要使用文本解析器进一步解析。因为带变量的文本在使用虚拟DOM进行渲染时,需要将变量替换成变量中的值。

优化器(ast标记静态节点)

优化器的作用是在AST中找出静态子树并打上标记,这一步是为patch服务的。

工作流程:

  • (1) 在AST中找出所有静态节点并打上标记;
  • (2) 在AST中找出所有静态根节点并打上标记。

静态节点:永远都不会变化的节点

静态节点举例:p为静态节点

<p>我是静态节点,我不需要发生变化</p>

静态根节点:一个节点下面的所有子节点都是静态节点

静态根节点举例:ul为静态根节点

<ul>
    <li>我是静态节点,我不需要发生变化</li>
    <li>我是静态节点2,我不需要发生变化</li>
    <li>我是静态节点3,我不需要发生变化</li>
</ul>

代码生成器(ast变渲染函数字符串)

将AST转换成渲染函数中的内容,这个内容可以称为代码字符串。 image.png 变成如下: image.png

参考资料

微信读书:深入浅出vue.js