2 puntos por GN⁺ 2024-07-08 | 2 comentarios | Compartir por WhatsApp
  • El embed `` predeterminado de YouTube, incluso si se agrega solo uno en una página vacía, genera 32 solicitudes y 1.3 MB de transferencia, una carga considerable para una UI de video pequeña
  • Si se agregan varios videos, los recursos no se comparten y el peso aumenta linealmente; en las mediciones de Zach Leatherman sube a 2.4 MB con 2 embeds y a 3.6 MB con 3
  • Las funciones visibles al inicio son básicamente la imagen de póster, el título y un gran botón de reproducción, por lo que se puede recrear la misma experiencia de forma más ligera con un Web Component como ``
  • lite-youtube-embed pesa alrededor de 100 KB y comparte recursos entre varios embeds, mejorando velocidad y eficiencia sin perder funcionalidad
  • Dado el uso extendido de los embeds de YouTube, reducir megabytes de datos por embed se convierte en una optimización real que también baja el consumo eléctrico y las emisiones de carbono

El costo del embed `` predeterminado

  • Al seleccionar Embed en el menú de compartir de YouTube, se entrega HTML basado en ``
  • El código predeterminado no incluye loading="lazy", por lo que incluso videos fuera de pantalla pueden cargarse de inmediato
  • Si YouTube agregara solo carga diferida al iframe predeterminado, podría lograr una mejora de rendimiento inmediata

  • Para hacer que el iframe sea responsivo y mantenga su proporción original, se puede apuntar directamente al iframe del embed de YouTube con CSS
iframe[src^="https://www.youtube.com/embed/";] {
  inline-size: 100%;
  block-size: auto;
  aspect-ratio: 16 / 9;
}

Mediciones reales y aumento lineal

  • Incluso al poner un solo embed de YouTube en una página vacía, el costo de carga resulta alto
    • 32 solicitudes

      • 1.3 MB de transferencia de datos
      • 2.76 segundos de carga con el WiFi del autor
      • Zach Leatherman registró que, a medida que aumentan los embeds, los recursos no se comparten y el peso crece linealmente
      • 2 embeds: 2.4 MB
      • 3 embeds: 3.6 MB
      • Actualmente parece que el tamaño aumentó aún más respecto del momento en que Zach lo verificó

La UI que el usuario ve primero es simple

  • Los elementos que el usuario encuentra primero en un embed de YouTube son limitados
    • La imagen de póster del video
    • El título del video
    • Un gran botón de reproducción que inicia el video al hacer clic
  • Esa UI y ese comportamiento se pueden implementar sin cargar primero todos los recursos del reproductor de YouTube
  • Es difícil evaluar la afirmación de que un embed ligero reduce la participación si no se publican la metodología y los datos
  • También hubo un caso en el pasado en el que, cuando un ingeniero de YouTube probó una página de video más ligera, el tiempo de carga promedio aumentó
    • La página más ligera llegó también a usuarios con dispositivos de bajo rendimiento y conexiones lentas
    • El uso por parte de esos nuevos usuarios ahora alcanzables pudo haber hecho que la métrica de tiempo de carga promedio pareciera más lenta
    • Si se mira solo el tiempo de carga promedio, se pueden pasar por alto mejoras reales de velocidad a nivel de usuario

Alternativa: Web Component ``

  • lite-youtube-embed, creado por Paul Irish, una figura relacionada con performance en Google, es un Web Component que recrea la experiencia del embed predeterminado de forma más ligera
  • La descripción del proyecto dice que renderiza como el embed real y es aproximadamente 224 veces más rápido
  • La experiencia de usuario es casi igual a la del embed predeterminado de YouTube
    • Muestra la imagen de póster
    • Muestra el título
    • Muestra un gran botón de reproducción
    • Reproduce el video al hacer clic
  • La diferencia está en el uso de recursos y en la forma de compartirlos
    • Embed predeterminado de YouTube: alrededor de 1.3 MB
    • ``: alrededor de 100 KB
    • Posibilidad de compartir recursos entre varios embeds
    • Se obtiene velocidad, eficiencia y protección básica de privacidad sin pérdida de funcionalidad

