Otimização de Memória ao Trabalhar com o Elemento <video> em JavaScript
Visão Geral Rápida
Para liberar recursos adequadamente e destruir o elemento VIDEO, os seguintes passos devem ser seguidos:
- Pausar a reprodução:
video.pause()
. - Limpar a fonte:
video.src = ''
. - Recarregar o elemento:
video.load()
. - Remover ouvintes de eventos:
video.removeEventListener('tipo', manipulador)
. - Remover o elemento do DOM:
video.parentNode.removeChild(video)
.
let video = document.querySelector('video');
video.pause(); // Adeus, meu amigo...
video.src = ''; // As circunstâncias nos forçam a nos separar
video.load(); // Novo começo
video.removeEventListener('tipo', manipulador); // Infelizmente, temos que nos despedir
video.remove(); // Adeus, Vídeo!
Seguindo esses passos, você irá parar a reprodução do vídeo, liberar recursos e remover completamente o elemento.
Verificações Antes de Começar
Antes de liberar recursos e destruir o elemento VIDEO, é importante entender as possíveis consequências. Nosso principal objetivo no ano de 2022 é prevenir vazamentos de memória e melhorar o desempenho ao seguir a abordagem correta.
Por Que Usar o Método load()
Uma ideia errada comum é que simplesmente remover o VIDEO do DOM limpa o buffer e para a atividade de rede. O método load()
é necessário para informar ao navegador que ele deve parar de baixar dados de mídia e liberar os recursos ocupados pelo conteúdo da mídia.
Removendo Ouvintes de Eventos
Deixar ouvintes de eventos pendurados após remover o elemento pode levar a vazamentos de memória. Portanto, é prudente removê-los antes de destruir o elemento.
Funcionalidades Específicas dos Navegadores
Os navegadores lidam com liberação de recursos e remoção de elementos de maneira diferente. Levar em conta essas diferenças e testar em diversos ambientes é crucial para o funcionamento bem-sucedido da aplicação web.
Visualização
Vamos pensar em trabalhar com VIDEO como cuidar de um cavalo de corrida:
-
Pausar a reprodução:
video.pause();
Nós paramos o cavalo de corrida.
-
Limpar a fonte:
video.src = ""; video.load();
Nós aliviamos o cavalo de sua sela.
-
Remover ouvintes de eventos:
video.removeEventListener('evento', manipulador);
O cavalo não ouve mais comandos; agora está seguro.
-
Destruir o elemento:
video.remove();
Nós deixamos o cavalo livre.
Mais Sobre a Estratégia
Tratando Erros
Começar com pausar e limpar a fonte nos permite manter o controle sobre o elemento até que ele seja destruído.
Considerar os Interesses do Navegador
Destruir elementos incorretamente pode levar a travamentos do navegador. Antes de qualquer remoção do DOM, certifique-se de que não há ouvintes de eventos ou processos ativos associados a esse elemento.
Desativar Reprodução Automática e Pré-carregamento
Tenha cuidado com os atributos autoplay e preload. Eles podem manter a atividade de rede e o buffer, então é aconselhável desativá-los antes de liberar recursos.
Dicas e Truques Avançados
O Operador delete
Em JavaScript, o operador delete
não é adequado para destruir elementos VIDEO, pois ele apenas remove propriedades de objeto. Tenha isso em mente.
Monitoramento de Eventos
Fique atento aos eventos error e loadstart para monitorar o processo de carregamento do vídeo.
jQuery
Ao utilizar jQuery, o método empty()
pode ajudar a destruir elementos e remover vídeo caso ele esteja em outro contêiner do DOM.
Recursos Úteis
- Gerenciando Vídeo e Áudio - Web API | MDN - Guia abrangente sobre o uso de áudio e vídeo.
- Padrão HTML - O padrão oficial para elementos de vídeo em HTML.
- Como Descarregar e Destruir Corretamente um Elemento de Vídeo - Stack Overflow - Fonte extensa de conselhos práticos da comunidade.
- Prioridades de Recursos - Documento oficial do W3C sobre prioridades de elementos, incluindo vídeo.
- Video.js - Personalize Seu Reprodutor de Vídeo | Video.js - Um reprodutor de vídeo HTML5 de código aberto com várias configurações.
- Can I use... Tabelas de suporte para HTML5, CSS3, etc - Informações importantes sobre compatibilidade entre navegadores para testes cross-browser.
- GitHub - sampotts/plyr: Um Reprodutor Simples de HTML5, YouTube e Vimeo - Um reprodutor simples e funcional com suporte para YouTube e Vimeo.