在 Angular 10 中启用 Ivy 的问题

Posted

技术标签:

【中文标题】在 Angular 10 中启用 Ivy 的问题【英文标题】:Problems with enabling Ivy in Angular 10 【发布时间】:2021-01-29 16:44:59 【问题描述】:

我们的 Angular 应用有问题。

我们最近更新到 angular 10 并启用了 Ivy 和 aot。

现在我们遇到了几个我们无法解决的问题。

这里是我们设置的快速概览

该应用是企业级应用,包含多个相互依赖的库。

这些库随后用于其他 Angular 应用程序/工作区,这些应用程序/工作区本身包含可进一步使用的库。

这是我们设置的简单说明:

核心存储库:

CoreApp
--projects
---coreLibA
---coreLibB
--src
---components <-- uses code from coreLibs

用户存储库

UserApp
--projects
---userLibA <-- uses core libs
---userLibB <-- uses core libs
--src
---components <-- uses core libs as well as code from userLibs

核心库构建到一个文件夹中,并由该文件夹中的用户应用程序通过 NPM 使用。

这适用于没有常春藤的 angular 10。

第一个问题

所以,起初我们在所有地方(库和应用程序)都启用了 Ivy。我们能够毫无问题地构建coreLibs 并将它们安装到userApp 中。 userApp 上的 ng serve 也可以。但是当我们尝试构建userLibs 时,我们遇到了以下错误:

ERROR: Cannot resolve type entity i4.CommonModule to symbol
An unhandled exception occurred: Cannot resolve type entity i4.CommonModule to symbol

我们能够通过删除 ngModules 中不必要的导入模块来解决其中的一些错误。但遗憾的是,我们无法解决所有问题。

我们仍然不明白为什么这个错误只发生在 ivy 上以及它的实际含义。

第二个问题

然后我们尝试在不使用 ivy 的情况下构建库,但仍然使用 ivy 运行应用程序。

这样我们就可以毫无问题地构建userLibs。但是当我们尝试ng serve 时出现以下错误:

ERROR in the target entry-point "coreLibB" has missing dependecies:
 - @angular/localize/init
 - @angular/cdk/platform
 - rxjs/operators
 - coreLibA
 ... and some more

我们试图通过在库 package.json 中添加硬依赖并将它们列入 ng-package.json 中的白名单来解决这个问题。那行得通,但是 npm install 内存不足。所以这也不是一个解决方案。

结论

似乎 Ivy 比 View Engine 严格得多。但我们需要 Ivy 使用 angular 10 的新定位功能。

因此,我们非常感谢您对这个问题的帮助。我们知道我们可能没有提供足够的信息,但我们只是不知道需要什么信息。因此,只需告诉我们,我们就会提供。

感谢您的帮助

【问题讨论】:

我遇到了类似的错误,可以通过删除node_modules解决它 【参考方案1】:

解决方法如下: Anuglar GitHub Issue

基本上,它与包裹的消费来源有关。如果包位于项目之外,则 "preserveSymlinks": true 是必要的。

【讨论】:

以上是关于在 Angular 10 中启用 Ivy 的问题的主要内容,如果未能解决你的问题,请参考以下文章

StackBlitz ngcc 在启用 Ivy 的情况下无法在我的 npm 库上运行

构建启用了Ivy的monorepo Angular9库是个坏主意

Angular 8 with Ivy 如何验证它的使用

在没有 Ivy 的 Angular 10 库中导入 RouterModule

Angular Ivy 兼容性问题

使用 Angular Ivy 抽象 @Injectable 不起作用