Forma de uso e implementaciones relacionadas

  • Consiste en registrar el Web Component con JavaScript y luego usar el elemento ``
  • Se puede instalar vía npm, copiar directamente o enlazar desde un CDN
import "https://esm.sh/lite-youtube-embed";;
  • El método recomendado en el README consiste en poner primero el HTML y cargar el script de forma asíncrona para aplicar mejora progresiva
  • Para que se vea correctamente incluso antes de que cargue JavaScript, se puede incluir background-image dentro del HTML

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

2 comentarios

 
GN⁺ 2024-07-08
Opiniones de Hacker News
  • En una plataforma comunitaria de foros detectan los embeds de YouTube y los reemplazan por miniaturas proxy que no cargan nada hasta hacer clic
    Que alguien comparta un video de YouTube en un hilo no significa que todos los que abran esa página tengan que descargar más de 1 MB de JavaScript y además dejar que Google rastree su IP

    • Administro un sitio de scroll infinito donde la mayoría son embeds de YouTube, SoundCloud y Reddit, y con YouTube solo se volvió usable al tratarlo así
      No me preocupa demasiado el rastreo, así que sigo usando directamente las miniaturas que ofrece YouTube
    • Me pregunto si habrá una solución parecida para SoundCloud
      El reproductor de SoundCloud también es pesadísimo
    • Justo estoy lidiando con el mismo problema, así que si alguien tiene tips o ejemplos de este enfoque, me gustaría conocerlos
    • Me pregunto si también hacen caché o proxy de las miniaturas
      Si haces hotlink de las miniaturas, Google también puede rastrear desde ahí
  • El autor dijo que no cree en la evidencia de que una versión más ligera reduzca la interacción, pero yo sí veo bastante posible que pase
    En el demo del proyecto recomendado lite-youtube-embed están tanto el reproductor ligero como el normal, y la versión ligera tarda visiblemente más en empezar a reproducir el video
    Cada vez que el tiempo de carga aumenta 1 milisegundo, la interacción baja, y aquí la diferencia parece de varios cientos de milisegundos
    https://paulirish.github.io/lite-youtube-embed/

    • Es muy probable, pero también habría que preguntarse si lograr que el video empiece más rápido vale el costo de volver más lenta la propia página web embebida
      La lógica de que cada milisegundo importa también aplica a la página web. Si el usuario abandona la página, ni siquiera llegará al video
      Además, también puede estar bien que el usuario no quiera ver el video. En lo personal, si hay un resumen en la página, me gusta poder evitar el video
      También me molesta el rediseño de YouTube para escritorio, porque usa demasiado espacio para promocionar otros videos en vez del que de verdad fui a ver. Ojalá tuviera menos distracciones
    • En esos raros momentos en que de verdad quiero ver un video embebido, prefiero esperar unos cientos de milisegundos antes que cargar todos los reproductores embebidos que ni voy a ver cada vez que visite la página
      En términos de semáforos, prefiero que el que se me acerca esté en verde a que todos estén en rojo por un rato corto
    • Eso de que “cada vez que el tiempo de carga aumenta 1 milisegundo, la interacción baja” suena más a una creencia noventera
      Si ves cómo actúan realmente las grandes empresas, queda claro que no les preocupa eso, y si para ellas no es importante, tampoco hay razón para que nosotros optimicemos en su lugar
      En este caso de uso no es un gran problema, pero en el resto del stack sí hay que cuidar el rendimiento
    • El reproductor viejo de YouTube cargaba y almacenaba en búfer todo el video, así que era cómodo porque no había que volver a descargarlo para verlo otra vez
      No sé cómo terminamos retrocediendo tanto, y parece que Google cada vez arruina más cosas que antes funcionaban perfectamente
    • Sí hay diferencia, pero no parece tan grande; me sorprendería que llegara a 100 ms
      Puede variar según el entorno: Firefox, una laptop i7-1185G7 de hace unos 2 años, Windows 11, Edge en modo de 32 bits actualizándose todo el tiempo y sin reiniciar por varias semanas
      Gran parte de la impresión de lentitud viene del indicador giratorio de carga. Es como anunciar por sí mismo que es lento
      El retraso entre hacer clic y que empiece la reproducción sí puede influir, pero para medir eso bien haría falta alguien del tamaño de YouTube
  • Sobre el rumor de que un embed más ligero reduce la interacción y sobre el lite-youtube-embed propuesto, los usuarios pueden percibir incluso pequeñas diferencias visuales o de comportamiento del reproductor como algo desconocido y poco confiable
    El lite-youtube-embed del demo, aunque muestra el título, no ofrece un enlace para ir a la página real de YouTube, así que hasta da una sensación hostil, como si te impidiera llegar al “contenido” original
    Claro, esa función se puede agregar fácilmente, pero eso deja ver un problema mayor
    Casi nunca reproduzco videos embebidos, pero si lo hiciera, me basta con la experiencia normal de YouTube. Si lo envuelven en otra capa desconocida, me dan menos ganas de hacer clic
    La frase de este artículo de que “no se sacrifica nada” es un ejemplo de desarrolladores creyendo que saben cómo usan los usuarios el software. En realidad, siempre son suposiciones
    Ojalá hubiera menos videos, menos dependencia de Google en todas partes y menos bloques de JavaScript. Para una web mejor, ojalá no se embebieran videos de YouTube en cualquier lado
    https://paulirish.github.io/lite-youtube-embed/

    • Incluso en la UI oficial del embed de YouTube, el botón Watch on YouTube no destaca lo suficiente, así que yo siempre le daba reproducir, luego pausar, y después hacía clic en el botón de YouTube abajo a la derecha
      Ahora que lo sé, estaría bien que estos reproductores ligeros también tuvieran ese botón. Aun así, esta implementación no bloquea por completo una forma fácil de obtener el enlace
    • A lite-youtube-embed también le falta el botón de guardar en Ver más tarde, que es una función que uso seguido
      Puedes acceder a ella si reproduces el video, pero eso va contra el propósito. No quiero reproducir el video, ni esperar a que cargue, pausar y luego apretar el botón de guardar
  • Ahora solo falta impedir que los blogueros usen embeds de GitHub Gist
    Hugo y probablemente otros generadores de sitios estáticos ya traen soporte por defecto para fragmentos de código con resaltado de sintaxis, y los sitios más dinámicos también pueden eliminar la dependencia de servicios de terceros usando highlight.js
    Usar un iframe pesado para un fragmento de código pequeño es realmente raro
    https://gohugo.io/content-management/syntax-highlighting/
    https://highlightjs.org

    • Supongo que habría que dejar que la gente haga lo que quiera en su propio sitio
      Aunque a mí no me guste, no tiene sentido “forzar” cambios en un sitio para que encaje con mis gustos
    • Cuando trabajaba en Automattic, una vez descubrí que el emoji de corazón de Gist lo servía WordPress y no GitHub
      Lo arreglaron en unas semanas, pero me sorprendió que hubiera estado así durante años
  • Si puedes aprovechar Content Security Policy en la página, puedes bloquear anuncios para reducir el peso total del embed y también mejorar la experiencia de usuario
    Más información: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...

    • Conviene no meter unsafe-inline a la ligera en Content-Security-Policy
      Porque eso desactiva la protección de CSP contra ataques de inyección. Si de verdad hace falta, hay formas más seguras de permitir scripts inline
      https://content-security-policy.com/
  • Siento que a la idea de que “los embeds más ligeros redujeron la interacción” le falta una parte importante
    En teoría, si el tiempo de carga mejora, la interacción también debería mejorar. Entonces, si con un embed más ligero la interacción bajó, eso significa que se sacrificó alguna función o comportamiento
    Pero este artículo dice que no se sacrificó nada, así que falta algo en la historia

    • Recuerdo haber leído sobre grandes tecnológicas como Facebook o Uber que añadieron optimizaciones y obtuvieron resultados parecidos, y al final resultó que empezaron a llegar a mercados nuevos donde antes ni siquiera se podía abrir la página
      Aquí podría estar pasando algo similar. Gracias a embeds más ligeros, mucha gente pudo cargar el video por primera vez, pero como sus dispositivos o conexiones eran lentos, quizá abandonaron al momento de reproducirlo
      Entonces personas que antes ni siquiera lograban cargar por completo el reproductor y no dejaban ningún dato, ahora podrían aparecer como un aumento en la tasa de “abandono de reproducción de video”
    • “Si el tiempo de carga mejora, la interacción mejora” no es algo tan simple
      Los usuarios tienen expectativas y tolerancias distintas respecto a los tiempos de carga según el objetivo, y la página y el video dentro de ella son objetivos distintos
      Además, el tiempo de carga total de la página no siempre está atado al tiempo de carga del embed, y la carga completa de la página puede ocultar el tiempo de carga del contenido
      Una métrica más importante que el tiempo de carga del embed podría ser la demora entre el clic y la reproducción
  • Como solución del lado del usuario para quienes usan uBlock, se pueden usar filtros click2load
    Eso sí, como Chrome está migrando a Manifest V3, puede que ya no funcionen. Basta con revisar los filtros de yokoffing/filterlists
    https://raw.githubusercontent.com/yokoffing/filterlists/main...
    Es el creador de Betterfox y también tiene otros filtros útiles en GitHub

    • Click2load es una mejora, pero los embeds siguen siendo malos
      Lo que yo quería era simplemente un enlace normal, así que hace tiempo hice un pequeño user script que reemplazaba los iframes de YouTube en páginas por enlaces
      Para ser una implementación sencilla, funciona sorprendentemente bien. Busca iframes youtube.com/embed y youtube-nocookie.com/embed, los cambia por enlaces watch?v=, también conserva la marca de tiempo y, si quieres, incluso puede poner una imagen en miniatura
  • Me parece rara la parte de “a mayor número de embeds, el peso crece linealmente. Dos son 2.4MB, tres son 3.6MB”
    Me pregunto por qué esos recursos no se obtienen desde la caché. Si todo se carga desde www.youtube.com, por la política del mismo origen deberían poder reutilizarse los recursos cacheados, ¿no?

  • La mejor parte del artículo, para mí, fue cuando cuenta que después de cambiar a una página más ligera, el tiempo promedio de carga de la página en realidad subió
    Viéndolo más de cerca, resulta que los usuarios con dispositivos de gama baja o internet lento por fin pudieron usar YouTube de verdad, y como empezaron a usarlo mucho, dio la impresión de que el promedio se había vuelto más lento
    Lo impactante es que la velocidad de uso real mejoró relativamente para todos, y que la métrica de velocidad promedio de carga de la página terminó siendo un señuelo sin sentido

  • Hace tiempo hice una extensión de Firefox que convertía todos los embeds de YouTube en miniaturas y, al hacer clic, abría YouTube
    Al principio la hice porque en los teléfonos no había Flash, pero los embeds en Flash eran comunes, y después amplié la extensión para manejar también embeds en iframe
    En la mayoría de los casos, abrir el sitio web completo de YouTube o la app daba una mejor experiencia de usuario que una ventanita de embed pequeña
    En ese momento la escribí para la nueva API de extensiones de alto nivel, pero me frustró que la compatibilidad entre versiones del navegador no se mantuviera tanto como esperaba, así que no la migré a WebExtension. Este artículo me dan ganas de portarla de nuevo