Namespace для плагинов

Umbrella JS предоставляет легковесный и гибкий подход к расширению функциональности через плагины. Одной из ключевых особенностей является использование namespace, позволяющего организовывать плагины, избегать конфликтов имен и обеспечивать чистую интеграцию с объектом $u.

Основы namespace

Каждый плагин в Umbrella JS регистрируется в пределах собственного namespace. Это гарантирует, что имена функций и методов не будут пересекаться с другими плагинами или встроенными методами библиотеки.

Простейшая структура namespace выглядит следующим образом:

$u.plugin('myPlugin', {
  namespace: 'utils',
  init: function() {
    console.log('Плагин инициализирован');
  },
  methods: {
    greet: function(name) {
      return `Привет, ${name}!`;
    }
  }
});

В этом примере:

  • plugin — метод для регистрации нового плагина.
  • namespace — ключ, под которым будут доступны методы плагина ($u.utils.greet(...)).
  • init — функция инициализации, вызываемая при подключении плагина.
  • methods — объект с методами, которые становятся частью namespace.

После регистрации доступ к методам плагина осуществляется через указанный namespace:

$u.utils.greet('Мария'); // Вернет "Привет, Мария!"

Поддержка нескольких методов

Namespace позволяет объединять несколько методов в одном плагине, сохраняя при этом аккуратную структуру и возможность дальнейшего расширения.

Пример:

$u.plugin('arrayHelpers', {
  namespace: 'arrays',
  methods: {
    first: function(arr) {
      return arr[0];
    },
    last: function(arr) {
      return arr[arr.length - 1];
    },
    shuffle: function(arr) {
      return arr.sort(() => Math.random() - 0.5);
    }
  }
});

Теперь все методы доступны под общим namespace:

$u.arrays.first([1,2,3]);   // 1
$u.arrays.last([1,2,3]);    // 3
$u.arrays.shuffle([1,2,3]); // случайный порядок

Динамическое расширение namespace

Umbrella JS допускает расширение существующего namespace без перезаписи его методов. Это особенно полезно при создании модульных плагинов или при работе в команде, где несколько разработчиков могут добавлять функциональность к одному namespace.

$u.plugin('arrayExtras', {
  namespace: 'arrays',
  methods: {
    sum: function(arr) {
      return arr.reduce((acc, val) => acc + val, 0);
    }
  }
});

Теперь $u.arrays включает все ранее определённые методы и новый метод sum:

$u.arrays.sum([1,2,3,4]); // 10

Особенности и рекомендации

  1. Уникальность namespace Рекомендуется использовать уникальные и логически обоснованные имена для namespace, чтобы избежать конфликтов между сторонними плагинами.

  2. Инициализация плагина Метод init вызывается автоматически при регистрации. Он может использоваться для настройки начальных состояний или связывания событий.

  3. Доступ к this внутри методов Методы, объявленные в namespace, могут обращаться к контексту this, который соответствует $u объекту. Это упрощает манипуляции с DOM и другими плагинами.

$u.plugin('domManipulator', {
  namespace: 'dom',
  methods: {
    hide: function(selector) {
      return this.find(selector).each(el => el.style.display = 'none');
    }
  }
});
  1. Изоляция кода Namespace обеспечивает изоляцию, что позволяет создавать безопасные плагины без риска затереть существующие методы $u или глобальные переменные.

Взаимодействие между плагинами

Использование namespace облегчает взаимодействие между плагинами. Например, один плагин может вызывать методы другого:

$u.plugin('logger', {
  namespace: 'log',
  methods: {
    info: function(msg) {
      console.log('INFO:', msg);
    }
  }
});

$u.plugin('app', {
  namespace: 'application',
  methods: {
    run: function() {
      $u.log.info('Приложение запущено');
    }
  }
});

Вызов $u.application.run() автоматически использует методы другого namespace $u.log.

Итоговая структура namespace

Плагин с namespace — это совокупность:

  • namespace — уникальное имя для доступа к методам.
  • init — функция инициализации.
  • methods — набор методов, объединённых под namespace.
  • Возможность динамического расширения без потери ранее определённого функционала.

Использование namespace делает Umbrella JS модульной и предсказуемой, облегчая поддержку крупных проектов и интеграцию сторонних расширений.