Capítulo 96 de 456
Recomendações para embutir vídeo em Next.js sem prejudicar performance: <video> para conteúdo self-hosted/direto, <iframe> para plataformas externas (YouTube, Vimeo), e streaming via Server Component + Suspense para não bloquear a página.
<video>: controle total sobre playback/aparência para conteúdo self-hosted; suporta <track> para legendas.<iframe>: para vídeos hospedados em plataformas externas; menos controle, mais praticidade.autoPlay + muted + playsInline: combinação necessária para autoplay funcionar na maioria dos browsers, especialmente iOS Safari.<Suspense>: padrão recomendado pra buscar a URL de embed de um vídeo externo sem bloquear o resto da página — o fetch acontece no Server Component, e o fallback (idealmente um skeleton) é mostrado enquanto resolve.list() do @vercel/blob para obter a URL do arquivo.next-video (compatível com Vercel Blob, S3, Backblaze, Mux), Cloudinary (<CldVideoPlayer>), Mux, Fastly, ImageKit (<IKVideo>).export function Video() {
return (
<video width="320" height="240" controls preload="none">
<source src="/path/to/video.mp4" type="video/mp4" />
<track src="/path/to/captions.vtt" kind="subtitles" srcLang="en" label="English" />
Your browser does not support the video tag.
</video>
)
}
preload="none" e legendas via <track>.import { Suspense } from 'react'
import VideoComponent from '../ui/VideoComponent.jsx'
export default function Page() {
return (
<section>
<Suspense fallback={<p>Loading video...</p>}>
<VideoComponent />
</Suspense>
</section>
)
}
export default async function VideoComponent() {
const src = await getVideoSrc()
return <iframe src={src} allowFullScreen />
}
<Suspense> para não bloquear a página.import { list } from '@vercel/blob'
async function VideoComponent({ fileName }) {
const { blobs } = await list({ prefix: fileName, limit: 1 })
const { url } = blobs[0]
return (
<video controls preload="none" aria-label="Video player">
<source src={url} type="video/mp4" />
</video>
)
}
Atributo <video> | Descrição |
|---|---|
controls | Exibe controles padrão de playback |
autoPlay | Inicia automaticamente (exige muted na maioria dos browsers) |
loop | Repete o playback |
muted | Silencia áudio por padrão, geralmente com autoPlay |
preload | none / metadata / auto |
playsInline | Necessário pra autoplay funcionar em iOS Safari |
Atributo <iframe> | Descrição |
|---|---|
allowFullScreen | Permite fullscreen |
loading | Ex. lazy |
sandbox | Restrições adicionais de conteúdo |
autoPlay sem muted: a maioria dos browsers bloqueia autoplay com áudio.<Suspense> em vez de aguardar no componente pai.<video> para controle total e <iframe> para conveniência de plataformas externas.<track> para acessibilidade (legendas).