1.请你说说Vue的模板编译是如何做的呢?
答:分为三个步骤:
-
模板解析阶段:将一堆模板字符串用正则等方式解析成抽象语法树
AST; -
优化阶段:遍历
AST,找出其中的静态节点,并打上标记;首先,先判断节点的type是多少,如果是1,那么就是元素节点,如果是2,那么就是包含变量的动态文本节点,如果是3,那就是不包含变量的纯文本节点。节点为1,需要进一步判断, 如果节点使用了v-pre指令,那就不是静态节点; 如果节点没有使用v-pre指令,那就必须满足以下几个条件才是静态节点: 不能使用动态绑定语法,即标签上不能有v-、@、:开头的属性; 不能使用v-if、v-else、v-for指令; 不能是内置组件,即标签名不能是slot和component; 标签名必须是平台保留标签,即不能是组件; 当前节点的父节点不能是带有 v-for 的 template 标签; 节点的所有属性的 key 都必须是静态节点才有的 key,注:静态节点的key是有限的,它只能是type,tag,attrsList,attrsMap,plain,parent,children,attrs之一; 在标记完是否是静态节点后,还要对子节点进行判断,如果某一个子节点不是静态节点,那父节点也不是静态节点; 节点为2,就不是静态节点; 节点为3,就是静态节点
-
代码生成阶段:将
AST转换成渲染函数;AST的解析结果可以参考这个
渲染函数如下: