Princípios
- Poster primeiro — LCP deve ser imagem estática (
poster/image), não o stream. - Nunca carregar todos os vídeos — grids e carrosséis iniciam reprodução sob demanda.
- Um stream ativo — em carrosséis, reels e grids, só um vídeo tocando por vez.
- Reservar espaço —
aspect-ratioou dimensões explícitas (evita CLS). - Destruir ao desmontar — cleanup no
useEffect(pause, removersrc,load()).
LCP (Largest Contentful Paint)
❌ Hero autoplay sem poster
❌ Vídeo acima da dobra sem altura reservada
CLS (Cumulative Layout Shift)
- Portrait (Reels):
aspectRatio: '9 / 16'. objectFit: 'cover'no vídeo dentro do container com ratio fixo.
Preload
Lazy loading em React
Poster
Vídeo — play no clique
IntersectionObserver
Carrossel e slider
- Slide ativo: pode reproduzir (muted, loop).
- Slides ocultos:
pause(),preload="none". - Na troca: pausar anterior antes de iniciar o próximo.
- Nunca autoplay em todos os slides.
Carrossel com vídeo (HLS)
Sections com vários<video> da biblioteca (Reels, marquee) exigem regras extras:
- Separe efeito de setup do HLS (
[src]) do efeito de play/pause ([shouldPlay]). Recriar Hls.js a cada mudança de visibilidade causa loop de requisiçõesseg_*.mp4. - Marquee com autoplay: use
playWhenVisible={false}— a animação CSS torna oIntersectionObserverinstável. - Um snippet
CorvexVideocomuseCorvexVideoPlayback— não duplique fetch de/playbackem cada block. - Teste na loja publicada, não só no canvas do editor.
Autoplay
Mobile
playsInlineem todo<video>.- Botões play/mute ≥ 44×44 px.
- Portrait: testar
9:16eenv(safe-area-inset-bottom). - Conexão lenta: poster primeiro; stream só após gesto.
Checklist performance
- Poster no hero (LCP)
-
aspect-ratioem todo container de vídeo - Máximo um vídeo reproduzindo em listas/carrosséis
-
preload="none"em grids - Stream iniciado no clique ou quando visível
- Cleanup no
useEffectreturn -
prefers-reduced-motiondesliga autoplay - Testar URL publicada, não só preview do editor
- Carrossel com vídeo: sem loop HLS — guia

