小编典典

我们可以在AOT之后将功能模块添加到Angular应用中吗

spring-boot

我正在一个类似于WordPress和其他CMS应用程序的开源平台上,但专注于与典型Java构建管道的互操作性。

目的是创建一些可重用的库,这些库为开发人员提供构建/运行时依赖关系,以供其创建功能模块,这些功能模块可在平台[插件]部署后应用到平台。

我使用AngularJS + Spring框架创建了一个很好的原始版本。
本质上,它将扫描依赖项jar以查找与特定模式匹配的静态文件,为文件创建MVC资源解析,然后将这些文件url包括到索引页中。

这有效地允许资源库包括服务器和客户端资源,以扩展正在运行的平台。

*但!一位同事说我的字体结束已过期,我需要更新Angular = P

因此,我已经开始将Angular 4中的UI重写为一个单独的资源依赖项,可以在以jar形式发布之前将其用于功能模块项目中进行测试。
我真的很喜欢Angular 4 [TS],因为它更像是开发我精通的服务器代码。

切入要点…如果功能模块提供了客户端资源,如何在运行时加载它们?
我想我可以使用JIT并在浏览器中加载js路径,但是出于性能原因,我想使用AOT。

我正在考虑-解压缩资源,运行编译,然后为页面提供服务。
还是有一种方法可以在执行AOT之后动态加载Angular模块?

引用的项目-https: //github.com/savantly-net/sprout-
platform


阅读 251

收藏
2020-05-30

共1个答案

小编典典

我可以通过在主应用程序中引用生成的NgModuleFactory文件来加载外部插件,但仍需要在主机应用程序中进行一些预编译的配置。

经过数小时的尝试不同的解决方案,我确定最适合我的用例的是在应用程序目录外部的文件夹中将插件作为打字稿文件提供,然后在准备开始提供服务时进行编译。

一个如何为我工作的示例-https: //github.com/savantly-net/sprout-
platform/tree/development/web/sprout-web-ui

我使用一个简单的ts模块导入/导出插件-[在这里使用相对路径,但也可以使用绝对路径]
https://github.com/savantly-net/sprout-
platform/blob/development/web/发芽网络用户界面/sprout.conf.ts

import { WikiModule } from './plugins/wiki/';

export const plugins = [
  WikiModule
]

然后使用传播运算符重新导出模块-https:
//github.com/savantly-net/sprout-platform/blob/development/web/sprout-web-
ui/src/app/plugins/plugins.module。 ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { plugins } from '../../../sprout.conf';
import { MenuModule } from '@savantly/ngx-menu';
import { SecurityModule } from '@savantly/ngx-security';
import { SproutPluginModule } from '@savantly/ngx-sprout-plugin';
import { Observable } from 'rxjs/Observable';

const log = (msg: string, obj?: any) => {
  console.log('[PluginsModule] ' + msg);
  if (obj) {
    console.log(obj);
  }
}


@NgModule({
  imports: [
    CommonModule,
    SproutPluginModule,
    MenuModule,
    SecurityModule,
    ...plugins
  ],
  exports: [...plugins],
  declarations: []
})
export class PluginsModule {
  private ngModules: NgModule[] = [];

  getNgModules(): Observable<NgModule[]> {
    return Observable.of(this.ngModules);
  }

  constructor() {
   log('Loaded plugins');
  }
}

这不是真正的即插即用解决方案,但是如果没有在[预编译]配置文件中明确引用插件文件夹,则构建过程将无法执行摇树。

2020-05-30