我正在研究一个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]
与生产中的[]
相对。
我想知道是否还有其他人遇到这个问题?
这里有一个极简项目的有效工作,https://stackblitz.com/edit/angular-mpzmle
要用作生产服务器,您必须:
npm install
ng serve --prod
并投放到localhost:4200
此体力劳动的替代方法是遵循https://github.com/juristr/manually-lazy-load-ngmodule/issues/1上的步骤。这是一个实施类似概念的项目,但受到相同问题的困扰。
特别感谢Github上的Antur84的回复here
编译器将查找具有'loadChildren'属性的对象。如果该属性的语法为import(...).then(m => m.SOME_EXPORT)
,则将跟踪url并将其编译到适当的工厂中。
所以我不得不重构我的回调键和所传递函数的返回类型。