Сборка динамического загрузчика компонентов с помощью Angular CLI
В основном я хочу создать динамическую систему плагинов. Мне нужно иметь возможность развертывать новые плагины без необходимости повторного развертывания основной системы плагинов.
В основном, если бы я использовал SystemJS, я мог бы просто сделать что-то вроде
System.import(url).then(plugin => {
this.createComponent(plugin.default);
});
url
будучи динамической вещью - мог прочитать это из БД или конфига и т. д.
Выше может работать - за исключением того, что я использую Angular CLI, который использует Webpack. Использование CLI - выбор, сделанный просто для всего проекта - поэтому я застрял с Webpack и CLI.
Поскольку Angular CLI делает много абстракций, я не могу изменить конфигурацию веб-пакета (ну, я могу, но тогда мне придется поддерживать его вручную, что опять-таки нарушило бы простоту).
Webpack - это не загрузка модулей, а сборщик - это означает, что он должен знать эти модули заранее, и я не могу просто куда-то добавить новый модуль и обновить его конфигурацию для его динамической загрузки.
Какие у меня будут варианты?
РЕДАКТИРОВАТЬ: Webpack имеет свой собственный System.import, но он имеет некоторые проверки, чтобы увидеть, является ли URL-адрес статическим или динамическим. Я мог бы жить с передачей статической папки и необходимостью помещать плагины в эту папку - это, кажется, не работает нигде, кроме как внутри самого приложения.
1 ответ
К сожалению, насколько я знаю, в конце дня вам нужно добавить свой динамический компонент в entryComponents
текущего модуля, в противном случае Angular не позволит вам загрузить его динамически, и он будет жаловаться.
Так или иначе, вы должны загрузить компонент статически и поместить его в entryComponents
так что не стоит особо использовать SystemJS или что-то еще, вы можете просто создать словарь и использовать его, когда захотите:
import {MyComponentClass} откуда-то;
const dictionary = {
component1 = MyComponentClass
}
this.createComponent(dictionary[urlOrName]);
Другим возможным решением было бы создать модуль для каждого компонента, который вы собираетесь загружать динамически, а затем добавить этот компонент в entryComponents
таким образом, вы могли бы динамически импортировать / загружать этот модуль, но я не уверен, можно ли динамически добавлять этот динамический модуль в корневой модуль (как маршрутизатор делает это при lazyLoading!~~).
Раньше Angular был намного проще в отношении динамических компонентов, прежде чем они вводились AOT
они честно убили простоту введением AOT