【问题标题】:Create an Ahead-of-Time (AOT) compiled library to be consumed by Angular applications创建一个 Ahead-of-Time (AOT) 编译库以供 Angular 应用程序使用
【发布时间】:2018-10-29 09:49:46
【问题描述】:

我有一个 Angular 5 库,我将它公开为一个包,供其他应用程序从他们的 node_modules 使用。

目前,该应用程序是使用 rollup 和 gulp 即时编译 (JIT) 并作为包导出的。因此,开发者应用程序以 JIT 编译的形式使用我的包。

对 AOT 的研究让我相信,任何 Angular 应用程序在 AOT 编译时都比浏览器上的 JIT 应用程序性能更高。但是,作为库开发人员,我想知道如果我公开我的 AOT 编译库,应用程序开发人员是否会获得任何性能优势?

我使用ng-bootstrap 和许多其他开源库在我的模块中创建组件,并在它们之上添加自定义样式或功能。我在模块中使用的所有库是否也需要采用它们的 AOT 形式,或者我可以使用它们的 JIT 对应物?

另外,我认为为我的库提供单独的包是个好主意 - packageName 和 packageName-aot 以便用户可以选择他们想要使用的任何库。

除了整个代码重构(将模板中使用的私有变量更改为公共变量、删除箭头函数、lambda 表达式等)之外,在以 AOT 形式公开我的库模块之前,我还有什么需要注意的吗?

由于某些限制,我无法使用 Angular CLI,因此必须依赖 @ngtools/webpack 来获得 AOT 编译(如果有)。

目前,我的tsconfig.json有以下选项:

"angularCompilerOptions": {
    "skipTemplateCodegen": true,
    "strictMedtadataEmit": true,
    "fullTemplateTypeCheck": true
}

我在互联网上进行了很多搜索,但 Angular AOT 文档非常模糊,对于我在这里尝试做的事情并不是很清楚。任何方向都会非常有帮助。
谢谢!

【问题讨论】:

  • 我认为与滚动自己的构建相比,您花费更少的时间让您的项目使用 angular-cli。
  • @elclanrs 如果可以的话,我会的! :)

标签: javascript angular angular5 angular2-aot aot


【解决方案1】:

您编写的库以及您的库所依赖的库需要支持 AOT。这就是它的全部。

您不会编写和交付 AOT 编译的库(AOT 编译形式,如您所说);消费应用程序将在构建时进行 AOT 编译。

您必须做的就是确保当消费应用程序进行 AOT 构建时(ng build --prod,如果使用 Angular CLI),您的库运行良好。 plays nice我的意思是,你的库可以与消费应用程序一起 AOT 编译而不会出现错误。

像 generator-angular2-library 或 ng-packagr(@angular/cli 6.0.0 用来支持构建库的工具)这样的库工具只是将包构建到 JavaScript,仅此而已。

执行 AOT 构建取决于使用应用程序的构建工具。这就是允许任何需要它的应用程序(或应用程序框架/库)使用库的原因。尽量不要过度考虑构建/部署库需要什么。 AOT 的繁重工作取决于使用它的应用程序。

【讨论】:

  • 感谢您的回答。这让事情变得更清楚了。所以这意味着即使我的依赖项之一不支持,我也无法使我的库 AOT 支持?
  • 确实如此。如果您需要的库之一不支持 AOT,那么您的库也不支持。维护的大多数库都能够进行 AOT 编译,因此除非您使用一些较旧或陈旧的库,否则您最终应该能够使用 AOT。
  • @R.Richards 您是否知道构建库 AOT 的任何方法,在将其构建为 UMD 并使用 SystemJs 模块加载器在另一个应用程序中使用的场景中?当主应用程序使用 JIT 运行时它工作正常,但随着编译器在产品构建中被删除,我希望也编译库 AOT,以便能够在生产中使用它,而不是放弃主应用程序中的 AOT .
  • @IvanSt 您找到解决此问题的方法了吗?因为我有同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2023-03-18
  • 2017-05-03
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多