ASTElement 并不等于我们最初定义的
root 。所以此时就会报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
而且,该
ASTElement 也不会加入最终的
AST 中,所以之后也不可能会出现多个
root 的情况。同时,这个报错也提示我们如果要用多个
root ,需要借助
if 条件判断来实现。可以看出,
template 编译的最终的目标就是构建一个
AST 抽象语法树。所以,它会在创建第一个
ASTElement 的时候就确定
AST 的
root ,从而确保
root 唯一性。2.2 _render 过程
不了解
Vue 初始化过程的同学,可能不太清楚
_render 过程。你可以理解为渲染的过程。在这个阶段会调用
render 方法生成
VNode ,以及对
VNode 进行一些处理,最终返回一个
VNode 。而相比较
template 编译的过程,
_render 过程的判断就比较简洁:
if (!(vnode instanceof VNode)) {
if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {
warn(
'Multiple root nodes returned from render function. Render function ' +
'should return a single root node.',
vm
);
}
vnode = createEmptyVNode();
}前面在讲
createElement 的时候,也讲到了
render() 需要返回
VNode 。所以,这里是防止部分骚操作,
return 了包含多个
VNode 的数组。结语
通过阅读,我想大家也明白了 为什么 Vue 中 template 有且只能一个 root ? 。
Vue 这样设计的出发点可能很简单,为了减少挂载时










