Angular库项目中没有提供程序错误

时间:2019-11-25 20:18:00

标签: angular

这很奇怪。

我有一个简单的库,叫做布局。

此库有一个名为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 =失败!

2 个答案:

答案 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",
     }
}

工作了。

嗯,至少我想这是原因。