我可以在未注册的组件上构建Vue.js失败吗?

scn*_*iro 8 javascript vue.js vuejs2

考虑以下组件模板...

<template>
  <Unknown></Unknown>
</template>
Run Code Online (Sandbox Code Playgroud)

... Unknown可能是也可能不是全球注册的组件。在运行时,我将遇到此信息错误:

[Vue警告]:未知的自定义元素:-您是否正确注册了组件?对于递归组件,请确保提供“名称”选项。

[...]

但是,对于我的用例,我想强制在构建时不会发生这种情况。当前,vue-cli-service build在这种情况下执行成功的构建,然后在运行时显示错误(此时无用)。

我很好奇是否有一种方法可以内省地捕捉到这个潜在的问题并导致构建失败。我希望发现一个--strict禁止出现这种情况的标志(或类似标志)。

我什至对模板编译器组件编译器进行了试验,以查看是否可以通过手动检查来捕获它,令人震惊的是,没有错误报告。

有任何想法吗?


这是我提到的使用更低级别的component-compiler-utils更详细的实验。这应该便于观察相同的结果。请注意,两个错误报告字段都为空!

"dependencies": {
  "@vue/component-compiler-utils": "3.0.0",
  "vue-template-compiler": "2.6.10"
}
[...]
Run Code Online (Sandbox Code Playgroud)
"dependencies": {
  "@vue/component-compiler-utils": "3.0.0",
  "vue-template-compiler": "2.6.10"
}
[...]
Run Code Online (Sandbox Code Playgroud)

ber*_*nie 5

我很遗憾地说,我认为答案是这是不可能的。请查看文档的组件注册部分,了解与我的解释相关的背景信息。

自从:

  1. 组件可以动态注册(Vue.component('MyComponent', { /* ... */ })在 Vue 应用程序生命周期内的任何时间。
  2. 组件可以通过插件添加,甚至可以在初始化后异步添加。
  3. 组件可以动态使用
  4. 组件名称是简单的字符串,而不是某种形式的枚举或应用程序中允许名称的等效“固定”注册表。

代码分析器没有通用的方法来实现您的要求。考虑到上述情况,我对您尝试的所有选项均未报告错误并不感到惊讶。事实上,相反的情况会令人惊讶,因为它不适用于插件注册的组件。实际上,在运行时之前没有其他方法可以知道命名组件是否可用。

也就是说,我尝试编写一个单元测试来实例化一个使用未知组件的组件。我在控制台中收到相同的“未知自定义元素...”警告,但由于没有抛出任何内容,因此测试不会失败!无赖...我看了一眼那个警告源代码,不幸的是没有任何地方注册来记录丢失的组件。

另一种选择是执行挂载组件的单元测试,然后通过vm.$refs或 DOM 元素检查所需的组件是否实际呈现。不过,这似乎很麻烦,而且需要大量维护。

但是,我想我找到了一个很好的钩子来获得警告!退房Vue.config.warnHandler。您可以warnHandler在安装组件的测试中添加一个,并检查是否没有发出有关丢失元素的警告。