2 puan yazan GN⁺ 2024-07-08 | 2 yorum | WhatsApp'ta paylaş
  • Varsayılan YouTube `` embed'i, boş bir sayfaya yalnızca bir tane eklendiğinde bile 32 istek ve 1.3MB veri transferi oluşturuyor; bu da küçük bir video arayüzüne kıyasla büyük bir yük anlamına geliyor
  • Birden fazla video eklendiğinde kaynaklar paylaşılmadığı için yük doğrusal olarak artıyor; Zach Leatherman'ın ölçümünde 2 embed 2.4MB'a, 3 embed ise 3.6MB'a çıkıyor
  • Kullanıcının ilk gördüğü şey çoğunlukla poster görseli, başlık ve büyük oynat düğmesi olduğu için `` gibi bir Web Component ile aynı deneyim çok daha hafif şekilde yeniden üretilebiliyor
  • lite-youtube-embed, yaklaşık 100KB düzeyinde ve birden çok embed arasında kaynak paylaşabildiği için, işlev kaybı olmadan hız ve verimliliği artırıyor
  • YouTube embed'leri çok yaygın kullanıldığından, embed başına megabayt düzeyindeki veriyi azaltmak elektrik tüketimini ve karbon emisyonunu da düşüren somut bir optimizasyon oluyor

Varsayılan `` embed'inin maliyeti

  • YouTube paylaşım menüsünde Embed seçildiğinde, `` tabanlı HTML veriliyor
  • Varsayılan kodda loading="lazy" bulunmadığı için, ekran dışında kalan videolar bile hemen yüklenebiliyor
  • YouTube, varsayılan iframe'e yalnızca lazy loading eklese bile anında performans iyileşmesi sağlanabilir

  • iframe'i duyarlı hale getirip orijinal oranı korumak için CSS ile YouTube embed iframe'ini doğrudan hedefleyebilirsiniz
iframe[src^="https://www.youtube.com/embed/";] {
  inline-size: 100%;
  block-size: auto;
  aspect-ratio: 16 / 9;
}

Gerçek ölçümler ve doğrusal artış

  • Boş bir sayfaya yalnızca tek bir YouTube embed'i eklendiğinde bile yükleme maliyeti oldukça yüksek çıkıyor
    • 32 istek

      • 1.3MB veri transferi
      • Yazarın WiFi bağlantısında 2.76 saniye yükleme süresi
      • Zach Leatherman, embed sayısı arttıkça kaynaklar paylaşılmadığı için yükün doğrusal arttığını belirtiyor
      • 2 embed: 2.4MB
      • 3 embed: 3.6MB
      • Görünüşe göre boyut, Zach'in bunu doğruladığı zamana kıyasla bugün daha da artmış durumda

Kullanıcının ilk gördüğü arayüz basit

  • YouTube embed'inde kullanıcının ilk karşılaştığı öğeler sınırlı
    • Videonun poster görseli
    • Video başlığı
    • Tıklanınca oynatan büyük oynat düğmesi
  • Bu düzeyde bir arayüz ve davranış, tüm YouTube oynatıcı kaynaklarını en başta yüklemeden de uygulanabilir
  • Hafif embed'lerin etkileşimi düşürdüğü iddiasını, yöntem ve veri paylaşılmadan değerlendirmek zor
  • Geçmişte bir YouTube mühendisi daha hafif bir video sayfasını test ettiğinde, ortalama yükleme süresinin tersine arttığı bir örnek de vardı
    • Daha hafif sayfa, düşük performanslı cihazlar ve yavaş internet kullanan kullanıcılara da ulaşabildi
    • Yeni erişim kazanılan bu kullanıcıların kullanımı, ortalama yükleme süresi metriğini yavaşlatmış olabilir
    • Yalnızca ortalama yükleme süresine bakmak, kullanıcı bazındaki gerçek hız iyileşmesini gözden kaçırabilir

Alternatif: `` Web Component

  • Google'ın performans alanındaki isimlerinden Paul Irish'in hazırladığı lite-youtube-embed, varsayılan embed deneyimini daha hafif biçimde yeniden oluşturan bir Web Component
  • Proje açıklaması, gerçek embed gibi render ederken yaklaşık 224 kat daha hızlı olduğunu söylüyor
  • Kullanıcı deneyimi varsayılan YouTube embed'iyle neredeyse aynı
    • Poster görselini gösterme
    • Başlığı gösterme
    • Büyük oynat düğmesini gösterme
    • Tıklayınca videoyu oynatma
  • Fark, kaynak kullanımı ve paylaşım biçiminde ortaya çıkıyor
    • Varsayılan YouTube embed'i: yaklaşık 1.3MB
    • ``: yaklaşık 100KB
    • Birden fazla embed arasında kaynak paylaşımı mümkün
    • İşlev kaybı olmadan hız, verimlilik ve varsayılan gizlilik avantajı sağlanabiliyor

