MDX позволяет объединять Markdown и JSX, что открывает возможность для использования полноценного React-кода внутри документации. При этом оптимизация загрузки компонентов становится критически важной, особенно при работе с большими документами или сложными интерфейсами. Ленивая загрузка (lazy loading) позволяет загружать компоненты только по мере их необходимости, уменьшая время первоначальной загрузки и снижая нагрузку на браузер.
В экосистеме React существует стандартный способ ленивой загрузки
компонентов через функцию React.lazy и компонент
<Suspense>. В контексте MDX это работает аналогично,
с некоторыми особенностями:
import React, { Suspense } from 'react';
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
export default function Document() {
return (
<>
<h1>Пример ленивой загрузки</h1>
<Suspense fallback={<div>Загрузка...</div>}>
<HeavyComponent />
</Suspense>
</>
);
}
Ключевые моменты:
React.lazy принимает функцию, которая возвращает
динамический импорт компонента.<Suspense> обязательно нужен для указания
запасного UI, который будет показан до полной загрузки компонента.В MDX можно создавать отдельные компоненты и подключать их лениво, чтобы избежать загрузки тяжелых элементов, которые используются редко. Например:
import { Suspense } from 'react';
const Chart = React.lazy(() => import('./Chart'));
# Аналитика
<Suspense fallback={<p>Загрузка графика...</p>}>
<Chart />
</Suspense>
Такой подход особенно полезен для:
MDX позволяет использовать условную логику для отображения компонентов. Это удобно для ленивой загрузки на основе состояния или взаимодействия пользователя:
import React, { Suspense, useState } from 'react';
const VideoPlayer = React.lazy(() => import('./VideoPlayer'));
export default function Lesson() {
const [showVideo, setShowVideo] = useState(false);
return (
<>
<button onCl ick={() => setShowVideo(true)}>Показать видео</button>
{showVideo && (
<Suspense fallback={<div>Загрузка видео...</div>}>
<VideoPlayer />
</Suspense>
)}
</>
);
}
Особенности:
VideoPlayer не будет загружен до тех пор,
пока showVideo не станет true.Для проектов на базе next-mdx-remote или
@mdx-js/loader следует учитывать:
import()), что делает ленивую загрузку
простой.next-mdx-remote рекомендуется использовать
dynamic из next/dynamic для ленивой загрузки с
автоматическим SSR fallback:import dynamic from 'next/dynamic';
const Map = dynamic(() => import('./Map'), { ssr: false, loading: () => <p>Загрузка карты...</p> });
export default function Page() {
return <Map />;
}
Ленивая загрузка в MDX позволяет добиться более отзывчивого интерфейса и снижения времени первичной загрузки, сохраняя при этом гибкость и интерактивность React-компонентов. Она особенно полезна для документаций, больших справочников, интерактивных учебников и веб-приложений с тяжелыми компонентами, которые не нужны сразу при рендере страницы.