MDX позволяет объединять Markdown и JSX в одном документе, что открывает возможности для динамического рендеринга компонентов внутри текстового контента. Одним из ключевых аспектов презентации кода в MDX является подсветка синтаксиса, которая делает код более читаемым и удобным для восприятия.
В MDX можно использовать стандартные блоки кода Markdown с тройными обратными кавычками:
```javascript
function sum(a, b) {
return a + b;
}
Для рендеринга таких блоков MDX поддерживает компонент `pre` и `code`. Стандартный подход — использование **компонентов для подсветки**, например, `react-syntax-highlighter` или `prism-react-renderer`.
#### Интеграция с `react-syntax-highlighter`
1. Установка зависимости:
```bash
npm install react-syntax-highlighter
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
import { okaidia } from 'react-syntax-highlighter/dist/esm/styles/prism';
<SyntaxHighlighter language="javascript" style={okaidia}>
{`function greet(name) {
return 'Hello, ' + name;
}`}
</SyntaxHighlighter>
Особенности:
language указывает язык программирования для
правильной подсветки.style определяет визуальную тему (цветовую
схему).prism-react-rendererprism-react-renderer предоставляет более гибкий способ
кастомизации рендеринга:
npm install prism-react-renderer
import Highlight, { defaultProps } from 'prism-react-renderer';
import theme from 'prism-react-renderer/themes/dracula';
<Highlight {...defaultProps} code={`const sum = (a, b) => a + b;`} language="javascript" theme={theme}>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<pre className={className} style={style}>
{tokens.map((line, i) => (
<div {...getLineProps({ line, key: i })}>
{line.map((token, key) => (
<span {...getTokenProps({ token, key })} />
))}
</div>
))}
</pre>
)}
</Highlight>
Особенности:
tokens — массив строк, каждая строка разбивается на
токены.getLineProps и getTokenProps создают
корректные атрибуты для HTML-элементов.В проектах с использованием Next.js и MDX можно
настроить автоматическую подсветку без обёрток для каждого блока кода,
используя rehype-prism-plus:
npm install rehype-prism-plus
import { MDXRemote } from 'next-mdx-remote';
import rehypePrism from 'rehype-prism-plus';
<MDXRemote {...source} components={components} options={{ rehypePlugins: [rehypePrism] }} />
Особенности:
loadLanguages.Для кастомизации внешнего вида подсветки синтаксиса важно учитывать:
Примеры тем включают: dracula, okaidia,
tomorrow, night-owl.
MDX позволяет не только подсвечивать код, но и делать его интерактивным, используя компоненты-обёртки:
<LiveCode code={`function add(a, b) { return a + b; }`} />
Интерактивные блоки:
Подсветка синтаксиса в MDX — это сочетание удобного рендеринга, эстетики и функциональности. Правильная интеграция компонентов и тем позволяет создавать профессиональные и читабельные технические статьи с интерактивными и статичными блоками кода.