MDX, как расширение Markdown для React, позволяет встраивать компоненты напрямую в текстовую разметку. Это делает интеграцию аудио-файлов особенно гибкой, так как можно использовать как стандартные HTML-элементы, так и собственные React-компоненты для управления воспроизведением.
<audio>MDX поддерживает стандартные HTML-теги, поэтому самый простой способ
добавить аудио — использовать тег <audio> с
атрибутами controls, autoplay и
loop.
<audio controls>
<source src="/audio/sample.mp3" type="audio/mpeg" />
Ваш браузер не поддерживает элемент audio.
</audio>
Ключевые моменты:
controls — отображает стандартные элементы управления
(play, pause, volume).autoplay — воспроизводит аудио сразу после загрузки
страницы.loop — зацикливает воспроизведение.<source> позволяет указать несколько форматов
аудио для кроссбраузерной совместимости.Для более сложных сценариев рекомендуется создавать собственные React-компоненты. Это даёт возможность управлять состоянием воспроизведения, визуализировать прогресс, добавлять кастомные кнопки и интегрировать аудио с другими интерактивными элементами.
Пример простого компонента:
import { useState, useRef } from 'react';
export default function AudioPlayer({ src }) {
const [playing, setPlaying] = useState(false);
const audioRef = useRef(null);
const togglePlay = () => {
if (playing) {
audioRef.current.pause();
} else {
audioRef.current.play();
}
setPlaying(!playing);
};
return (
<div>
<audio ref={audioRef} src={src} />
<button onCl ick={togglePlay}>{playing ? 'Pause' : 'Play'}</button>
</div>
);
}
MDX позволяет вставить этот компонент прямо в разметку:
<AudioPlayer src="/audio/sample.mp3" />
HTML-аудио и React-компоненты предоставляют доступ к множеству событий, которые можно использовать для создания интерактивного опыта:
onPlay и onPause — отслеживание начала и
остановки воспроизведения.onEnded — выполняется после завершения трека.onTimeUpdate — позволяет следить за текущей позицией
воспроизведения.onVolumeChange — используется для управления громкостью
динамически.Пример с обработкой события окончания трека:
<audio
src="/audio/sample.mp3"
controls
onEn ded={() => console.log('Трек завершился')}
/>
Для крупных проектов важно учитывать производительность и размер страницы. Основные рекомендации:
preload="none"
для экономии трафика.<audio> с серверной поддержкой range-запросов.<audio controls preload="none">
<source src="/audio/long-track.mp3" type="audio/mpeg" />
</audio>
Для пользователей с ограниченными возможностями важно:
aria-label или title для кнопок
управления.<audio controls aria-label="Воспроизведение лекции по JavaScript">
<source src="/audio/lecture.mp3" type="audio/mpeg" />
</audio>
MDX позволяет использовать сторонние библиотеки для улучшенного управления аудио:
Пример с howler.js:
import { Howl } from 'howler';
export default function HowlerPlayer({ src }) {
const sound = new Howl({ src: [src] });
return <button onCl ick={() => sound.play()}>Play</button>;
}
Вставка в MDX:
<HowlerPlayer src="/audio/sample.mp3" />
/public/audio.components/audio.React-компоненты дают полный контроль над визуальной частью:
Пример простого кастомного прогресс-бара:
function CustomAudio({ src }) {
const [time, setTime] = useState(0);
const audioRef = useRef(null);
const updateTime = () => setTime(audioRef.current.currentTime);
return (
<div>
<audio ref={audioRef} src={src} onTimeUpd ate={updateTime} />
<div style={{ width: '100%', height: '5px', background: '#ccc' }}>
<div style={{ width: `${(time / audioRef.current?.duration) * 100}%`, height: '100%', background: '#0070f3' }} />
</div>
</div>
);
}
MDX позволяет использовать такой компонент без ограничений на интерактивность.
Эти подходы обеспечивают полный контроль над аудио в MDX, создавая гибкую и расширяемую структуру для образовательных платформ, документации и мультимедийных проектов.