angular - Angular 6 - 使用 AOT 编译在运行时动态创建模块
问题描述
我正在尝试动态加载创建模块并将它们添加到通过loadChildren
. 这种方法的主要原因是路由配置应该从json
文件中加载。
所以我有canActivate
负责创建模块的警卫
loadFeatureModule(loadChildren: string): Observable<Type<any>> {
this.getRoutes(loadChildren).pipe(
switchMap(({ routes }) => {
const featureModule = NgModule({
imports: [
RouterModule.forChild(routes)
]
})(class { });
return this.compiler.compileModuleAsync(featureModule);
}),
map(m => m.moduleType)
);
}
并将功能模块添加到路线:
addFeatureModule = (loadChildren: string, path: string): Partial<Route> => {
return {
path: path,
loadChildren: this.loadFeatureModule(loadChildren)
};
}
最后,我用新路由重置了路由器配置。这适用于 JIT 编译器,但它不会使用 AOT 编译器加载任何路由。
我还尝试通过引入这些新提供程序将 JitComplier 注入应用程序:
providers: [
{ provide: COMPILER_OPTIONS, useValue: {}, multi: true },
{ provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS] },
{ provide: Compiler, useFactory: createCompiler, deps: [CompilerFactory] }
]
export function createCompiler(compilerFactory: CompilerFactory) {
return compilerFactory.createCompiler();
}
更新
请使用此repo重现问题
问题
经过进一步调查,我发现了两个问题:
AOT
并删除编译动态模块所需buildOptimizer
的角度装饰器NgModule
。Component
显然没有解决方案buildOptimizer
,我发现了这个讨厌的黑客,AOT
但是有更好的解决方案吗?动态创建模块
templateUrl
时,无法加载在动态模块中直接/间接声明的任何组件。在我的示例中,这意味着我无法导入LayoutModule
到动态模块中,因为它声明了一个使用.templateUrl
ResourceLoader
AOT
解决方案
推荐阅读
- javascript - 如何在switch语句中放置条件
- c++ - C ++逗号分隔的输入数组代码过早退出
- angular - 在构造函数中从服务接收数据时,接收到的数据不会显示在模板中
- database - Laravel 队列很长
- javascript - JS - URLSearchParams - 添加参数
- html - 为什么我的网页的宽度会根据它显示的屏幕而变化?
- guidewire - 什么是导丝中的有效实体以及我们如何创建它?
- ar.js - 如何从android webview中的资产文件夹加载ar.js自定义图像标记
- excel - 在 Excel 中删除字符串中的特定字符串
- c# - NSwagStudio 和 Swagger 2.0 x-sub_types