📽️

(メモ)React Hooks+Hls.jsで動画プレーヤーを実装する

2021/06/20に公開

実装

今までReact.Componentをつかって実装してきましたがいい加減FunctionComponentに移行したかったので実装してみました。
ちなみにhls.jsは型のみnode packageで導入し、実装はcdn経由で使用しています(型と実装のバージョンの差に注意)。

import React, { useEffect, useMemo, useRef } from "react"
import Hls from "hls.js"
import NextHead from "next/head"
import { FC } from "react"

interface Props {
  src: string
}

const Player: FC<Props> = ({ src }) => {
  const isSupportBrowser = useMemo(() => Hls.isSupported(), [])
  const videoRef = useRef(null)
  useEffect(() => {
    if (isSupportBrowser) {
      var hls = new Hls()
      hls.loadSource(src)
      hls.attachMedia(videoRef.current)
      return () => {
        hls.removeAllListeners()
        hls.stopLoad()
      }
    }
  }, [src])
  return (
    <>
      <NextHead>
        <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
      </NextHead>
      <div className="content">
        {isSupportBrowser ? (
          <div className="videoContainer" >
            <video ref={videoRef} className="video" controls></video>
          </div>
        ) : (
          <div className="notSupportBrowser">
            お使いのブラウザでは動画再生をサポートしていません。
          </div>
        )}
      </div>
      <style jsx>{`
        .video {
          width: 100%;
	  height: auto;
          vertical-align: top;
        }
      `}</style>
    </>
  )
}

export default Player

ポイント

  • document.getElementByID~~の文法でcastして要素を渡していましたが、useRefで参照を渡すことができます。
  • useEffectでcomponentDidMount, UnMountが表現できます。
  • ブラウザが変わることはないのでuseMemoでブラウザサポートの状態を利用します。
    const isSupportBrowser = useMemo(() => Hls.isSupported(), [])

Discussion