Appearance
Plugin System
ts
import { Plugin, PluginManager } from "@/plugin";Overview
Система плагинов построена на основе EventEmitter и предназначена для расширения функциональности кода "из вне" без необходимости внесения изменений в исходный код библиотеки.
Для использования плагинов необходимо создать экземпляр PluginManager (или производного от него) класса и передать внутрь instance для которой будут применяться плагины.
ts
class ResourceManager {
plugins = new PluginManager(this);
// ...
anyMethod(item) {
console.log("fired:anyMethod", item);
}
// ...
async load(type, path) {
return await this.plugins.get?.(type).loadResource(path);
}
}Далее необходимо реализовать плагин на основе абстрактного класса Plugin (или производного от него)
ts
class Loader extends Plugin {
name = "json";
version = "1.0.0";
async loadResource(resource: Resource) {
return new Promise(async (resolve, reject) => {
const { options = {}, url } = resource;
try {
const result = await fetch(url, options).then((r) => r.json());
for (let item of result) {
this.instance.anyMethod(item);
}
resolve(result);
} catch (error) {
reject(error);
}
});
}
async init() {}
async destroy() {}
}И теперь можно его подключать плагин в PluginManager
ts
const resources = new ResourceManager();
resources.plugins.register(new Loader());
// ...
resources.load("json". "/link/to/json");Plugin
Абстрактный класс который должен быть родителем для всех создаваемых плагинов.
name
- Type:
string
Уникальное имя плагина
version
- Type:
string
Версия плагина по стандарту semver
loaded
- Type:
boolean
вспомогательный аттрибут состояния подключения плагина
register(instance)
- Arg:
instance: any
Нужен для привязки экземпляра к плагину, для взаимодействия с экземпляром внутри плагина
async init()
Хук плагина, который будет вызываться после подключения плагина к Plugin Manager
async destroy()
Хук плагина, который будет вызываться перед удалением плагина из Plugin Manager
Plugin Manager
Менеджер плагинов позволяет управлять плагинами установленными в его экземпляр. Например на его основе построена система загрузки ресурсов
has(name)
- Arg
name: string
Проверка наличия зарегистрированного плагина
get(name)
- Arg
name: string
Получение зарегистрированного плагина
register(plugin)
- Arg
plugin: Plugin
Добавление и регистрация плагина в текущий экземплеря менеджера плагинов
unload(plugin)
- Arg
plugin: string |Plugin- имя или экземпляр плагина
Удаление и деактивация плагина в текущий экземплеря менеджера плагинов