How to use custom element with NextJS/React

Sep 7, 2021 · Dung Huynh

Context

Embedding YouTube's default player loads heavy JS/CSS. lite-youtube-embed is a lightweight alternative using custom elements. React doesn't recognize custom elements, requiring @ts-expect-error and dynamic import with SSR disabled.

Usage

Create YoutubeVideo.tsx:

import "lite-youtube-embed/src/lite-yt-embed.css";
import "lite-youtube-embed/src/lite-yt-embed.js";

const YoutubeVideo = ({
  videoId,
  title,
}: {
  videoId: string;
  title: string;
}) => (
  // @ts-expect-error custom element
  <lite-youtube videoid={videoId}>
    <button type="button" className="lty-playbtn">
      <span className="lyt-visually-hidden">{title}</span>
    </button>
  </lite-youtube>
);

export default YoutubeVideo;

Dynamic import (disable SSR):

import dynamic from 'next/dynamic'

const YoutubeVideo = dynamic(() => import('./YoutubeVideo'), {
  loading: () => <div>Loading...</div>,
  ssr: false,
})

<YoutubeVideo videoId={post.youtube_id} title={post.title} />