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

или
<img src="https://example.com/image.png">

При работе с относительными путями важно учитывать корневую директорию проекта и текущее расположение обрабатываемого файла. Remark предоставляет плагины для нормализации и преобразования этих путей.
Remark использует систему плагинов для расширения функциональности. Наиболее востребованные плагины для работы с путями:
Пример конфигурации Remark с обработкой относительных путей:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
import remarkImages from 'remark-images';
import path from 'path';
const processor = unified()
.use(remarkParse)
.use(remarkImages)
.use(remarkRehype)
.use(rehypeStringify);
const markdownFile = path.join(process.cwd(), 'content', 'post.md');
processor.process(markdownFile).then(file => {
console.log(String(file));
});
В этом примере remark-images автоматически обрабатывает локальные пути к изображениям, приводя их к правильному формату для HTML-выхода.
Проблемы с путями часто возникают при переносе проектов или изменении структуры директорий. Для корректной работы используются методы нормализации:
Пример трансформации пути к изображению перед конвертацией в HTML:
import fs from 'fs';
import path from 'path';
function transformImagePath(src, baseDir) {
if (!src.startsWith('http')) {
return path.join('/static', path.relative(baseDir, src));
}
return src;
}
const markdown = fs.readFileSync('./content/post.md', 'utf-8');
const updatedMarkdown = markdown.replace(/!\[.*?\]\((.*?)\)/g, (match, src) => {
return match.replace(src, transformImagePath(src, './content'));
});
Этот подход обеспечивает корректное отображение всех локальных ресурсов вне зависимости от структуры проекта.
При использовании Webpack, Vite или других сборщиков важно учитывать, что относительные пути в Markdown должны быть трансформированы в пути, совместимые с системой сборки. Плагины Remark и Rehype позволяют делать это через промежуточные шаги:
rehype-url или пользовательские функции.url-loader
или file-loader).Пример использования rehype-url для добавления
префикса:
import rehypeUrl from 'rehype-url';
const processor = unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeUrl, {
url: (url) => url.startsWith('/') ? `/cdn${url}` : url
})
.use(rehypeStringify);
Эти подходы обеспечивают надёжное и предсказуемое управление путями в проектах с Remark и Rehype, позволяя создавать гибкие системы генерации контента, не ломая ссылки на ресурсы и изображения.