这很奇怪。
我有一个简单的库,叫做布局。
此库有一个名为LayoutModule的简单模块。在LayoutModule内部,我们声明了HeaderComponent。
在HeaderComponent内部,我们有一个来自ngx-bootstrap库的BsModalService依赖关系,这是我的布局库的依赖关系。
它看起来像这样:
import { NgModule } from "@angular/core";
import { ModalModule } from 'ngx-bootstrap/modal';
@NgModule({
declarations: [
HeaderComponent
],
imports: [
ModalModule
],
exports: [
HeaderComponent
],
providers: []
})
export class LayoutModule {}
所有内容均已构建,打包并部署到npm注册表。到目前为止,一切都很好。
但是当其他应用程序安装它时,我们得到:
ERROR Error: Uncaught (in promise): NullInjectorError: StaticInjectorError(AppModule)[HeaderComponent -> BsModalService]:
此错误告诉我BsModalService没有提供程序,这很奇怪,因为它同时以LayoutModule和AppModule的形式导入:
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
BrowserAnimationsModule,
LayoutModule,
ModalModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
到目前为止,我已经尝试了很多方法,例如在LayoutModule中使用.forRoot()方法,删除node_modules文件夹,删除package-lock.json。还尝试了一遍又一遍地构建,但这没有用。
它不起作用,我不明白为什么。有什么想法吗?
编辑:
我忘了提到它在使用ng serve时有效,但是在使用ng serve --aot时会中断。 --aot标志很重要,因为它可以模拟生产版本。
场景是:
应用程序ABC安装库布局+ ng serve =有效!
应用程序ABC安装库布局+ ng serve --aot =失败!
答案 0 :(得分:0)
Can't resolve all parameters for BsModalService
看起来您需要添加ModalModule.forRoot()
答案 1 :(得分:0)
事实证明,问题出在package.json以及如何设置依赖项。
对ngx-bootstrap的库依赖关系是在依赖关系属性中设置的,而不是对等依赖关系。这会导致使用该库的应用程序出现间歇性错误。
所以我要做的就是改变这个:
{
"name": "my-layout",
"version": "1.0.0",
"author": "Myself",
"peerDependencies": {
"@angular/common": "~8.0.1",
"@angular/core": "~8.0.1"
},
"dependencies" : {
"ngx-bootstrap": "^5.1.1",
}
}
对此:
{
"name": "my-layout",
"version": "1.0.0",
"author": "Myself",
"peerDependencies": {
"@angular/common": "~8.0.1",
"@angular/core": "~8.0.1",
"ngx-bootstrap": "^5.1.1",
}
}
工作了。
嗯,至少我想这是原因。