MVLoader
Описание
Универсальный загрузчик для использования в качестве основы для проектов. Позволяет унифицировать подключение пакетов, классов, дополнительных сущностей.
Тестовый проект
Для более простого понимания назначения данного пакета и начала работы с ним создан тестовый проект, доступный по ссылке: https://github.com/mvoevodskiy/mvl-example-project.
Установка
npm i mvloader --save
Класс MVLoaderBase
Используется в качестве совсем базовой основы.
Подключает MVTools в качестве свойства объекта MT, упрощает загрузку
конфига при создании экземпляра класса.
Полезен для большинства вспомогательных классов проекта, например, контроллеров. Большинство пакетов mvl-* экспортируют классы, унаследованные от MVLoaderBase.
Подключение в своем классе:
const {MVLoaderBase} = require('mvloader');
Свойства класса:
- static exportConfig - экспортируемая из класса конфигурация. Используется при загрузке класса через MVLoader. Подробнее в разделе "Класс MVLoader" - "Загрузка конфигурации классов";
- MT - экземпляр класса MVTools (вспомогательные методы);
- caption - название объекта (экземпляра класса) при его внедрении в глобальный объект process. Подробнее в разделе "Класс MVLoader" - "Загрузка классов";
- config - объект конфигурации.
Методы класса:
- loadConfig(config) - загружает объект конфигурации, объединяет с загруженной ранее конфигурацией;
- init() - метод базовой инициализации;
- initFinish() - метод завершения инциализации. Вызывается после того, как выполнилась базовая инициализация всех подключенных в проекте классов.
Пример использования
const {MVLoaderBase} = require('mvloader');
class MvlUsersSemis extends MVLoaderBase{
static exportConfig = {
ext: {
classes: {
semis: {},
controllers: {
mvlUsers: require('./controllers/mvluserscontroller'),
},
handlers: {},
},
configs: {
controllers: {},
handlers: {
DBHandler: {
sequelize: {},
models: {
mvlUser: require('./models/mvlUser'),
}
}
},
semis: {},
}
},
};
constructor (App, ...config) {
let localDefaults = {};
super(localDefaults, ...config);
this.App = App;
}
async init() {
super.init();
}
async initFinish() {
super.initFinish();
}
}
module.exports = MvlUsersSemis;
Класс MVLoader
Основной класс загрузчика, который необходимо наследовать в проектах. Наследует MVLoaderBase.
Подключение в проекте:
const {MVLoader} = require('mvloader');
Свойства класса:
- ext - объект, хранилище для инициализированных экземпляров всех подключенных классов;
- DB - активное подключение к базе данных, если применимо;
- services - объект для упрощенного доступа к некоторым инициализированным экземплярам подключенных классов;
Методы класса: *
Подключение классов
Загрузка классов
Все подключенные классы должны указываться в секции ext.classes конфигурации. Подключаемые пакеты и классы условно разделяются на следующие типы:
- semis - пакеты-"заготовки", экспортирующие сразу несколько сущностей, необязательно только классы. Как правило, именно пакеты типа semis наибольшим образом расширяют конфигурацию проекта, влияя, в том числе, на конфигурации другие классов;
- controllers - пакеты или классы, реализующие определенную логику;
- handlers - пакеты или классы, являющиеся обертками над сторонними библиотеками.
Помимо указанных типов, допустимы любые другие, специфичные для проекта.
Рекомендовано придерживаться такого разделения при создании новых публичных пакетов.
Все классы, в соответствии со своим типом, инициализируются последовательно. Перед созданием нового экземпляра из класса экспортируется статический объект конфигурации exportConfig, который совмещается с основной конфигурацией проекта.
Такой подход позволяет при подключении, к примеру, основного класса пакета, не беспокоиться о подключении остальных классов, моделей и иных сущностей, если они указаны в экспортируемой конфигурации.
В примере выше (в разделе "Класс MVLoaderBase" - "Пример использования") показан экспортируемый объект конфигурации с подключенными классами и моделями БД.
Загрузка конфигурации классов
При создании новых объектов из подключенных классов им передается объект конфигурации, расположенный, аналогично классу, в ветке ext.configs.
Пример: если подключенный класс доступен в конфигурации через ext.classes.handlers.DBHandler, то его конфигурация должна быть доступна через ext.configs.handlers.DBHandler.
Как и в случае непосредственно с классами, экспортироваться может и конфигурация сторонних классов. Таким образом становится возможным подготовка пакетов, которые действуют как единое целое.
Важно: порядок указания подключаемых пакетов и классов в конфигурации имеет значение, так как при появлении одинаковых ключей они перезаписываются в порядке следования. Это позволяет переопределять, к примеру, отдельные параметры конфигурации по умолчанию новыми значениями.
"Прикрепление" экземпляров классов к process
Если в классе есть непустое свойство caption, то экземпляр данного класса будет доступен через process[caption]. Такой прием использован для значительного упрощения поиска методов по их строковому пути.
К примеру, в классе mvlUsersController свойство caption имеет значение mvlUsers, а в классе определен метод isRegistered. Тогда получить данный метод для последующего выполнения будет возможно так:
let method = this.MT.extract('mvlUsers.isRegistered');
if (method) {
return method();
}