root 的组件,在
parse 的时候,即生成
AST 抽象语法树的时候,
Vue 就会过滤掉多余的
root ,只认第一个
root 。而
parse 的整个过程,其实就是正则匹配的过程,并且这个过程会用栈来存储起始标签。整个
parse 过程的流程图:
然后,我们通过一个例子来分析一下,其中针对多
root 的处理。假设此时我们定义了这样的
template :
<div><span></span></div><div></div>显然,它是多
root 的。而在处理第一个
<div> 时,会创建对应的
ASTElement ,它的结构会是这样:
{
type: 1,
tag: "div",
attrsList: [],
attrsMap: {},
rawAttrsMap: {},
parent: undefined,
children: [],
start: 0,
end: 5
}而此时,这个
ASTElement 会被添加到
stack 中,然后删除原字符串中的
<div> ,并且设置
root 为该
ASTElement 。然后,继续遍历。对于
<span> 也会创建一个
ASTElement 并入栈,然后删除继续下一次。接下来,会匹配到
</span> ,此时会处理标签的结束,例如于栈顶
ASTElement 的
tag 进行匹配,然后出栈。接下来,匹配到
</div> ,进行和
span 同样的操作。最后,对于第二个
root 的
<div> ,会做和上面一样的操作。但是,在处理
</div> 时,此时会进入判断
multiple root 的逻辑,即此时字符串已经处理完了,但是这个结束标签对应的










