Gatsby использует Remark и Rehype как ядро для обработки Markdown и HTML в процессе построения сайта. Remark отвечает за разбор Markdown в абстрактное синтаксическое дерево (AST), предоставляя возможность модификации структуры контента через плагины. Rehype работает с HTML AST, позволяя выполнять трансформации HTML после конвертации Markdown или для обычного HTML-контента.
Remark разбивает Markdown на узлы, представляющие различные элементы:
заголовки, параграфы, списки, изображения, ссылки и т.д. Каждый узел
имеет тип (type), свойства (data,
value) и дочерние узлы (children). Типичная
структура:
{
type: 'root',
children: [
{
type: 'heading',
depth: 2,
children: [{ type: 'text', value: 'Заголовок второго уровня' }]
},
{
type: 'paragraph',
children: [{ type: 'text', value: 'Текст параграфа' }]
}
]
}
Ключевой особенностью Remark является возможность использования плагинов, которые могут:
После конвертации Markdown в HTML Remark передает результат Rehype.
Rehype AST (hast) имеет аналогичную структуру, но
ориентирован на HTML-теги:
{
type: 'element',
tagName: 'p',
properties: {},
children: [
{ type: 'text', value: 'Пример параграфа' }
]
}
Плагины Rehype позволяют:
В gatsby-config.js подключение выглядит следующим
образом:
module.exports = {
plugins: [
{
resolve: 'gatsby-transformer-remark',
options: {
plugins: [
'gatsby-remark-prismjs', // подсветка синтаксиса
'gatsby-remark-images', // обработка изображений
{
resolve: 'gatsby-remark-autolink-headers',
options: { offsetY: 80 }
}
],
},
},
{
resolve: 'gatsby-plugin-mdx',
options: {
rehypePlugins: [
require('rehype-slug'), // добавление id к заголовкам
require('rehype-autolink-headings')
]
}
}
]
}
gatsby-transformer-remark используется для
Markdown-файлов, преобразует их в HTML через Remark и Rehype.gatsby-plugin-mdx расширяет возможности Remark для
поддержки JSX внутри Markdown и применяет Rehype-плагины для модификации
HTML.Трансформеры — это плагины, которые изменяют AST. Для Remark можно создать собственный плагин:
module.exports = ({ markdownAST }) => {
const visit = require('unist-util-visit');
visit(markdownAST, 'text', node => {
if (node.value.includes('Gatsby')) {
node.value = node.value.replace(/Gatsby/g, 'GatsbyJS');
}
});
return markdownAST;
};
В этом примере:
unist-util-visit для обхода всех текстовых
узлов;Для Rehype процесс аналогичен, но обход происходит по HTML-узлам:
module.exports = () => tree => {
const visit = require('unist-util-visit');
visit(tree, 'element', node => {
if (node.tagName === 'img') {
node.properties.loading = 'lazy';
}
});
};
Здесь все изображения получают атрибут loading="lazy"
для оптимизации загрузки.
srcSet и lazy loading.id для каждого
заголовка в HTML.gatsby-transformer-remarkЭтот поток позволяет гибко управлять контентом, оптимизировать структуру документа и автоматизировать задачи вроде генерации таблицы содержания, добавления классов к элементам или ленивой загрузки изображений.
MDX объединяет возможности Markdown и JSX. Применение Rehype-плагинов позволяет модифицировать HTML, созданный из JSX или Markdown:
const rehypePlugin = require('./rehype-custom-plugin');
export const components = {
wrapper: ({ children }) => {children}
};
export const rehypePlugins = [rehypePlugin];
Такой подход позволяет создавать сложные страницы, где контент полностью контролируется через AST и преобразования Remark/Rehype.