KNXCloud / lowcode-engine-vue

Lowcode engine renderer and simulator for vue
MIT License
356 stars 76 forks source link

警告提示疑问 #43

Closed winixt closed 1 year ago

winixt commented 2 years ago

判断条件是 __vue_app__ 为什么提示的是 __vnode ? 应该是 __vnode ?

  if (!isCommentNode(el) && !('__vue_app__' in el)) {
    warn('__vnode 没有找到,请使用 vue 非生产环境版本');
    warn('https://unpkg.com/vue/dist/vue.runtime.global.js');
  }
keuby commented 2 years ago

https://github.com/KNXCloud/lowcode-engine-vue/blob/139272c267cf6a31c12b69e1941f86c66bbef285/packages/vue-simulator-renderer/src/utils/closest-node.ts?_pjax=%23js-repo-pjax-container#L12-L28

19 行的时候 isVNodeHTMLElement 已经判断过 __vueParentComponent 属性了,这个属性不存在时 __vnode 必定也不会存在。

但是 getClosestNodeInstance 方法在查询的时候,如果没找到会往父级继续查找,最终会找到根元素节点,也就是 mount 方法挂载的那个元素,这个元素是没有 __vnode 的,而是 __vue__app__,所以要排掉这种可能。如果 __vue_app____vnode 都没有找到,那就说明用户用的是生产环境版本的 vue 运行时

winixt commented 2 years ago

我感觉在这里判断不合理,比如用了 v-html 指令,插入一个 p 标签,鼠标放上去:

  1. 进入 getClosestNodeInstance
  2. isVNodeHTMLElementfalse
  3. 因为是一个常规的节点,iftrue
  4. 打印警告
  5. 但是 getClosestNodeInstanceByElement 向上能找到真实的 vue 组件

这里的警告是不是可以放在初始化的时候直接判断就好了?例如判断 window.devtoolsFormatters 是否有值

keuby commented 2 years ago

我感觉在这里判断不合理,比如用了 v-html 指令,插入一个 p 标签,鼠标放上去:

  1. 进入 getClosestNodeInstance
  2. isVNodeHTMLElementfalse
  3. 因为是一个常规的节点,iftrue
  4. 打印警告
  5. 但是 getClosestNodeInstanceByElement 向上能找到真实的 vue 组件

这里的警告是不是可以放在初始化的时候直接判断就好了?例如判断 window.devtoolsFormatters 是否有值

这个警告判断放在这里确实不太好,因为这个方法会频繁触发,但是这个警告应该只需要打印一次就好了。使用 window.devtoolsFormatters 属性来判断是个非常棒的建议。