MDX (Markdown + JSX) позволяет интегрировать JSX-компоненты прямо в Markdown-документы, что делает его мощным инструментом для построения интерактивного контента. Встраивание видео — один из ключевых элементов динамических страниц. Существует несколько подходов к реализации, каждый из которых имеет свои особенности и ограничения.
<video>В MDX можно использовать стандартный HTML-тег
<video> с полным контролем над параметрами
проигрывания.
<video
src="/videos/sample.mp4"
controls
autoplay={false}
loop={false}
muted={false}
width="640"
height="360"
>
Ваш браузер не поддерживает тег video.
</video>
Ключевые моменты:
muted={true} для работы.<video>.ReactPlayerБиблиотека react-player упрощает работу с внешними
видео-сервисами (YouTube, Vimeo, SoundCloud) и предоставляет единый API
для управления видео.
import ReactPlayer from 'react-player';
<ReactPlayer
url="https://www.youtube.com/watch?v=dQw4w9WgXcQ"
playing={false}
controls={true}
width="100%"
height="480px"
/>
Преимущества:
playing, volume, muted.Совет: для крупных проектов лучше оборачивать
ReactPlayer в собственный компонент, чтобы централизованно
управлять стилями и поведением видео.
MDX позволяет импортировать и использовать отдельные компоненты для видео. Это особенно удобно при большом количестве видео или необходимости переиспользования шаблонов.
import VideoPlayer from './components/VideoPlayer.mdx';
<VideoPlayer src="/videos/tutorial.mp4" controls loop />
Особенности такого подхода:
Для корректного отображения на разных устройствах видео должно быть адаптивным. Наиболее простой способ — использование CSS.
<div style={{ position: 'relative', paddingTop: '56.25%' }}>
<video
src="/videos/sample.mp4"
controls
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
}}
/>
</div>
Объяснение:
paddingTop: '56.25%' — поддерживает соотношение сторон
16:9.position: absolute и
width: 100%, height: 100% позволяют видео масштабироваться
вместе с контейнером.В MDX-компонентах можно использовать стандартные события DOM или React-события:
<video
src="/videos/sample.mp4"
controls
onP lay={() => console.log('Видео начато')}
onPa use={() => console.log('Видео приостановлено')}
onEn ded={() => console.log('Видео завершено')}
/>
Часто используемые события:
onPlay — срабатывает при запуске воспроизведения.onPause — срабатывает при приостановке.onEnded — срабатывает после окончания видео.onTimeUpdate — позволяет отслеживать прогресс
воспроизведения для кастомных таймеров или аналитики.Видео можно снабдить субтитрами через тег
<track>:
<video src="/videos/sample.mp4" controls>
<track
src="/videos/subtitles.vtt"
kind="subtitles"
srcLang="ru"
label="Русский"
default
/>
</video>
subtitles,
captions, descriptions).Для оптимизации загрузки страниц и снижения потребления трафика можно использовать ленивую загрузку видео.
<video
src="/videos/sample.mp4"
controls
loading="lazy"
width="640"
height="360"
/>
Если используется ReactPlayer, можно динамически
подгружать компонент через React.lazy:
import React, { Suspense } from 'react';
const LazyPlayer = React.lazy(() => import('react-player'));
<Suspense fallback={<div>Загрузка видео...</div>}>
<LazyPlayer url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" controls />
</Suspense>
MDX позволяет встроить видео практически любым способом: через стандартные HTML-теги, компоненты React или внешние библиотеки. Ключевые аспекты — адаптивность, управление событиями, субтитры и оптимизация загрузки. Комбинируя эти подходы, можно создать гибкую систему видео-контента в рамках документации, блогов и учебных материалов.