关于 mountComponent 错误处理的疑惑
来源:2-3 Vue 实例挂载的实现

qq_漫笔_0
2021-10-11
位于 core/instance/lifeCycle
想请教下黄老师,
第一个警告为什么需要增加这样的判断,不加可不可以?
第二个警告,什么情况下会出现未定义 template 而导致 mountComponent 错误 ?
3回答
-
qq_漫笔_0
提问者
2021-10-11
自问自答环节:
关于第一个问题,在网上查了很多资料,依旧一无所获。
于是到 github 看了下 vue 的 commit 记录,发现早期 v2.1 版本时并没有这个条件判断,该条件判断来源于此条 issue : https://github.com/vuejs/vue/issues/4171结论: 为了避免使用完整版构建时 空的 <teamplate> 命中第一条警告的条件判断,对开发者产生误导。
因为有 template 选项会优先使用template 而不是 el 选项 生成模板,teamplate 有两种定义方式,一种是 domNode,一种是 string,string可以传入两种,一种是 domString,另一种是 id 选择器。如果使用 domString,使用完整版构建没有任何问题,如果使用 id 选择器,而对应的 teamplate 的 innerHTML 正好为 空,则不会生成 render 函数,如果没有图中标注的条件判断,则会抛出“You are using the runtime-only build...”的错误,即使当前正在使用的是独立构建版本。
为此,vue后来新增了这一条判断逻辑,并在 开发模式下 $mount 中如果 template 为空,会抛出警告!40 -
qq_漫笔_0
提问者
2021-10-11
如上所述
00 -
qq_漫笔_0
提问者
2021-10-11
第二个问题我似乎明白了点,第二个警告是一个更宽泛的警告,既可能是因为使用完整版vue未生成render函数引起,也可能是因为使用运行时vue未定义render函数引起。
具体来说,完整版vue未生成render函数,就是因为 template 未取到,template来源两种,template定义 然后是 el 的outerHTML。012021-10-12
相似问题
回答 1
回答 1