Comment intégrer une vidéo dans React
Intégrer une vidéo dans une application React semble simple, jusqu’à ce que vous soyez confronté à un autoplay défaillant, à une iframe non responsive ou à une balise <embed> qui ne fonctionne tout simplement pas. Ce guide couvre les deux approches les plus pragmatiques : l’élément HTML5 natif <video> pour les fichiers auto-hébergés, et les intégrations via <iframe> pour des plateformes comme YouTube et Vimeo. Les bibliothèques tierces sont mentionnées uniquement lorsqu’elles apportent une véritable valeur ajoutée, et non comme solution par défaut.
Points clés à retenir
- Utilisez l’élément HTML5 natif
<video>pour les fichiers auto-hébergés. Aucune bibliothèque n’est nécessaire. - Pour les intégrations YouTube, une simple
<iframe>pointant versyoutube-nocookie.comconstitue l’approche standard et respectueuse de la vie privée. - L’autoplay nécessite l’attribut
mutedpour fonctionner de manière fiable dans Chrome, Safari et Firefox. playsInlineest essentiel sur iOS pour empêcher la lecture en plein écran forcée.- Optez pour une bibliothèque comme ReactPlayer uniquement lorsque vous avez besoin d’une API unifiée pour plusieurs fournisseurs ou de callbacks d’événements avancés.
Méthode 1 : vidéo HTML5 dans React pour les fichiers auto-hébergés
Si vous contrôlez le fichier vidéo, l’élément natif <video> est l’outil approprié. Aucune bibliothèque requise.
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>
);
}
Quelques points à noter :
autoPlayrequiertmutedpour fonctionner de manière fiable dans les navigateurs modernes. Chrome, Safari et Firefox bloquent tous par défaut l’autoplay non muet. Ne supposez pas que cela fonctionnera sansmuted. Notez qu’en JSX, l’attribut s’écrit en camelCase sous la formeautoPlay, et nonautoplay. La prise en charge par les navigateurs et les politiques d’autoplay sont documentées sur Can I Use.playsInlineest requis sur iOS pour empêcher la vidéo de s’ouvrir automatiquement en plein écran.<track>ajoute des sous-titres ou des légendes. C’est la bonne manière de gérer l’accessibilité du contenu vidéo, et c’est un aspect facile à négliger.- Le texte de repli à l’intérieur de
<video>n’apparaît que dans les très anciens navigateurs qui ne reconnaissent pas l’élément. Il vaut tout de même la peine de l’inclure.
Pour les formats de streaming adaptatif comme HLS (.m3u8), la prise en charge native par les navigateurs varie. Safari gère HLS nativement, mais Chrome et Firefox nécessitent une bibliothèque telle que hls.js pour analyser et lire le flux.
Intégration YouTube dans React : utilisation d’une iframe
Pour YouTube ou Vimeo, une <iframe> constitue l’approche standard. Vous n’avez pas besoin d’un package spécifique à React pour cela.
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>
);
}
Détails importants :
- Utilisez
youtube-nocookie.comau lieu deyoutube.compour l’URL d’intégration. Il s’agit du mode confidentialité renforcée de YouTube, qui réduit les cookies de suivi jusqu’à ce que l’utilisateur interagisse avec le lecteur. titleest obligatoire sur les iframes pour les lecteurs d’écran. Sans cet attribut, les technologies d’assistance n’ont aucun moyen de décrire le contenu intégré.aspectRatio: '16/9'sur le conteneur avecwidth: 100%etheight: 100%sur l’iframe constitue l’approche responsive la plus propre en utilisant le CSS moderne. Aucune astuce de padding nécessaire. La prise en charge par les navigateurs de la propriété CSSaspect-ratioest disponible sur Can I Use.- Le format de l’URL d’intégration est
https://www.youtube-nocookie.com/embed/{VIDEO_ID}. L’identifiant de la vidéo correspond à la valeur du paramètre de requêtevdans une URL YouTube standard (par exemple, la partie après?v=dansyoutube.com/watch?v=VIDEO_ID).
Vous pouvez transmettre des paramètres supplémentaires via la chaîne de requête :
/embed/VIDEO_ID?controls=1&rel=0
Discover how at OpenReplay.com.
Quand utiliser une bibliothèque de lecteur vidéo React
Pour la plupart des cas d’usage, l’élément natif <video> ou une simple iframe suffit. Envisagez une bibliothèque comme ReactPlayer si vous devez prendre en charge plusieurs plateformes (YouTube, Vimeo, Wistia, HLS, DASH) à partir d’un seul composant avec une API unifiée, ou si vous avez besoin de callbacks d’événements tels que onReady, onProgress ou onEnded à travers différents fournisseurs.
ReactPlayer ajoute un poids de bundle non négligeable, il vaut donc la peine d’évaluer si vous avez réellement besoin de cette flexibilité avant de l’ajouter comme dépendance.
Conclusion
Commencez par l’outil le plus simple qui fonctionne. Pour la vidéo auto-hébergée, utilisez l’élément HTML5 <video> avec controls, playsInline et muted si l’autoplay est nécessaire. Pour les intégrations YouTube dans React, une simple <iframe> pointant vers youtube-nocookie.com avec un attribut title approprié est tout ce dont vous avez besoin. N’optez pour une bibliothèque que lorsque l’approche native est réellement insuffisante.
FAQ
Les navigateurs modernes bloquent l'autoplay des vidéos avec son. Pour faire fonctionner l'autoplay de manière fiable dans Chrome, Safari et Firefox, votre élément vidéo doit inclure l'attribut muted en plus de autoPlay. Sur iOS, vous avez également besoin de playsInline, sinon la vidéo peut refuser de se lire en ligne ou s'ouvrir en plein écran. Sans ces attributs, l'autoplay échouera silencieusement.
Utilisez youtube-nocookie.com chaque fois que possible. Il s'agit du mode d'intégration à confidentialité renforcée de YouTube, qui évite de définir des cookies de suivi tant que l'utilisateur n'interagit pas réellement avec le lecteur. Les fonctionnalités de lecture principales sont largement identiques aux intégrations standard, mais ce mode est plus respectueux de la conformité en matière de confidentialité et aide à réduire les avertissements relatifs aux cookies tiers sur votre site.
Pas pour les cas d'usage typiques. L'élément vidéo HTML5 natif gère les fichiers auto-hébergés, et une simple iframe gère YouTube ou Vimeo. N'optez pour ReactPlayer que lorsque vous avez besoin d'une API unifiée unique pour plusieurs fournisseurs ou de callbacks d'événements cohérents tels que onProgress et onEnded. Sinon, le coût en taille de bundle est rarement justifié.
Enveloppez la vidéo ou l'iframe dans un conteneur stylisé avec aspectRatio défini sur 16/9 et width 100%. Définissez ensuite l'élément intérieur sur width 100% et height 100%. Cette approche CSS moderne remplace les anciennes astuces de padding-bottom et maintient la vidéo proportionnelle sur toutes les tailles d'écran sans calculs manuels.
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.