Как встроить видео в React
Встраивание видео в React-приложение кажется простой задачей — пока вы не столкнётесь с неработающим автовоспроизведением, нереспонсивным iframe или тегом <embed>, который попросту не работает. В этом руководстве рассматриваются два самых практичных подхода: нативный HTML5-элемент <video> для самостоятельно размещённых файлов и встраивание через <iframe> для платформ вроде YouTube и Vimeo. Сторонние библиотеки упоминаются там, где они действительно приносят пользу, а не как решение по умолчанию.
Ключевые выводы
- Используйте нативный HTML5-элемент
<video>для самостоятельно размещённых файлов. Никакая библиотека не нужна. - Для встраивания YouTube стандартным и приватным подходом является обычный
<iframe>с указанием наyoutube-nocookie.com. - Чтобы автовоспроизведение надёжно работало в Chrome, Safari и Firefox, требуется атрибут
muted. playsInlineкритически важен на iOS, чтобы предотвратить принудительное полноэкранное воспроизведение.- Обращайтесь к библиотеке вроде ReactPlayer только тогда, когда нужен единый API для нескольких провайдеров или продвинутые callback-обработчики событий.
Метод 1: HTML5 Video в React для самостоятельно размещённых файлов
Если видеофайл находится под вашим контролем, нативный элемент <video> — это правильный инструмент. Никакая библиотека не нужна.
import myVideo from './assets/demo.mp4';
export default function VideoPlayer() {
return (
<video
width="100%"
style={{ aspectRatio: '16/9' }}
controls
playsInline
muted
>
<source src={myVideo} type="video/mp4" />
<track
kind="subtitles"
src="/captions/demo.en.vtt"
srcLang="en"
label="English"
default
/>
Your browser does not support the video tag.
</video>
);
}
Несколько моментов, на которые стоит обратить внимание:
autoPlayтребуетmutedдля надёжной работы в современных браузерах. Chrome, Safari и Firefox по умолчанию блокируют автовоспроизведение со звуком. Не рассчитывайте, что оно заработает безmuted. Обратите внимание, что в JSX атрибут пишется в camelCase какautoPlay, а неautoplay. Поддержка браузерами и политики автовоспроизведения задокументированы на Can I Use.playsInlineобязателен на iOS, чтобы видео автоматически не открывалось в полноэкранном режиме.<track>добавляет субтитры или подписи. Это правильный способ обеспечить доступность видеоконтента, и о нём легко забыть.- Резервный текст внутри
<video>отображается только в очень старых браузерах, которые не распознают этот элемент. Тем не менее его стоит включать.
Для форматов адаптивного стриминга, таких как HLS (.m3u8), нативная поддержка браузерами различается. Safari обрабатывает HLS нативно, а Chrome и Firefox требуют библиотеку вроде hls.js для парсинга и воспроизведения потока.
Встраивание YouTube в React: использование iframe
Для YouTube или Vimeo стандартным подходом является <iframe>. Специальный React-пакет для этого не нужен.
export default function YouTubeEmbed({ videoId }) {
return (
<div style={{ aspectRatio: '16/9', width: '100%' }}>
<iframe
width="100%"
height="100%"
src={`https://www.youtube-nocookie.com/embed/${videoId}`}
title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
style={{ border: 'none' }}
/>
</div>
);
}
Ключевые моменты:
- Используйте
youtube-nocookie.comвместоyoutube.comдля URL встраивания. Это режим повышенной приватности от YouTube, который сокращает количество трекинговых cookie до момента, пока пользователь не начнёт взаимодействовать с плеером. titleобязателен на iframe для программ чтения с экрана. Без него вспомогательные технологии не смогут описать встроенный контент.aspectRatio: '16/9'на обёртке вместе сwidth: 100%иheight: 100%на iframe — это самый чистый респонсивный подход с использованием современного CSS. Никаких хаков с padding не требуется. Поддержка браузерами CSS-свойстваaspect-ratioдоступна на Can I Use.- Формат URL для встраивания:
https://www.youtube-nocookie.com/embed/{VIDEO_ID}. ID видео — это значение query-параметраvв стандартном URL YouTube (например, часть после?v=вyoutube.com/watch?v=VIDEO_ID).
Дополнительные параметры можно передавать через query-строку:
/embed/VIDEO_ID?controls=1&rel=0
Discover how at OpenReplay.com.
Когда использовать React-библиотеку видеоплеера
Для большинства задач достаточно нативного элемента <video> или обычного iframe. Рассмотрите библиотеку вроде ReactPlayer, если вам нужно поддерживать несколько платформ (YouTube, Vimeo, Wistia, HLS, DASH) из единого компонента с унифицированным API, или если нужны callback-обработчики событий вроде onReady, onProgress или onEnded для разных провайдеров.
ReactPlayer добавляет ощутимый вес в бандл, поэтому стоит оценить, действительно ли вам нужна такая гибкость, прежде чем добавлять его как зависимость.
Заключение
Начинайте с самого простого инструмента, который решает задачу. Для самостоятельно размещённого видео используйте HTML5-элемент <video> с controls, playsInline и muted, если требуется автовоспроизведение. Для встраивания YouTube в React достаточно обычного <iframe> с указанием на youtube-nocookie.com и корректным атрибутом title. Обращайтесь к библиотеке только тогда, когда нативного подхода действительно недостаточно.
Часто задаваемые вопросы
Современные браузеры блокируют автовоспроизведение видео со звуком. Чтобы автовоспроизведение надёжно работало в Chrome, Safari и Firefox, ваш элемент video должен содержать атрибут muted наряду с autoPlay. На iOS также нужен playsInline, иначе видео может отказаться воспроизводиться внутри страницы или открыться в полноэкранном режиме. Без этих атрибутов автовоспроизведение молча провалится.
По возможности используйте youtube-nocookie.com. Это режим встраивания YouTube с повышенной приватностью, который не устанавливает трекинговые cookie до тех пор, пока пользователь действительно не начнёт взаимодействовать с плеером. Базовая функциональность воспроизведения практически идентична стандартному встраиванию, но этот режим более дружелюбен к требованиям приватности и помогает уменьшить количество предупреждений о сторонних cookie на вашем сайте.
Для типичных задач — нет. Нативный HTML5-элемент video справляется с самостоятельно размещёнными файлами, а обычный iframe — с YouTube или Vimeo. Обращайтесь к ReactPlayer только тогда, когда вам нужен единый унифицированный API для нескольких провайдеров или согласованные callback-обработчики событий вроде onProgress и onEnded. В противном случае стоимость в виде увеличения бандла редко оправдана.
Оберните video или iframe в контейнер со стилями aspectRatio равным 16/9 и width 100%. Затем установите для внутреннего элемента width 100% и height 100%. Этот современный CSS-подход заменяет устаревшие хаки с padding-bottom и сохраняет пропорции видео на всех размерах экранов без ручных вычислений.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.