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 serve
和 ng serve --prod
之间存在差异:开发中的 [ngInjectorDef]
与生产中的 []
相对。
我想知道是否还有其他人遇到过这个问题?
Reproduction/testing你自己
这里有一个极简主义项目的工作堆栈闪电战:https://stackblitz.com/edit/angular-mpzmle
要作为生产服务器投入生产,您必须:
- 下载 zip
- 解压 zip
- 运行
npm install
在解压目录
- 调整tsconfig.json(我不能在stackblitz里调整?)
- 更改模块:es2015 为 esnext
- 运行
ng serve --prod
并服务于 localhost:4200
此体力劳动的替代方法是按照 https://github.com/juristr/manually-lazy-load-ngmodule/issues/1 上的步骤操作。
这是一个实现类似概念的项目,但受到同样问题的困扰。
特别感谢 Antur84 在 Github 上的回复 here
编译器查找具有 'loadChildren' 属性的对象。如果 属性 的语法是 import(...).then(m => m.SOME_EXPORT)
,则 url 会被跟踪并编译到适当的工厂中。
所以我不得不重构我的回调键和传递函数的 return 类型。
我正在开发一个 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 serve
和 ng serve --prod
之间存在差异:开发中的 [ngInjectorDef]
与生产中的 []
相对。
我想知道是否还有其他人遇到过这个问题?
Reproduction/testing你自己
这里有一个极简主义项目的工作堆栈闪电战:https://stackblitz.com/edit/angular-mpzmle
要作为生产服务器投入生产,您必须:
- 下载 zip
- 解压 zip
- 运行
npm install
在解压目录 - 调整tsconfig.json(我不能在stackblitz里调整?)
- 更改模块:es2015 为 esnext
- 运行
ng serve --prod
并服务于localhost:4200
此体力劳动的替代方法是按照 https://github.com/juristr/manually-lazy-load-ngmodule/issues/1 上的步骤操作。 这是一个实现类似概念的项目,但受到同样问题的困扰。
特别感谢 Antur84 在 Github 上的回复 here
编译器查找具有 'loadChildren' 属性的对象。如果 属性 的语法是 import(...).then(m => m.SOME_EXPORT)
,则 url 会被跟踪并编译到适当的工厂中。
所以我不得不重构我的回调键和传递函数的 return 类型。