Плагин

В NocoBase клиентский плагин — основной способ расширять и настраивать функциональность фронтенда. Наследуя базовый класс Plugin из @nocobase/client, разработчики могут регистрировать логику, добавлять компоненты страниц, расширять меню или интегрировать сторонний функционал на разных этапах жизненного цикла.

Структура класса плагина

Базовая структура клиентского плагина выглядит так:

import { Plugin } from '@nocobase/client';

export class PluginHelloClient extends Plugin {
  async afterAdd() {
  // Выполняется после добавления плагина
    console.log('Plugin added');
  }

  async beforeLoad() {
  // Выполняется перед загрузкой плагина
    console.log('Before plugin load');
  }

  async load() {
  // Выполняется при загрузке плагина: регистрация маршрутов, UI-компонентов и т.д.
    console.log('Plugin loaded');
  }
}

export default PluginHelloClient;

Описание жизненного цикла

При обновлении браузера или инициализации приложения каждый плагин последовательно проходит следующие этапы жизненного цикла:

Метод жизненного циклаВремя выполненияОписание
afterAdd()Выполняется сразу после добавления плагина в менеджер плагиновНа этом этапе экземпляр плагина уже создан, но инициализация всех плагинов еще не завершена. Подходит для легкой инициализации, например чтения конфигурации или привязки базовых событий.
beforeLoad()Выполняется перед load() всех плагиновМожно получить доступ ко всем включенным экземплярам плагинов (this.app.pm.get()). Подходит для подготовительной логики, зависящей от других плагинов.
load()Выполняется при загрузке плагинаЭтот метод выполняется после завершения beforeLoad() у всех плагинов. Подходит для регистрации фронтенд-маршрутов, UI-компонентов и другой ключевой логики.

Порядок выполнения

При каждом обновлении браузера выполняется цепочка afterAdd()beforeLoad()load()

Контекст плагина и движок потоков

Начиная с NocoBase 2.0, API клиентских расширений в основном сосредоточены в Движке потоков. В классе плагина получить экземпляр этого движка можно через this.engine.

// Доступ к контексту движка в методе load()
async load() {
  const { app, router, apiClient } = this.engine.context;
  console.log('Current app:', app);
}

Подробнее см.: