Создание плагина remark для извлечения времени чтения MDX
Руководство по созданию плагина remark, чтобы данные о времени чтения были доступны при импорте файлов MDX как модулей ES.
Remark — это мощный процессор markdown, который можно использовать для создания пользовательских плагинов для преобразования содержимого markdown. При разборе markdown-файлов с помощью remark содержимое преобразуется в абстрактное синтаксическое дерево (AST), которое можно манипулировать с помощью плагинов.
Для лучшего пользовательского опыта обычно отображают предполагаемое время чтения статьи. В этом руководстве мы создадим плагин remark для извлечения данных о времени чтения из файла MDX и сделаем их доступными при импорте файла MDX как модуля ES.
Начнем
Начнем с создания файла MDX:
Предполагая, что мы используем Vite как сборщик с официальным плагином @mdx-js/rollup для преобразования файлов MDX, таким образом, мы можем импортировать файл MDX как модуль ES. Конфигурация Vite должна выглядеть следующим образом:
Если мы импортируем файл MDX как модуль ES, содержимое будет объектом с свойством default, содержащим скомпилированный JSX. Например:
Результатом будет:
Как только мы получим такой результат, мы готовы создать плагин remark.
Создание плагина remark
Давайте посмотрим, что нам нужно сделать для достижения цели:
- Извлечь содержимое MDX для расчета времени чтения.
- Рассчитать время чтения.
- Присоединить данные о времени чтения к содержимому MDX и сделать их доступными при импо рте файла MDX как модуля ES.
К счастью, уже есть библиотеки, которые помогут нам с расчетом времени чтения и базовыми операциями с AST:
reading-timeдля расчета времени чтения.mdast-util-to-stringдля преобразования AST MDX в текст.estree-util-value-to-estreeдля преобразования данных времени чтения в узел ESTree.
Если вы пользователь TypeScript, вам также может понадобиться установка этих пакетов для определения типов:
@types/mdastдля определения типов корневого узла MDX.unifiedдля определения типов плагинов.
Как только мы установим пакеты, можно начинать создавать плагин:
Как мы видим, плагин просто извлекает содержимое MDX в текст и рассчитывает время чтения. Теперь нам нужно присоединить данные о времени чтения к содержимому MDX, и это не выглядит столь очевидным. Но если мы взглянем на другие замечательные библиотеки, такие как remark-mdx-frontmatter, мы можем найти способ сделать это:
Обратите внимание на type: 'mdxjsEsm' в коде выше. Это тип узла, который используется для сериализации MDX ESM. Код выше присоединяет данные о времени чтения с именем readingTime к содержимому MDX, что даст следующий результат при импорте файла MDX как модуля ES:
Если вам нужно изменить имя данных о времени чтения, вы можете обновить свойство name узла Identifier.
Поддержка TypeScript
Чтобы сделать плагин еще более удобным для разработчиков, мы можем сделать последний штрих, дополнив определения типов MDX:
Теперь при импорте файла MDX TypeScript распознает свойство readingTime:
Заключение
Надеюсь, это руководство поможет вам получить больше удовольствия от работы с файлами MDX. С этим плагином remark вы можете использовать данные о времени чтения напрямую и даже воспользоваться tree-shaking модулей ES для повышения производительности.

