2 pontos por GN⁺ 2024-07-08 | 2 comentários | Compartilhar no WhatsApp
  • O embed padrão do YouTube, mesmo sozinho em uma página vazia, gera 32 requisições e 1,3 MB de transferência, o que é um peso excessivo para uma UI pequena de vídeo
  • Ao inserir vários vídeos, os recursos não são compartilhados e o peso cresce linearmente; nas medições de Zach Leatherman, 2 embeds chegaram a 2,4 MB e 3 embeds a 3,6 MB
  • Os recursos visíveis no primeiro momento são basicamente a imagem de pôster, o título e um grande botão de reproduzir, então a mesma experiência pode ser recriada de forma mais leve com um Web Component como ``
  • lite-youtube-embed fica na faixa de 100 KB e compartilha recursos entre vários embeds, melhorando velocidade e eficiência sem perda de funcionalidade
  • Como embeds do YouTube são amplamente usados, reduzir dados na casa de megabytes por embed é uma otimização prática que também diminui o consumo de energia e as emissões de carbono

O custo do embed padrão ``

  • No menu de compartilhamento do YouTube, ao selecionar Embed, é fornecido um HTML baseado em ``
  • O código padrão não inclui loading="lazy", então até vídeos fora da tela podem ser carregados imediatamente
  • Só de o YouTube adicionar lazy loading ao iframe padrão já haveria um ganho imediato de desempenho

  • Para tornar o iframe responsivo e manter a proporção original, é possível definir diretamente no CSS o iframe de embed do YouTube
iframe[src^="https://www.youtube.com/embed/";] {
  inline-size: 100%;
  block-size: auto;
  aspect-ratio: 16 / 9;
}

Medições reais e crescimento linear

  • Mesmo colocando apenas um embed do YouTube em uma página vazia, o custo de carregamento já é alto
    • 32 requisições

      • 1,3 MB de transferência de dados
      • 2,76 segundos de carregamento no Wi‑Fi do autor
      • Zach Leatherman registrou que, à medida que o número de embeds aumenta, o peso cresce linearmente porque os recursos não são compartilhados
      • 2 embeds: 2,4 MB
      • 3 embeds: 3,6 MB
      • Atualmente, o tamanho parece ter aumentado ainda mais em relação ao momento em que Zach verificou isso

A UI que o usuário vê primeiro é simples

  • No embed do YouTube, os elementos com que o usuário se depara primeiro são limitados
    • A imagem de pôster do vídeo
    • O título do vídeo
    • Um grande botão de reproduzir que inicia o vídeo ao clicar
  • Esse nível de UI e comportamento pode ser implementado sem carregar antes todos os recursos do player completo do YouTube
  • A ideia de que embeds mais leves reduziriam o engajamento é difícil de avaliar sem a divulgação da metodologia e dos dados
  • No passado, quando um engenheiro do YouTube testou uma página de vídeo mais leve, o tempo médio de carregamento chegou até a aumentar
    • A página mais leve passou a alcançar também usuários com dispositivos fracos e internet lenta
    • O uso desses novos usuários que ganharam acesso pode ter tornado o indicador de tempo médio de carregamento mais lento
    • Se olhar só o tempo médio de carregamento, dá para deixar passar melhorias reais de velocidade para cada usuário

Alternativa: Web Component ``

  • O lite-youtube-embed, criado por Paul Irish, uma referência do Google em desempenho, é um Web Component que recria de forma mais leve a experiência do embed padrão
  • A descrição do projeto diz que ele renderiza como o embed real, mas é cerca de 224 vezes mais rápido
  • A experiência do usuário é praticamente igual à do embed padrão do YouTube
    • Exibição da imagem de pôster
    • Exibição do título
    • Exibição de um grande botão de reproduzir
    • Reprodução do vídeo ao clicar
  • A diferença está no uso e no compartilhamento de recursos
    • Embed padrão do YouTube: cerca de 1,3 MB
    • ``: cerca de 100 KB
    • Possibilidade de compartilhar recursos entre vários embeds
    • Dá para obter velocidade, eficiência e proteção básica de privacidade sem perda de funcionalidade

