首页 > 解决方案 > Angular 8 - 懒加载自己 - AoT“没有 NgModule 元数据”

问题描述

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

在构建当前启用 AoT 的生产项目时,我目前面临一些问题。

问题

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

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

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 serve列出模块的属性,和ng serve --prod:[ngInjectorDef]在开发服务中与[]在生产环境中是有区别的。

我想知道是否还有其他人面临这个问题?

复制/测试自己

这里有一个简约项目的stackblitz:https ://stackblitz.com/edit/angular-mpzmle

要作为生产服务器用于生产,您必须:

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

标签: angularlazy-loading

解决方案


特别感谢 Github 上的 Antur84 在这里的回复

编译器查找具有“loadChildren”属性的对象。如果属性是 syntax import(...).then(m => m.SOME_EXPORT),则跟踪 url 并将其编译到适当的工厂中。

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


推荐阅读