在 Angular 10 中启用 Ivy 的问题
Problems with enabling Ivy in Angular 10
我们的 angular 应用程序有问题。
我们最近更新到 angular10 并启用了 Ivy 和 aot。
现在我们运行遇到了几个我们无法解决的问题。
这是我们设置的简要概述
该应用程序是企业规模的,包含多个相互依赖的库。
这些库随后会在其他 angular applications/workspaces 中使用,这些库本身包含进一步使用的库。
这是我们设置的简单图示:
核心存储库:
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.
的新本地化特性
所以我们非常感谢您帮助解决这个问题。我们知道我们可能没有提供足够的信息,但我们只是不知道需要什么信息。所以只要让我们知道,我们就会交付。
感谢您的帮助
解决方法如下:
Anuglar GitHub Issue
基本上它与从何处使用包有关。如果包位于项目之外,则 "preserveSymlinks": true 是必需的。
我们的 angular 应用程序有问题。
我们最近更新到 angular10 并启用了 Ivy 和 aot。
现在我们运行遇到了几个我们无法解决的问题。
这是我们设置的简要概述
该应用程序是企业规模的,包含多个相互依赖的库。
这些库随后会在其他 angular applications/workspaces 中使用,这些库本身包含进一步使用的库。
这是我们设置的简单图示:
核心存储库:
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.
的新本地化特性所以我们非常感谢您帮助解决这个问题。我们知道我们可能没有提供足够的信息,但我们只是不知道需要什么信息。所以只要让我们知道,我们就会交付。
感谢您的帮助
解决方法如下: Anuglar GitHub Issue
基本上它与从何处使用包有关。如果包位于项目之外,则 "preserveSymlinks": true 是必需的。