Skip to content

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 - имя или экземпляр плагина

Удаление и деактивация плагина в текущий экземплеря менеджера плагинов