Kullanım şekli ve ilgili uygulamalar

  • JavaScript ile Web Component kaydedildikten sonra `` öğesi kullanılıyor
  • npm kurulumu, doğrudan kopyalama ve CDN bağlantısı yöntemlerinin hepsi mümkün
import "https://esm.sh/lite-youtube-embed";;
  • README'nin önerdiği yaklaşım, önce HTML'i koyup ardından script'i asenkron yükleyerek progressive enhancement uygulamak
  • JavaScript yüklenmeden önce de doğru görünmesi için background-image HTML içine yerleştirilebiliyor

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

2 yorum

 
GN⁺ 2024-07-08
Hacker News yorumları
  • Topluluk forum platformunda YouTube embed'lerini tespit edip, tıklanmadan önce yüklenmeyen proxy küçük görsellerle değiştiriyorum
    Başlıktaki birinin bir YouTube videosu paylaşmış olması, o sayfayı açan herkesin 1MB+ JavaScript indirmek ve IP'sinin Google tarafından takip edilmesi zorunda olduğu anlamına gelmemeli

    • Çoğunluğu YouTube, SoundCloud ve Reddit embed'lerinden oluşan sonsuz kaydırmalı bir site işletiyorum; kullanılabilir hale gelmesi için YouTube'u böyle ele almak gerekti
      Takibi çok önemsemediğim için YouTube'un sağladığı küçük görselleri doğrudan kullanıyorum
    • SoundCloud için de benzer bir çözüm olup olmadığını merak ediyorum
      SoundCloud oynatıcısı da inanılmaz ağır
    • Tam da aynı sorunla uğraşıyorum; bu yaklaşımla ilgili ipucu ya da örnek varsa bilmek isterim
    • Küçük görselleri de önbelleğe alıp almadığınızı veya proxy'leyip proxy'lemediğinizi merak ediyorum
      Küçük görselleri hotlink ederseniz Google oradan da takip yapabilir
  • Yazar, daha hafif sürümün etkileşimi düşürdüğüne dair kanıta inanmadığını söylemiş ama ben bunun gayet mümkün olduğunu düşünüyorum
    Önerilen lite-youtube-embed projesinin demosunda hem hafif oynatıcı hem normal oynatıcı var; hafif sürümde video oynatmanın başlaması gözle görülür biçimde daha uzun sürüyor
    Yükleme süresine eklenen her 1 milisaniye etkileşimi azaltır, burada da fark birkaç yüz milisaniyeden fazla gibi görünüyor
    https://paulirish.github.io/lite-youtube-embed/

    • Bu büyük olasılıkla doğrudur ama videoyu daha hızlı başlatmanın, gömülü web sayfasının kendisini yavaşlatma bedeline değip değmediğini de düşünmek gerek
      Her milisaniye önemlidir mantığı web sayfası için de geçerli. Kullanıcı sayfadan çıkarsa videoya zaten hiç gelmez
      Ayrıca kullanıcının videoyu izlemek istememesi de sorun olmayabilir. Kişisel olarak web sayfasında bir özet varsa videodan kaçınabildiğim için memnunum
      YouTube'un masaüstü yeniden tasarımından da memnun değilim; izlemeye geldiğim videodan çok diğer videoları öne çıkarmak için ekranı kullanıyor. Keşke daha az dikkat dağıtıcı unsur olsa
    • Gerçekten gömülü videoyu izlemek istediğim o nadir anda birkaç yüz milisaniye beklemeyi, hiç izlemeyeceğim gömülü oynatıcıların her sayfa ziyaretinde tamamen yüklenmesine çok daha fazla tercih ederim
      Trafik ışığı benzetmesiyle, tüm ışıkların kısa süreli kırmızı olmasındansa sadece yaklaştığım ışığın yeşil olmasını tercih ederim
    • “Yükleme süresine eklenen her 1 milisaniye etkileşimi azaltır” sözü daha çok 90'lar tarzı bir inanç gibi
      Büyük şirketlerin gerçek davranışlarına bakınca buna aldırmadıkları açık; onlar için önemli değilse bizim de onların yerine optimizasyon yapmamız için bir neden yok
      Bu kullanım örneğinde büyük bir mesele değil ama yığının geri kalanında performansa dikkat etmek gerek
    • Eski YouTube oynatıcısı videonun tamamını yükleyip arabelleğe alıyordu; böylece tekrar izlerken yeniden indirmek gerekmiyordu ve kullanışlıydı
      Nasıl oldu da bu kadar geri gittik bilmiyorum; Google sanki düzgün çalışan şeyleri zamanla bozuyor
    • Bir fark var ama o kadar büyük görünmüyor; 100ms'ye ulaşıyorsa şaşırırım
      Ortama göre değişebilir: Firefox, yaklaşık 2 yıllık i7-1185G7 dizüstü, Windows 11, 32 bit modunda Edge sürekli güncelleniyor ve haftalardır yeniden başlatılmamış durumda
      Yavaş hissettiren şey büyük ölçüde dönen yükleme göstergesi. Adeta kendi yavaşlığını ilan ediyor
      Tıklamadan sonra oynatmaya kadar olan gecikme etkili olabilir ama bunun derecesini düzgün ölçmek için YouTube ölçeğinde bir aktör gerekir
  • Daha hafif embed'lerin etkileşimi düşürdüğü söylentisi ve önerilen lite-youtube-embed hakkında, kullanıcılar oynatıcı biraz farklı görünse ya da farklı davransa bile bunu yabancı ve güvenilmez bir şey olarak algılayabilir
    Demodaki lite-youtube-embed, başlık görünse de gerçek YouTube sayfasına giden bir bağlantı sunmadığı için, asıl “içeriğe” gitmeyi engelleyen düşmanca bir his bile veriyor
    Elbette bu özellik kolayca eklenebilir ama daha büyük bir sorunu da ortaya koyuyor
    Gömülü videoları neredeyse hiç oynatmam ama oynatacaksam sıradan YouTube deneyimi benim için yeterli. Bunu bilinmeyen başka bir katmanla sarmak tıklama olasılığını azaltıyor
    Bu yazıdaki “hiçbir şey feda edilmiyor” ifadesi, geliştiricinin kullanıcıların yazılımı nasıl kullandığını bildiğini sanmasının bir örneği. Gerçekte bu her zaman sadece bir tahmindir
    Umarım videolar azalır, her yerdeki Google bağımlılığı ve JavaScript yığınları da azalır. Daha iyi bir web için YouTube videoları her yere embed edilmemeli
    https://paulirish.github.io/lite-youtube-embed/

    • YouTube'un resmi embed arayüzünde de Watch on YouTube düğmesi yeterince görünür değil; bu yüzden hep önce oynata basıp sonra duraklatıyor ve sağ alttaki YouTube düğmesine tıklıyordum
      Artık bildiğime göre bu tür hafif oynatıcılarda da o düğmenin olmasını isterim. Yine de bu uygulama bağlantıyı edinmenin kolay yolunu tamamen engellemiyor
    • lite-youtube-embed'de Daha sonra izle listesine kaydet düğmesi de yok, oysa sık kullandığım bir özellik
      Videoyu oynatınca erişilebiliyor ama bu amaca aykırı. Videoyu oynatmak istemiyorum; yüklenmesini bekleyip duraklattıktan sonra kaydet düğmesine basmak da istemiyorum
  • Artık blog yazarlarının GitHub Gist embed kullanmasını da engellemek kaldı
    Hugo ve muhtemelen diğer statik site oluşturucular, sözdizimi vurgulamalı kod parçacıklarını zaten yerleşik olarak destekliyor; daha dinamik siteler de highlight.js ile üçüncü taraf hizmet bağımlılığını ortadan kaldırabilir
    Küçük kod parçaları için ağır bir iframe kullanmak gerçekten garip
    https://gohugo.io/content-management/syntax-highlighting/
    https://highlightjs.org

    • İnsanları kendi sitelerinde istediklerini yapmaya bırakmak gerekmez mi?
      Benim hoşuma gitmese bile, zevkime uysun diye site değişikliği “dayatmak” mantıklı değil
    • Automattic'te çalışırken, Gist'teki kalp emojisinin GitHub tarafından değil WordPress tarafından sunulduğunu fark etmiştim
      Birkaç hafta içinde düzeltildi ama o hâliyle yıllarca kalmış olması şaşırtıcıydı
  • Sayfada Content Security Policy kullanabiliyorsanız, reklamları engelleyerek embed'in toplam ağırlığını azaltabilir ve kullanıcı deneyimini de iyileştirebilirsiniz
    İlgili bilgi: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...

    • Content-Security-Policy içine gelişigüzel unsafe-inline koymamak iyi olur
      Çünkü CSP'nin enjeksiyon saldırılarına karşı korumasını kapatır. Gerçekten gerekliyse, inline script'e izin vermenin daha güvenli yolları var
      https://content-security-policy.com/
  • “Daha hafif embed, etkileşimi düşürdü” anlatısında büyük bir eksik var gibi görünüyor
    Normalde yükleme süresi kısalınca etkileşimin iyileşmesi gerekir. Ama hafif embed'de etkileşim düştüyse, bu bazı özelliklerin ya da davranışların feda edildiği anlamına gelir
    Oysa bu yazı hiçbir şeyin feda edilmediğini söylüyor; demek ki hikâyenin bir yerinde eksik bir parça var

    • Facebook ya da Uber gibi büyük teknoloji şirketlerinin optimizasyon ekleyince benzer sonuçlar gördüğünü, sonra da bunun daha önce sayfayı bile açamayan yeni pazarlara erişmeye başlamalarından kaynaklandığını anlatan yazılar gördüğümü hatırlıyorum
      Burada da benzer bir durum olabilir. Daha hafif embed sayesinde birçok kişi videoyu ilk kez yükleyebildi ama cihazı ya da bağlantısı yavaş olduğu için oynatma aşamasında ayrılmış olabilir
      Bu durumda, daha önce oynatıcıyı hiç yükleyemediği için veri bırakmayan insanlar artık “video izlemeyi yarıda bırakanlar” oranını yükseltiyormuş gibi görünebilir
    • “Yükleme süresi kısalırsa etkileşim artar” o kadar da basit değil
      Kullanıcıların hedefe göre yükleme süresi beklentileri ve toleransı değişir; sayfanın kendisiyle içindeki video da farklı hedeflerdir
      Sayfanın toplam yüklenme süresi her zaman embed'in yüklenme süresine bağlı değildir ve sayfanın genel yüklenmesi içerik yüklenme süresini de perdeleyebilir
      Daha önemli metrik, embed yüklenme süresi değil, tıklamadan oynatmaya kadar geçen gecikme olabilir
  • uBlock kullanıcıları için istemci tarafında bir çözüm olarak click2load filtresi kullanılabilir
    Ancak Chrome Manifest V3'e geçiyor, bu yüzden çalışmayabilir. yokoffing/filterlists içindeki filtreye bakabilirsiniz
    https://raw.githubusercontent.com/yokoffing/filterlists/main...
    Betterfox'un geliştiricisi ve GitHub'da başka faydalı filtreleri de var

    • Click2load bir iyileştirme ama embed'ler hâlâ kötü
      İstediğim şey sadece normal bir bağlantı olduğu için, eskiden sayfadaki YouTube iframe'lerini linke çeviren kısa bir kullanıcı betiği yazmıştım
      Basit bir uygulama için şaşırtıcı derecede iyi çalışıyor. youtube.com/embed ve youtube-nocookie.com/embed iframe'lerini bulup watch?v= bağlantılarına çeviriyor, zaman damgasını da koruyabiliyor ve istenirse küçük görseli de ekleyebiliyor
  • “Embed sayısı arttıkça ağırlık da doğrusal artıyor. İki tane 2.4MB, üç tane 3.6MB” kısmı tuhaf
    Bu kaynakların neden önbellekten gelmediğini merak ediyorum. Hepsi www.youtube.com üzerinden yükleniyorsa, aynı kaynak politikası gereği önbelleğe alınmış kaynakların kullanılabilmesi gerekmez mi?

  • Yazıdaki en iyi kısım, daha hafif sayfaya geçince ortalama sayfa yükleme süresinin aslında yükseldiğini anlattığı bölümdü
    Daha yakından bakınca, düşük donanımlı ve yavaş internetli cihaz kullanıcılarının da YouTube'u ilk kez gerçekten kullanabilir hâle geldiği ve onların yoğun kullanımı yüzünden ortalamanın yavaşlamış gibi göründüğü ortaya çıkmış
    Gerçek kullanım hızı herkes için göreli olarak artmıştı ve ortalama sayfa yükleme hızı metriğinin sonuçta anlamsız bir dikkat dağıtıcı olması çok etkileyiciydi

  • Bir zamanlar tüm YouTube embed'lerini küçük görsele çeviren ve tıklayınca YouTube'u açan bir Firefox eklentisi yapmıştım
    Başta telefonda Flash olmadığı hâlde Flash embed'ler yaygın olduğu için yapmıştım; sonra iframe embed'leri de işleyecek şekilde genişlettim
    Çoğu durumda, küçük bir embed penceresindense doğrudan YouTube sitesini ya da uygulamasını tam olarak açmak kullanıcı deneyimi açısından daha iyiydi
    O dönemde yeni üst seviye eklenti API'sine göre yazmış olmama rağmen, tarayıcı sürümleri arasında desteğin beklediğim kadar sürmemesi can sıkıcıydı; bu yüzden WebExtension'a taşımadım. Bu yazıyı görünce tekrar port etmeyi istedim