Создание системы плагинов для платформы MVC на основе nodejs
Я хотел бы иметь возможность создавать функциональные возможности для моего приложения в системе стиля плагина по нескольким причинам:
- Новые проекты могут выбирать, какие плагины необходимы, а не иметь код для функциональности, который не нужен
- Другие разработчики могут создавать плагины для системы, не требуя слишком большого знания основных разработок.
Я не уверен, как это реализовать. Я хотел бы иметь папку plugins
для размещения их отдельно, но я думаю, что мои вопросы:
- Как плагины взаимодействуют с основной системой?
- Как работает структура папок? Каждый из них будет содержать стандартную структуру MVC: контроллеры, службы, модели, представления и т.д.?
Я предполагаю, что у кого-нибудь есть учебник или какая-то документация, связанная с этой техникой, которая была бы полезна. Я немного поработал, но все это слишком тесно связано с фактическим кодом, с которым они работают, а не с концепцией, и я не нашел ничего, что специально связано с nodejs.
Ответы
Ответ 1
Я предлагаю подход, аналогичный тому, что я сделал в проекте uptime (https://github.com/fzaninotto/uptime/blob/master/app.js#L46):
- запускает события приложения в критических частях вашего приложения.
- добавьте раздел 'plugins' в конфигурацию приложения
- каждое имя плагина должно быть именем пакета. Пакеты плагинов должны возвращать либо обратный вызов, либо объект с функцией init().
- в любом случае, вставляйте плагинам объекты, которые они должны будут запускать (конфигурация, соединения и т.д.) при вызове init() или выполнении обратного вызова.
Модули плагинов
- регистрируют прослушиватели событий приложения и изменяют его.
Преимущества:
- легкий
- полагаться на npm для зависимостей
- не извлекайте колесо
Ответ 2
Создайте прототип плагина для базы
функциональность, и пусть пользователь определяет свой плагин в модуле. в
модуль, пользователь наследует объект от прототипа, расширяет его
функциональности, а затем экспортировать конструктор, который возвращает плагин
объект.
Основная система загружает все плагины по требованию ( "pluginname" ) и для
каждый вызывает конструктор.