Пресеты плагинов

Пресеты плагинов — это заранее сконфигурированные наборы плагинов, которые упрощают настройку обработки Markdown или HTML. Они позволяют объединять несколько плагинов в единый блок конфигурации, что особенно полезно при сложной цепочке трансформаций и при работе над крупными проектами. Пресеты помогают стандартизировать обработку документов, уменьшая количество повторяющегося кода и повышая читаемость конфигурации.


Структура пресета

Пресет представляет собой объект или функцию, которая возвращает массив плагинов с их конфигурациями. В Remark и Rehype пресет может быть подключен так же, как обычный плагин, что позволяет использовать его совместно с другими плагинами.

Пример структуры пресета:

// my-preset.js
module.exports = function myPreset(options = {}) {
  return [
    [require('remark-plugin-1'), { optionA: options.optionA }],
    [require('remark-plugin-2'), { optionB: options.optionB }],
    require('remark-plugin-3')
  ];
};

В этом примере myPreset возвращает массив из трёх плагинов, два из которых получают конфигурацию через объект options. Такой подход позволяет создавать гибкие пресеты, где параметры можно задавать при инициализации.


Использование пресета в Remark

После создания пресета его можно подключить в конфигурации Remark через метод .use().

const remark = require('remark');
const myPreset = require('./my-preset');

remark()
  .use(myPreset, { optionA: true, optionB: 'value' })
  .process('# Заголовок', function(err, file) {
    if (err) throw err;
    console.log(String(file));
  });

Здесь .use(myPreset, { optionA: true, optionB: 'value' }) подключает пресет и передаёт в него параметры. Remark автоматически развернёт массив плагинов, возвращаемый пресетом, и применит их по очереди.


Комбинация пресетов и отдельных плагинов

Remark и Rehype поддерживают смешанное использование пресетов и отдельных плагинов. Это позволяет строить иерархию конфигураций: базовый пресет может быть расширен дополнительными плагинами.

remark()
  .use(myPreset, { optionA: false })
  .use(require('remark-plugin-4'), { optionC: 123 })
  .process('# Текст для обработки');

Плагины из пресета выполняются в порядке, указанном в массиве, после чего подключается отдельный плагин remark-plugin-4.


Создание универсальных пресетов

Для масштабируемых проектов часто создаются пресеты, которые можно использовать и в Remark, и в Rehype, если плагины поддерживают оба движка. Универсальный пресет строится как функция, принимающая объект options и возвращающая массив плагинов с конфигурациями.

function universalPreset({ enablePluginA = true, enablePluginB = false } = {}) {
  const plugins = [];
  if (enablePluginA) plugins.push(require('plugin-a'));
  if (enablePluginB) plugins.push(require('plugin-b'));
  return plugins;
}

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


Пресеты для Rehype

Для Rehype пресеты работают аналогично Remark, но применяются к дереву HTML. Основная разница в типах плагинов: Rehype использует плагины для работы с HTML-узлами, тогда как Remark работает с Markdown-узлами.

Пример пресета для Rehype:

// rehype-preset.js
module.exports = function rehypePreset(options = {}) {
  return [
    [require('rehype-plugin-1'), { setting: options.setting }],
    require('rehype-plugin-2')
  ];
};

Подключение пресета в Rehype:

const rehype = require('rehype');
const rehypePreset = require('./rehype-preset');

rehype()
  .use(rehypePreset, { setting: true })
  .process('<h1>Заголовок</h1>', function(err, file) {
    if (err) throw err;
    console.log(String(file));
  });

Преимущества использования пресетов

  • Стандартизация конфигураций: все проекты могут использовать один и тот же набор плагинов с одинаковыми параметрами.
  • Масштабируемость: добавление или удаление плагинов происходит в одном месте, что упрощает поддержку больших проектов.
  • Повторное использование кода: пресеты легко экспортировать и подключать в разных проектах.
  • Гибкость: возможность передачи параметров через объект options позволяет настраивать пресет без изменения исходного кода.

Рекомендации по построению пресетов

  1. Разделять плагины на обязательные и опциональные, чтобы пресет оставался гибким.
  2. Использовать именованные массивы [plugin, options], чтобы легко видеть, какие настройки применяются к каждому плагину.
  3. Минимизировать зависимости внутри пресета, оставляя возможность расширять функциональность через внешние плагины.
  4. Документировать параметры пресета, особенно если он используется в нескольких проектах.

Пресеты становятся не просто инструментом для упрощения конфигурации, а частью архитектуры проекта, формируя единый подход к обработке Markdown и HTML.