Подтвердить что ты не робот

Можем ли мы добавить функциональный модуль в приложение Angular после AOT

Я работаю на платформе с открытым исходным кодом, похожей на WordPress и другие приложения CMS, но сосредоточившись на взаимодействии с типичным конвейером Java-сборки.

Цель состоит в том, чтобы создать несколько повторно используемых библиотек, которые предоставляют разработчикам конструктивные возможности для создания функциональных модулей, которые могут быть применены к платформе после развертывания [плагинов].

Я создал оригинальную версию, которая сделала это хорошо, используя систему AngularJS + Spring.
По сути, он будет проверять баны зависимости для статических файлов, соответствующих определенному шаблону, создавать разрешение ресурсов MVC для файлов, а затем включать эти URL-адреса файлов на индексную страницу.

Это фактически позволило библиотеке ресурсов включать ресурсы сервера и клиентской стороны для расширения рабочей платформы.

* НО! Сотрудник сказал, что мой конец шрифта устарел, что мне нужно обновить Angular= P

Итак, я начал переписывать пользовательский интерфейс в Angular 4 как отдельную зависимость ресурсов, которую можно использовать в проекте модуля модулей для тестирования, перед публикацией как банку.
Мне очень нравится Angular 4 [TS], поскольку он больше похож на разработку кода сервера, на котором я владею.

Как добраться до точки... если модули функций предоставляют ресурсы на стороне клиента, как я могу загрузить их во время выполнения?
Я думаю, что я мог бы использовать JIT и загружать js-пути в браузере, но я хочу использовать AOT по соображениям производительности.

Я рассматриваю - распаковывать ресурсы, запускать компиляцию, а затем обслуживать страницу.
Или есть способ динамически загружать модуль Angular после того, как AOT уже был выполнен?

Связанный проект - https://github.com/savantly-net/sprout-platform

4b9b3361

Ответ 1

Мне удалось загрузить внешний плагин, обратившись к сгенерированным файлам NgModuleFactory в моем основном приложении, но все же потребовал некоторую предварительно скомпилированную конфигурацию в главном приложении.

После многих часов попыток разных решений я определил, что лучше всего использовать для использования в качестве файлов typescript файлы в папке, внешней по отношению к каталогу приложения, а затем выполнить компиляцию, когда она готова к запуску приложение.

Пример того, как это работает для меня - 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-web-ui/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');
  }
}  

Это не настоящее решение plug-and-play, но без привязки к папкам плагинов, явно указанным в [предварительно скомпилированном] файле конфигурации, процесс сборки не сможет выполнить дрожание дерева.