Vue template到render的过程

过程分析

vue的模板编译过程主要如下:template -> ast -> render函数

vue在模板编译版本的源码中会执行compileToFunctions将template转化为render函数

// 将模板编译为render函数
const { render, staticRenderFns } = compileToFunctions(template,optinos//省略}, this)

compileToFunctions中的主要逻辑如下:

1.调用parse方法将template转化为ast(抽象语法树)

const ast = parse(template.trim(),options)

parse的目标:是把template转换为AST树,它是一种用JavaScript对象的形式来描述整个模板

解析过程:利用正则表达式顺序解析模板,当解析到开始标签、闭合标签、文本的时候都会分别执行对应的回调函数,来达到构造AST树的目的

AST元素节点总共三种类型:type为1表示普通元素,2为表达式,3为纯文本

2.对静态节点做优化

optimize(ast,options)

这个过程主要分析出哪些是静态节点,给其打一个标记,为后序更新渲染可以直接跳过静态节点做优化

深度遍历AST,查看每个子树的节点元素是否为静态节点或者静态节点根。如果为静态节点,它们生成的DOM永远不会改变,这对运行时模板更新起到了极大的优化作用。

3.生成代码

const code = generate(ast, options)

generate将ast抽象语法树编译成render字符串,并将静态部分放到staticRenderFns中,最后通过new Function(render)生成render函数。