Angular 6+ - динамически загружать NgModule из пакета NPM - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь понять, как динамически загружать NgModule из пакета NPM, созданного путем создания проекта библиотеки Angular CLI, без того, чтобы модуль был известен приложению хоста во время компиляции.То, чего я хочу достичь, это следующее:

/* HOST APPLICATION */
// app.module.ts
export interface IPlugin {
    path: string;
    moduleName: string;
    components: string[];
}

export function getPluginList(http: HttpClient) {
    let ret: IPlugin[] = [];
    ajax({ method: "GET", url: "*serverroot*/GetPluginList", async: false }).subscribe(list => ret = list.json());
    return ret;
}

@NgModule({
    [...],
    providers: [{ provide: PLUGIN_LIST, useFactory: getPluginList, deps: [HttpClient] }]
})
export class AppModule {}

// plugin.service.ts
export class PluginService {
    constructor(@Inject(PLUGIN_LIST) plugins: IPlugin[]) {}

    getComponentFactory(component: string) {
        const plugin = this.getComponentPlugin(component);
        /* Load plugin dynamically (download the NgModule factory via HTTP) */
        /* Grab its NgModume factory and extract the component factory */
    }
}

// dashboard.component.ts
export class DashboardComponent {
    constructor(private readonly pluginService: PluginService) {}

    private loadWidget(widgetComponent: string): void {
        const factory = this.pluginService.getComponentFactory(widgetComponent);
        this.viewRef.create(factory);
    }
}

Часть, которую я не могу в настоящее время достичь, это тело PluginService.getComponentFactory.Я много раз искал SO и нашел множество похожих вопросов, но все они предполагают, что вы хотите лениво загрузить фрагмент исходного кода, который есть в вашем проекте, или что по крайней мере путь к этим файлам кода известен, когдаВы создаете приложение.Таким образом, webpack возьмет эти пути и перепишет их внутри сгенерированного пакета, чтобы вы могли сделать this.loader.load, где this.loader - это тот же SystemJsNgModuleLoader, который находится внутри углового маршрутизатора.В моем случае я хочу загрузить модуль через HTTP-вызов, а не через сгенерированный веб-пакет требует вызова, и я понятия не имею, как это сделать ... Кто-нибудь может помочь?

...