Angular 8-懒加载自己-AoT“没有NgModule metada”

问题描述 投票:2回答:1

我正在研究一个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 serveng serve --prod之间是有区别的:开发中的[ngInjectorDef]与生产中的[]相对。

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

复制/自我测试

这里有一个极简项目的有效工作,https://stackblitz.com/edit/angular-mpzmle

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

  • 下载压缩文件
  • 提取拉链
  • 在解压缩目录中运行npm install
  • 调整tsconfig.json(我无法在stackblitz中调整它吗?)
    • 将模块:es2015更改为esnext
  • 运行ng serve --prod并投放到localhost:4200

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

angular lazy-loading
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.