Angular 8 - 自己延迟加载 - AoT "No NgModule metada"

Angular 8 - Lazy loading yourself - AoT "No NgModule metada"

我正在开发一个 Angular 项目,它可以延迟加载小部件,也可以从 UMD 包中加载它们。

我在构建当前启用 AoT 的生产项目时遇到了一些问题。

问题

AoT 版本不提供编译器。因此,我向应用程序提供 JITCompiler

在生产模式下使用 JITCompiler 使用 import(path/to/module) 编译模块时,我收到

main.e522a776bacf42032766.js:1 ERROR Error: No NgModule metadata found for 'function(){}'.
    at e.resolve (main.e522a776bacf42032766.js:1)
    at e.getNgModuleMetadata (main.e522a776bacf42032766.js:1)
    at e._loadModules (main.e522a776bacf42032766.js:1)
    at e._compileModuleAndComponents (main.e522a776bacf42032766.js:1)
    at e.compileModuleAsync (main.e522a776bacf42032766.js:1)
    at e.compileModuleAsync (main.e522a776bacf42032766.js:1)
    at t.project (main.e522a776bacf42032766.js:1)
    at t._tryNext (main.e522a776bacf42032766.js:1)
    at t._next (main.e522a776bacf42032766.js:1)
    at t.next (main.e522a776bacf42032766.js:1)

发生了什么变化

列出模块的属性,ng serveng serve --prod 之间存在差异:开发中的 [ngInjectorDef] 与生产中的 [] 相对。

我想知道是否还有其他人遇到过这个问题?

Reproduction/testing你自己

这里有一个极简主义项目的工作堆栈闪电战:https://stackblitz.com/edit/angular-mpzmle

要作为生产服务器投入生产,您必须:

此体力劳动的替代方法是按照 https://github.com/juristr/manually-lazy-load-ngmodule/issues/1 上的步骤操作。 这是一个实现类似概念的项目,但受到同样问题的困扰。

特别感谢 Antur84 在 Github 上的回复 here

编译器查找具有 'loadChildren' 属性的对象。如果 属性 的语法是 import(...).then(m => m.SOME_EXPORT),则 url 会被跟踪并编译到适当的工厂中。

所以我不得不重构我的回调键和传递函数的 return 类型。