Markdown-файлы часто содержат изображения, которые напрямую
вставляются через синтаксис . Remark и Rehype
позволяют не только обрабатывать текст, но и модифицировать изображения
на этапе компиляции в HTML, что открывает возможности для
оптимизации:
remark-images или собственные трансформации можно
автоматически выставлять width и height для
<img>, уменьшая количество переработки
браузером.loading="lazy" снижает время первичной загрузки страниц с
большим количеством медиа.Remark и Rehype поддерживают систему плагинов, что делает pipeline гибким:
<img> с
базовыми атрибутами.<picture> с источниками для разных форматов и
разрешений.srcset.Каждый плагин можно конфигурировать, определяя размеры, форматы и пороги качества.
Pipeline Remark → Rehype обычно строится следующим образом:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
import rehypeImgSize from 'rehype-img-size';
import remarkFrontmatter from 'remark-frontmatter';
const processor = unified()
.use(remarkParse)
.use(remarkFrontmatter)
.use(remarkRehype)
.use(rehypeImgSize, { dir: 'public/images' })
.use(rehypeStringify);
const result = await processor.process(markdownContent);
В этом примере rehype-img-size анализирует локальные
файлы в папке public/images и автоматически добавляет
атрибуты width и height.
<picture>Для оптимизации под мобильные устройства и дисплеи с высокой
плотностью пикселей важно формировать <picture>:
<picture>
<source srcset="image-1x.webp 1x, image-2x.webp 2x" type="image/webp">
<source srcset="image-1x.jpg 1x, image-2x.jpg 2x" type="image/jpeg">
<img src="image-1x.jpg" alt="Пример изображения" loading="lazy">
</picture>
Создание таких элементов можно автоматизировать с помощью плагинов,
которые преобразуют стандартные <img> из Markdown в
<picture> с различными форматами и разрешениями.
Оптимизация изображений на уровне pipeline включает:
sharp или imagemin. Можно интегрировать как
отдельный шаг перед вставкой в Markdown.quality: 80, что
дает баланс между весом файла и визуальным качеством.Когда Markdown ссылается на внешние изображения:
fetch) и временное сохранение
локально для дальнейшей обработки.Атрибуты <img> и <picture>:
loading="lazy" откладывает загрузку до момента
появления изображения в зоне видимости.decoding="async" позволяет браузеру декодировать
изображение параллельно с рендером страницы.fetchpriority="low" для менее важных изображений
снижает приоритет сетевых запросов.Для крупных сайтов с сотнями Markdown-файлов рекомендуется:
Remark и Rehype могут работать вместе с:
Такой подход позволяет строить полностью автоматизированный pipeline, где каждый Markdown-файл сразу превращается в готовую для веба страницу с оптимизированными изображениями.