Vue 中 template 有且只能一个 root的原因解析(源码分析)

2020-06-16 06:58:15易采站长站整理
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
的逻辑,即此时字符串已经处理完了,但是这个结束标签对应的