关于 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 为空,会抛出警告!

4
0

qq_漫笔_0

提问者

2021-10-11

如上所述

0
0

qq_漫笔_0

提问者

2021-10-11

第二个问题我似乎明白了点,第二个警告是一个更宽泛的警告,既可能是因为使用完整版vue未生成render函数引起,也可能是因为使用运行时vue未定义render函数引起。
具体来说,完整版vue未生成render函数,就是因为 template 未取到,template来源两种,template定义 然后是 el 的outerHTML。

0
1
ustbhuangyi
对的,如果使用 CDN 版本的 Vue.js,而不是 SFC,是可能出现定义组件既没有定义 render 函数,也没有定义 template 的情况
2021-10-12
共1条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4986 学习 · 1038 问题

查看课程