angular - 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
要作为生产服务器用于生产,您必须:
- 下载压缩包
- 解压压缩包
npm install
在解压目录中运行- 调整 tsconfig.json(我无法在 stackblitz 中调整它?)
- 更改模块:es2015 到 esnext
- 运行
ng serve --prod
并服务于localhost:4200
这种体力劳动的替代方法是按照https://github.com/juristr/manually-lazy-load-ngmodule/issues/1上的步骤操作。这是一个实施类似概念的项目,受到同样问题的困扰。
解决方案
特别感谢 Github 上的 Antur84 在这里的回复
编译器查找具有“loadChildren”属性的对象。如果属性是 syntax import(...).then(m => m.SOME_EXPORT)
,则跟踪 url 并将其编译到适当的工厂中。
所以我不得不重构我的回调键和传递函数的返回类型。
推荐阅读
- mysql - 如何复制数据库中列的内容
- javascript - 有没有办法让 IMG 标签上的边距可点击以关闭模式?
- scala - 在 scala sangria-graphql 中处理 api 调用身份验证
- java - 为什么 DSpace SAFBuilder 导入不适用于西班牙语、乌尔都语、印地语等白话语言?
- arrays - 如何遍历带有空格的字符串数组bash
- graph - 图的时间复杂度
- swift - 如何以最高的信心追踪条形码
- ansible - Ansible fail_when xml 值元素为空或一
- ruby - 尝试连接到 OSX Big Sur 上的 rubygems 时出现 SSL_connect“意外消息”错误
- scala - 比较时如何理解返回 None ?