MDX объединяет Markdown и JSX, позволяя писать компоненты React прямо в текстовых документах. Такой синтаксис открывает широкие возможности, но одновременно повышает риск ошибок: от некорректной разметки Markdown до неправильного использования JSX-компонентов. Линтеры для MDX помогают автоматически выявлять ошибки и поддерживать единый стиль кода.
MDX-линтеры работают по принципу анализа абстрактного синтаксического дерева (AST). Документ MDX сначала парсится в AST, который содержит узлы Markdown и JSX. Линтер проверяет каждый узел на соответствие правилам:
heading-increment,
no-trailing-spaces);react/jsx-uses-vars,
react/jsx-no-undef);mdx/no-unused-expressions,
mdx/no-jsx-html-comments).Проверки могут быть настроены через конфигурационные файлы, где включаются или отключаются отдельные правила, а также задаются кастомные правила для проекта.
1. eslint-plugin-mdx Этот плагин
интегрируется с ESLint и позволяет проверять MDX-файлы так же, как
обычные JavaScript или JSX-файлы. Основные возможности:
Пример базовой конфигурации .eslintrc.js:
module.exports = {
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:mdx/recommended'
],
overrides: [
{
files: ['*.mdx'],
extends: ['plugin:mdx/recommended']
}
],
settings: {
react: {
version: 'detect'
}
}
};
2. remark-lint Используется для
проверки чистого Markdown-кода внутри MDX. Позволяет выявлять проблемы
вроде:
Комбинируется с remark-mdx для полноценной поддержки
MDX:
const remark = require('remark');
const remarkMdx = require('remark-mdx');
const remarkLint = require('remark-lint');
remark()
.use(remarkMdx)
.use(remarkLint)
.processSync(mdxContent);
Правила делятся на три группы:
Стилизация Markdown Например,
heading-increment проверяет, что заголовки увеличиваются
последовательно (h1 → h2 → h3).
no-trailing-spaces запрещает пробелы в конце
строк.
Проверка JSX Применяются стандартные правила
ESLint для React: jsx-uses-react,
jsx-uses-vars, jsx-no-undef. Эти правила
помогают избежать ошибок при написании компонентов внутри MDX.
MDX-специфические правила Сюда входят проверки, которые не относятся ни к Markdown, ни к JSX напрямую:
mdx/no-unused-expressions — выявляет JSX-выражения,
которые не используются;mdx/no-jsx-html-comments — запрещает HTML-комментарии
внутри JSX;mdx/no-missing-exports — проверяет, что все
используемые компоненты импортированы или экспортированы.MDX-линтеры легко интегрируются в пайплайны:
remark-lint можно запускать отдельно для
Markdown-проверок;eslint --ext .js,.jsx,.mdx src/ и remark .
одновременно, чтобы проверять весь проект.MDX поддерживает написание собственных плагинов для линтинга:
createRule,
где описывается функция проверки AST узлов;Пример кастомного правила для ESLint:
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Запрещает использование <div> без className'
}
},
create(context) {
return {
JSXOpeningElement(node) {
if (node.name.name === 'div' && !node.attributes.some(attr => attr.name.name === 'className')) {
context.report({
node,
message: 'Все <div> должны иметь className'
});
}
}
};
}
};
lint-staged
для предотвращения коммитов с ошибками.Линтеры для MDX обеспечивают не только чистоту кода, но и предотвращают ошибки в работе компонентов и вёрстки, делая проект стабильным и поддерживаемым.