Forma de uso e implementações relacionadas

  • A forma de uso é registrar o Web Component em JavaScript e depois usar o elemento ``
  • É possível instalar via npm, copiar diretamente ou usar link de CDN
import "https://esm.sh/lite-youtube-embed";;
  • A forma recomendada no README é colocar primeiro o HTML e carregar o script de forma assíncrona, aplicando progressive enhancement
  • Para que ele apareça corretamente mesmo antes do JavaScript carregar, background-image pode ser colocado dentro do HTML

  [Play Video: Keynote (Google I/O '18)](https://youtube.com/watch?v=ogfYd705cRs)

2 comentários

 
GN⁺ 2024-07-08
Comentários no Hacker News
  • Em uma plataforma de fóruns da comunidade, detectamos embeds do YouTube e os trocamos por miniaturas em proxy que não carregam antes do clique
    Só porque alguém compartilhou um vídeo do YouTube em uma thread não significa que todo mundo que abrir a página precise baixar mais de 1 MB de JavaScript e ainda ter o IP rastreado pelo Google

    • Administro um site de rolagem infinita em que a maioria dos embeds é de YouTube, SoundCloud e Reddit, e o YouTube só ficou minimamente utilizável depois de tratar assim
      Não me preocupo tanto com rastreamento, então continuo usando as miniaturas fornecidas pelo próprio YouTube
    • Fico curioso se existe uma solução parecida para o SoundCloud
      O player do SoundCloud também é absurdamente pesado
    • Estou lidando com exatamente o mesmo problema agora, então queria saber se alguém tem dicas ou exemplos dessa abordagem
    • Fico curioso se vocês também armazenam as miniaturas em cache ou as colocam atrás de proxy
      Se você fizer hotlink da miniatura, o Google também pode rastrear por ali
  • O autor disse que não acredita nas evidências de que uma versão mais leve reduza o engajamento, mas eu acho totalmente plausível
    A demo do projeto lite-youtube-embed que foi recomendado tem tanto o player leve quanto o normal, e a versão leve leva visivelmente mais tempo até começar a reproduzir o vídeo
    Cada aumento de 1 milissegundo no tempo de carregamento reduz o engajamento, e aqui a diferença parece ser de várias centenas de milissegundos
    https://paulirish.github.io/lite-youtube-embed/

    • Isso é bem possível, mas também é preciso avaliar se fazer o vídeo começar mais rápido vale o custo de deixar a própria página com o embed mais lenta
      A lógica de que cada milissegundo importa também se aplica à página. Se o usuário abandonar a página, ele nem chega ao vídeo
      E também pode ser ok que o usuário não queira ver o vídeo. Pessoalmente, gosto quando a página tem um resumo, porque assim posso evitar o vídeo
      Também não gosto da reformulação do YouTube no desktop; ele usa espaço demais para promover outros vídeos em vez daquele que você realmente foi ver. Queria menos distrações
    • Acho muito melhor esperar algumas centenas de milissegundos naquele raro momento em que eu realmente quero ver um vídeo embutido do que carregar todos os players embutidos toda vez que visito uma página, mesmo sem assistir
      Fazendo uma analogia com semáforos: prefiro que o sinal ao qual eu me aproximo esteja verde, em vez de todos os sinais ficarem brevemente vermelhos
    • Essa ideia de que “cada aumento de 1 milissegundo no tempo de carregamento reduz o engajamento” parece mais uma crença dos anos 90
      Se você olhar para o comportamento real das grandes empresas, fica claro que elas não ligam tanto para isso, e se não é importante para elas, não vejo por que nós deveríamos otimizar no lugar delas
      Neste caso de uso não é um grande problema, mas no restante da stack ainda vale prestar atenção em performance
    • O player antigo do YouTube carregava e armazenava em buffer o vídeo inteiro, então era conveniente porque não precisava baixar de novo ao rever
      Não sei como houve uma regressão dessas, e parece que o Google vai estragando cada vez mais coisas que antes funcionavam bem
    • Existe uma diferença, mas ela não parece tão grande assim; eu me surpreenderia se chegasse a 100 ms
      Isso pode variar conforme o ambiente: Firefox, notebook i7-1185G7 de cerca de 2 anos, Windows 11, Edge em modo 32 bits atualizando em segundo plano e sem reinicialização há algumas semanas
      Grande parte da impressão de lentidão vem do indicador giratório de carregamento. É como se estivesse anunciando que é lento
      O atraso entre o clique e o início da reprodução certamente influencia, mas para medir isso de forma adequada seria preciso uma entidade do porte do YouTube
  • Sobre o rumor de que embeds mais leves reduzem o engajamento e sobre o lite-youtube-embed sugerido, o usuário pode interpretar qualquer pequena diferença visual ou comportamental do player como algo estranho e pouco confiável
    Na demo do lite-youtube-embed, mesmo com o título visível, não há link para a página real do YouTube, o que até passa uma sensação hostil, como se impedisse o acesso ao “conteúdo” original
    Claro, essa função pode ser adicionada facilmente, mas isso revela um problema maior
    Eu quase nunca reproduzo vídeos embutidos, mas quando reproduzo, a experiência normal do YouTube já basta. Se estiver embrulhado em mais uma camada desconhecida, fico menos propenso a clicar
    A expressão deste texto de que “nada é sacrificado” é um exemplo de desenvolvedor achando que sabe como o usuário usa o software. Na prática, é sempre só um palpite
    Espero que haja menos vídeos e menos dependência do Google e de blocos de JavaScript em todo lugar. Para uma web melhor, seria melhor não embutir vídeos do YouTube em qualquer canto
    https://paulirish.github.io/lite-youtube-embed/

    • Mesmo na UI oficial de embed do YouTube, o botão Watch on YouTube não é visível o suficiente, então eu sempre clicava em reproduzir, depois pausava e então clicava no botão do YouTube no canto inferior direito
      Agora que sei disso, seria bom se esses players leves também tivessem esse botão. Ainda assim, essa implementação não bloqueia completamente uma forma fácil de obter o link
    • No lite-youtube-embed também falta o botão Salvar para assistir depois, que é um recurso que uso com frequência
      Dá para acessar isso depois de iniciar a reprodução, mas aí foge do propósito. Eu não quero reproduzir o vídeo, nem esperar ele carregar, pausar e só então apertar o botão de salvar
  • Agora só falta impedir os blogueiros de usarem embeds do GitHub Gist
    O Hugo e provavelmente outros geradores de sites estáticos já oferecem suporte nativo a trechos de código com realce de sintaxe, e até sites mais dinâmicos podem eliminar a dependência de serviços de terceiros com highlight.js
    É realmente estranho usar um iframe pesado para um trecho pequeno de código
    https://gohugo.io/content-management/syntax-highlighting/
    https://highlightjs.org

    • Acho que é só deixar as pessoas fazerem o que quiserem no próprio site
      Mesmo que eu não goste, não faz sentido “forçar” mudanças no site para se adequar ao meu gosto
    • Quando eu trabalhava na Automattic, descobri certa vez que o emoji de coração do Gist estava sendo servido pelo WordPress, e não pelo GitHub
      Foi corrigido em poucas semanas, mas me surpreendeu que aquilo tivesse ficado assim por anos
  • Se for possível usar Content Security Policy na página, dá para bloquear anúncios e reduzir o peso total do embed, além de melhorar a experiência do usuário
    Mais informações: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...

    • É melhor não colocar unsafe-inline no Content-Security-Policy sem pensar
      Porque isso desativa a proteção da CSP contra ataques de injeção. Se realmente precisar, há formas mais seguras de permitir scripts inline
      https://content-security-policy.com/
  • Parece que está faltando uma parte importante na história de que “embeds mais leves reduziram o engajamento”
    Naturalmente, se o tempo de carregamento cai, o engajamento deveria melhorar. Então, se o engajamento caiu com o embed mais leve, isso significa que alguma funcionalidade ou comportamento foi sacrificado
    Mas este texto diz que nada foi sacrificado, então alguma parte da história está faltando

    • Lembro de ter visto textos sobre grandes empresas de tecnologia como Facebook e Uber adicionando otimizações e obtendo resultados parecidos, só para depois descobrir que passaram a alcançar novos mercados onde antes nem conseguiam abrir a página
      Pode ser algo semelhante aqui. Graças ao embed mais leve, muita gente talvez tenha conseguido carregar o vídeo pela primeira vez, mas, por causa de dispositivos ou conexões lentas, pode ter desistido na etapa de reprodução
      Nesse caso, pessoas que antes nem conseguiam carregar totalmente o player e não deixavam dado algum agora podem aparecer como aumento na taxa de “abandono ao assistir vídeo”
    • “Se o tempo de carregamento cai, o engajamento melhora” não é algo tão simples assim
      Os usuários têm expectativas e tolerâncias diferentes para tempo de carregamento dependendo do alvo, e a página e o vídeo dentro dela são alvos diferentes
      O tempo de carregamento da página inteira nem sempre está atrelado ao tempo de carregamento do embed, e o carregamento total da página pode até mascarar o tempo de carregamento do conteúdo
      Um indicador mais importante talvez não seja o tempo de carregamento do embed, mas sim a latência entre o clique e a reprodução
  • Como solução do lado do usuário para quem usa uBlock, dá para usar filtros click2load
    Só que o Chrome está migrando para o Manifest V3, então talvez isso não funcione. Basta consultar o filtro de yokoffing/filterlists
    https://raw.githubusercontent.com/yokoffing/filterlists/main...
    É o criador do Betterfox e também tem outros filtros úteis no GitHub

    • Click2load é uma melhora, mas embeds continuam ruins
      O que eu queria era só um link comum, então antigamente fiz um script de usuário curto que trocava iframes do YouTube na página por links
      Funciona surpreendentemente bem para uma implementação tão simples. Ele procura iframes youtube.com/embed e youtube-nocookie.com/embed, troca por links watch?v= e também mantém o timestamp, além de poder incluir imagem de miniatura se quiser
  • A parte de que “à medida que o número de embeds aumenta, o peso também cresce linearmente. Dois dão 2,4 MB, três dão 3,6 MB” é estranha
    Fico me perguntando por que esses recursos não estão vindo do cache. Se todos são carregados de www.youtube.com, não deveria ser possível usar recursos em cache pela política de mesma origem?

  • A melhor parte do texto foi quando trocaram para uma página mais leve e o tempo médio de carregamento da página acabou aumentando
    Olhando mais de perto, usuários com dispositivos fracos e internet lenta passaram pela primeira vez a conseguir usar o YouTube de fato, e como usaram bastante, a média passou a parecer mais lenta
    Foi marcante perceber que a velocidade de uso real ficou relativamente mais rápida para todo mundo, e que a métrica de velocidade média de carregamento da página no fim era só uma isca sem sentido

  • Há muito tempo eu fiz uma extensão para Firefox que trocava todos os embeds do YouTube por miniaturas e, ao clicar, abria o YouTube
    Originalmente fiz isso porque celulares não tinham Flash, mas embeds em Flash eram comuns, e depois expandi a extensão para lidar também com embeds em iframe
    Na maioria dos casos, abrir o site ou app completo do YouTube oferecia uma experiência melhor do que uma janelinha pequena de embed
    Na época eu a escrevi para a nova API de extensões de alto nível, mas o suporte entre versões do navegador não continuou tanto quanto eu esperava, então fiquei irritado e não a portei para WebExtension. Ver este texto me dá vontade de portar de novo