Vlad_IT
@Vlad_IT
Front-end разработчик

Как реализовать систему плагинов на TypeScript?

Добрый день! Есть проект с структурой:
app/
---plugins/
------plugin1.ts
------plugin2.ts
------...
---main.ts

в папке plugins находятся плагины/компоненты приложения, которые в последствии могут добавляться (с последующей "перекомпиляцией" естественно).
Как мне импортировать в main.ts все эти классы плагинов? Пробовал делать им общее пространство имен, но это ничем не помогает. Единственный способ который помог является костылем:
// ожидающие загрузки плагины
let waitLoad:Array<string> = [];
    // получаем все зарегестрированные модули
    for(let name in window['require'].s.contexts['_']['registry']) {
        // Если модуль находится в папке плагинов...
        if(name.slice(0, 8).toLowerCase() === 'plugins/') {
            // Добавляем его в массив ожидающих загрузку (т.к. загрузчик модулей загружает их асинхронно)
            waitLoad.push(name);
            // Импортируем модуль
            window['require']([name], function(a,b,c) {
                // удаляем из ожидающих
                waitLoad.remove(name);
                // регистрируем в самописной системе плагинов
                addFieldType(a.default);
                // если плагинов ожидающих загрузку больше нет, то вызывает событие готовности
                if(waitLoad.length === 0) {
                    onLoad();
                }
            });
        }
    }


Хотелось бы просто иметь возможность писать так:
import * as plugins from './plugins/*';

чтобы уже plugins был массивом классов плагинов. Или хотябы, более грамотно загружать их в массив без асинхронной загрузки.
Есть ли какой нибудь способ? Или мне лучше пересмотреть архитектуру?
За ранее спасибо!
  • Вопрос задан
  • 457 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
пусть тот кто добавляет плагин явно прописывает его в зависимостях какого-то модуля. Явное всегда лучше чем неявное.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы