这个类通过SomeModule -> SomeComponent对消费者可见,但不从顶层库入口导出。

110

我使用 ng update 将所有的 Angular 库升级到了 Angular 9.0.0,但是在尝试构建它们时,出现了以下错误:

错误信息:

不支持私有类 SomeComponent。虽然此类通过 SomeModule -> SomeComponent 对消费者可见,但未从顶层库入口导出。

是否有人解决过这个错误?

4个回答

254

如果在NgModule中导出了任何组件却未包含在您的public_api.ts中,Angular 9将会发生错误。

这个错误在Angular 8中没有出现,但在升级到Angular 9后开始显示。

如果您在NgModule中导出了任何服务模块组件等,请确保将它们包含在public_api.ts中,否则angular 9将会抛出错误。

解决方法:将您的组件添加到public_api.ts

export * from './lib/components/some-me/some-me.component';

8
仅仅导出模块不足以使用内部导出的组件。 - Nanda Kishore Allu
2
@NandaKishoreAllu 不是的,实际上你需要将它们添加到public_api中才能使它们可用。 - Aniruddha Das
6
如果您没有使用 public_api.ts 文件,那么编辑 index.ts 文件同样可以达到相同效果。 - DJClayworth
2
有人可以解释一下这个情况吗: 我将我的组件放在了一个模块中,而且这个模块已经被导出到public-api.ts中,但是当我尝试执行ng build时,我却收到了上述消息。你们有什么猜想为什么会发生这种情况吗? - Nekvin
2
这会影响到急切加载和惰性加载的模块吗?我认为只是急切加载,否则所有内部组件都应该在public-api中导出,因为它们将在应用程序的某些部分被传递地导入,对吧? - Dani P.
显示剩余2条评论

12

今天我也遇到了同样的问题。

我的前提条件:

  • 我正在使用 Angular 11 库项目;
  • 我添加了一个新的指令;
  • 当我尝试将我的指令添加到模块导出列表时,出现了上述错误。

解决方案:

  • 我在 index.ts 文件中添加了文件导出:

export * from './just/a/relative/path/to/the/directive/{{myDirectiveFile}}';


4
我遇到了同样的问题。我无法删除默认关键字,因为Storybook要求我必须有它。最终,我通过更改以下内容来解决这个问题:
export * from './lib/components/some-me/some-me.component';

...转化为以下内容:

export { default as SomeComponent } from './lib/components/some-me/some-me.component';

在public_api.ts文件中。


如果你的库中有很多指令或组件,那真是一件痛苦的事情,但我想这也是一种好的“邪恶”吧 :) - Gautam

1
这个错误发生是因为我使用了 default 关键字来导出我的组件:
@Component({
  selector: 'lib-form',
  templateUrl: './form.component.html',
  styleUrls: ['./form.component.scss'],
})
export default class FormComponent implements OnInit {
    // ...
}

使用这个关键字是由我的Linter建议的,它允许我们将导入写成import FormComponent from './form.component';而不是import { FormComponent } from './form.component';。然而,这似乎在public-api.ts中不能很好地工作。对我来说,解决方案是删除default关键字并更改所有导入。

1
我认为你为我节省了数小时的寻找问题原因,这个问题是默认导出 :) - paddotk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接