Html 自定义库组件不是已知元素,但应用程序编译并运行
问题 我的html文件警告我的自定义组件/管道“不是已知元素”。但是,构建和运行应用程序可以按预期的方式运行,并且自定义组件/管道可以正常工作。工作但显示为错误的组件的二分法很烦人,很难处理。我知道这是一件小事,但我真的不想在没有错误的情况下看到html文件中的错误 摘要 我有两个不同的角度项目;我使用angular应用程序的angular库。该库导出应用程序使用的多个自定义组件、管道和服务。我没有通过npm发布这个库,而是使用npm链接让应用程序访问该库。这似乎与“我的应用程序组件”中定义的任何服务/组件一样工作,并且不会抱怨。尽管在我从我的库将任何内容放入模板文件的那一刻,该选择器被加下划线并出现警告 文件 MyComponent的模板my.component.html*/ 上面的文件将包含引用自定义组件的所有行,这些行以红色下划线显示错误消息。“my-theme-toggle”不是已知元素:…如果是,请验证它是模块的一部分。 尝试修复 我试过很多东西,但都没用Html 自定义库组件不是已知元素,但应用程序编译并运行,html,angular,typescript,npm,visual-studio-code,Html,Angular,Typescript,Npm,Visual Studio Code,问题 我的html文件警告我的自定义组件/管道“不是已知元素”。但是,构建和运行应用程序可以按预期的方式运行,并且自定义组件/管道可以正常工作。工作但显示为错误的组件的二分法很烦人,很难处理。我知道这是一件小事,但我真的不想在没有错误的情况下看到html文件中的错误 摘要 我有两个不同的角度项目;我使用angular应用程序的angular库。该库导出应用程序使用的多个自定义组件、管道和服务。我没有通过npm发布这个库,而是使用npm链接让应用程序访问该库。这似乎与“我的应用程序组件”中定义的任
- 不使用NPM链接,只是将ng Packagegr创建的库复制到我的应用程序的节点模块中
- 重建和重新链接/重新启动所有内容
- 搜索其他S.O问题:大多数问题都是关于构建失败的,因为导入/导出实际上是不正确的
升级到angular 11后,这个问题消失了,我认为其他几个问题可能会解决它,但这感觉是最好的选择。我将我的项目从angular 8切换到了angular 9,在VS代码中也遇到了同样的问题。我的解决方案对我有效:
- 使用配置产品构建库:
=>这将强制编译器使用较旧的视图引擎,而不是Ivy()ng Build my lib--prod
- 转到文件夹“/dist/my lib/”并使用
而不是npm-pack
=>这将创建一个tgz文件,您可以在消费应用程序中安装该文件npm-link
- 在您的消费应用程序中安装库:
npm安装“D:/mypath/dist/my lib/my-lib-2.1.0.tgz”
这在我的环境中解决了Angular 9与代码之间的问题。直到最近,我才遇到过这样的错误
卸载Angular语言服务扩展(我最近安装的)后,错误消失了。我也有同样的问题。这里有一个修正 添加
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
及
到你的模块
完整的
app.module.ts
供您参考
import { BrowserModule } from '@angular/platform-browser';
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NgNiceSelectModule } from 'ng-nice-select';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
NgNiceSelectModule
],
providers: [],
bootstrap: [AppComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
]
})
export class AppModule { }
要解决此问题,您当前必须使用生产标志
--prod
进行生成,因为在其当前状态下,生成。默认情况下,angular prod build不使用常春藤构建。因此,在构建它时,它会创建一个lib.metadata.json
文件。这是语言服务器用来使插件工作的文件
ng build--prod
- 添加
标志以监视更改--watch
cd dist
,然后npm链接
- 我在
文件夹中创建了一个dist
,并在那里创建了链接,因为我的库中有多个模块。这将允许您这样做package.json
从'/moduleA'导入{moduleComponent}
从'/moduleA'导入{moduleReadRective}
- 注意:您链接的文件夹必须有一个
,否则它将使用项目的根目录,因为它是最接近的package.json
package.json
- 如果执行相同操作,则以下路径的格式正确,否则可能不正确,您可以尝试:
“lib”:[“/node\u modules/lib”、“/node\u modules/lib/*”]
npm链接
tsconfig.base.json中创建一个路径
(路径可能会有所不同,具体取决于您创建链接的方式)
您可以尝试以下方法。 简言之:
- 使用--prod标志构建lib
- 然后转到
并运行dist/YourLibName
npm链接
- 转到将使用lib的项目,并从lib package.json运行
namenpm link YourLibName
- 在项目tsconfig.json中,向编译器选项添加路径属性
/* Consuming Application module */
import { MyCommonModule } from 'my-common';
@NgModule({
imports: [
MyCommonModule,
],
declarations: [
MyComponent,
],
})
export class MyModule {}
/* Template of MyComponent, my.component.html */
<div>
<my-theme-toggle (darkThemeSelected)="toggleTheme($event)"></my-theme-toggle>
</div>
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
import { BrowserModule } from '@angular/platform-browser';
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NgNiceSelectModule } from 'ng-nice-select';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
NgNiceSelectModule
],
providers: [],
bootstrap: [AppComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
]
})
export class AppModule { }
{
"compilerOptions": {
"paths": {
"lib/*": [
"./node_modules/lib/*"
]
}
}
}
{
"compilerOptions": {
.
.
.
"paths": {
"YourLibName from lib package.json": ["node_modules/YourLibPath"]
},
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"preserveSymlinks": true,
...