Переиспользование конфигураций

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

Базовая структура конфигурации

Конфигурация Remark или Rehype обычно представляет собой объект с ключами plugins и settings:

const remarkConfig = {
  plugins: [
    [require('remark-gfm')],
    [require('remark-slug')]
  ],
  settings: {
    commonmark: true,
    footnotes: true
  }
};
  • plugins — массив плагинов, каждый из которых может быть подключен с опциональными параметрами.
  • settings — объект настроек, передаваемый в парсер для управления поведением обработки Markdown или HTML.

Создание переиспользуемых конфигураций

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

// commonRemarkConfig.js
const remarkGfm = require('remark-gfm');
const remarkSlug = require('remark-slug');

module.exports = {
  plugins: [
    [remarkGfm],
    [remarkSlug]
  ],
  settings: {
    commonmark: true,
    footnotes: true
  }
};

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

const { unified } = require('unified');
const remarkParse = require('remark-parse');
const remarkStringify = require('remark-stringify');
const commonRemarkConfig = require('./commonRemarkConfig');

unified()
  .use(remarkParse, commonRemarkConfig.settings)
  .use(...commonRemarkConfig.plugins)
  .use(remarkStringify)
  .processSync('# Заголовок');

Комбинирование нескольких конфигураций

В больших проектах часто требуется объединять базовую конфигурацию с дополнительными плагинами для специфичных задач. Для этого удобно использовать функцию-обертку, которая принимает базовую конфигурацию и добавляет новые элементы:

function extendConfig(baseConfig, additionalPlugins = [], additionalSettings = {}) {
  return {
    plugins: [...baseConfig.plugins, ...additionalPlugins],
    settings: { ...baseConfig.settings, ...additionalSettings }
  };
}

const extendedConfig = extendConfig(commonRemarkConfig, [
  [require('remark-autolink-headings')]
], { listItemIndent: 'one' });

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

Переиспользование в Rehype

Rehype работает аналогично, но для HTML. Базовая конфигурация может включать плагины для обработки ссылок, изображений, атрибутов и форматирования:

const rehypeConfig = {
  plugins: [
    require('rehype-highlight'),
    [require('rehype-autolink-headings'), { beh * avior: 'wrap' }]
  ]
};

Переиспользование и расширение:

const extendedRehypeConfig = {
  plugins: [
    ...rehypeConfig.plugins,
    require('rehype-format')
  ]
};

Важные моменты

  • Согласованность версий плагинов — при переиспользовании конфигураций важно использовать одинаковые версии плагинов, чтобы избежать ошибок из-за несовместимых API.
  • Передача настроек в плагин — большинство плагинов принимает объект с опциями. Эти объекты можно хранить в конфигурации для повторного использования.
  • Функции-конфигурации — для динамического формирования настроек полезно создавать функции, возвращающие объект конфигурации на основе параметров окружения или проекта.
function createRemarkConfig({ enableGfm = true } = {}) {
  const plugins = [];
  if (enableGfm) plugins.push(require('remark-gfm'));
  plugins.push(require('remark-slug'));
  return { plugins };
}

Практическое применение

  • Разделение базовых и специфических настроек позволяет использовать одну конфигурацию для серверной обработки Markdown, другую для статической генерации сайта.
  • В проектах с монорепозиториями можно создать пакет с общими конфигурациями, подключаемыми в любой подпроект.
  • Использование функций-конфигураций облегчает интеграцию с CI/CD, где разные этапы сборки требуют различных настроек обработки контента.

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