如何从自定义Angular库导入特征模块?

时间:2019-01-18 15:51:42

标签: angular typescript

类似于this question,我构建了具有多个功能模块的自定义Angular库(使用 Angular CLI 7.2.0 ):

MyLibraryModule
  FeatureModule1
    SomeComponent1
  FeatureModule2
    SomeComponent2

我只想将一个功能模块导入我的主应用程序,就像我们可以对Angular Material模块(import { MatButtonModule } from '@angular/material';)进行的操作一样:

import { FeatureModule1 } from 'my-library';
...
@NgModule({
  imports: [
    ...,
    FeatureModule1,
  ]
})
...

这会导致以下错误(在构建主项目期间):

ERROR in : Unexpected value 'FeatureModule1 in ./node_modules/my-library/my-library.d.ts'
imported by the module 'AppModule in ./src/app/app.module.ts'.
Please add a @NgModule annotation.

当我将库模块(import { MyLibraryModule } from 'my-library';)导入主应用程序时,一切正常。

my-library.module.ts 看起来像这样:

import { NgModule } from '@angular/core';

import { FeatureModule1 } from './feature-module-1/feature-module-1.module';
import { FeatureModule2 } from './feature-module-2/feature-module-2.module';

@NgModule({
  imports: [ FeatureModule1, FeatureModule2 ],
  exports: [ FeatureModule1, FeatureModule2 ],
})
export class MyLibraryModule{ }

我的public_api.ts导出所有模块。

我认为这与打包过程有关,因为在我的测试项目(与库位于同一文件夹中)中,此工作没有任何问题。

我已经尝试从@angular/material改编building process,但看来,他们的做法与 official 的方式有些不同。

1 个答案:

答案 0 :(得分:1)

问题是,我在index.ts导入的功能模块(public_api.ts)中使用了barrel files,如下所示:

import * from './feature-module-1';

但是,如here所述,您必须直接指向桶文件。否则,软件包的.d.ts文件不会包含所有导出。因此,我的public_api.ts中的以下行解决了该问题:

import * from './feature-module-1/index';