MDX сочетает возможности Markdown и JSX, позволяя создавать динамический контент с компонентами React. Одной из продвинутых возможностей является условная компиляция — способ влиять на итоговый рендеринг контента в зависимости от условий во время сборки или выполнения.
В MDX условная компиляция достигается использованием JavaScript-выражений внутри JSX-блоков. Поскольку MDX транспилируется в React-компоненты, можно применять стандартные конструкции Jav * aScript: условные операторы, тернарные выражения, логические операции.
Простейший пример использования тернарного оператора в MDX:
import { Feature } from './components/Feature'
{process.env.FEATURE_ENABLED ? <Feature /> : null}
Здесь компонент Feature будет включён только если
переменная окружения FEATURE_ENABLED равна
true. Важно понимать, что этот код выполняется на этапе
рендера React, а не при сборке Markdown.
Часто используется короткая запись через логический оператор
&&:
{user.isAdmin && <AdminPanel />}
AdminPanel рендерится только если
user.isAdmin истинно. Это позволяет создавать
MDX-документы, которые адаптируются под разные состояния приложения.
Для более сложных условий применяются стандартные JavaScript-конструкции:
{
status === 'loading' ? (
<Spinner />
) : status === 'error' ? (
<ErrorMessage />
) : (
<Content data={data} />
)
}
Такой подход позволяет полностью контролировать, какой JSX будет вставлен в документ на основе текущего состояния.
Можно выносить условия в отдельные функции, чтобы улучшить читаемость и повторное использование кода:
import { renderContent } from './utils'
{renderContent(user, data)}
Функция renderContent возвращает JSX в зависимости от
переданных параметров. Такой метод особенно полезен для крупных
MDX-документов с множеством условий.
MDX позволяет использовать переменные окружения через
process.env, что делает возможным условную компиляцию
контента на этапе сборки:
{process.env.NODE_ENV === 'development' && (
<DebugPanel />
)}
В продакшн-сборке этот блок не рендерится, что уменьшает итоговый размер бандла.
MDX-документы могут использовать React-хуки и контекст для динамической условной компиляции:
import { useTheme } from './ThemeContext'
export const ThemeDependent = () => {
const theme = useTheme()
return theme === 'dark' ? <DarkComponent /> : <LightComponent />
}
Такой подход позволяет строить интерактивные MDX-документы, которые меняют содержимое без перезагрузки страницы.
Для оптимизации условной компиляции можно использовать динамический импорт:
import dynamic from 'next/dynamic'
const HeavyComponent = dynamic(() => import('./HeavyComponent'), { ssr: false })
{isVisible && <HeavyComponent />}
Компонент HeavyComponent загружается только если
isVisible истинно, что снижает нагрузку на начальный рендер
и ускоряет загрузку страницы.
&& для
простых условий, чтобы код оставался компактным.process.env для
runtime условий, чтобы избежать непредсказуемого поведения при
клиентской навигации.import { Banner } from './components/Banner'
import { Feature } from './components/Feature'
import dynamic from 'next/dynamic'
const ExperimentalFeature = dynamic(() => import('./ExperimentalFeature'), { ssr: false })
{process.env.SHOW_BANNER && <Banner />}
{user.isLoggedIn ? <Feature /> : <p>Войдите, чтобы увидеть функционал</p>}
{isExperimental && <ExperimentalFeature />}
В этом примере MDX-документ комбинирует условия на основе переменных окружения, состояния пользователя и runtime-флагов. Такой подход позволяет строить гибкие и масштабируемые учебные материалы, документацию и интерактивные страницы.