2 điểm bởi GN⁺ 2024-07-08 | 2 bình luận | Chia sẻ qua WhatsApp
  • Một thẻ nhúng YouTube `` mặc định, ngay cả khi chỉ đặt một cái trên trang trống, cũng tạo ra 32 request1.3MB dữ liệu truyền tải, là gánh nặng lớn so với một UI video nhỏ
  • Khi gắn nhiều video, tài nguyên không được chia sẻ nên dung lượng tăng tuyến tính; theo đo đạc của Zach Leatherman, 2 video tăng lên 2.4MB và 3 video lên tới 3.6MB
  • Những gì người dùng thấy lúc đầu chỉ là ảnh poster, tiêu đề và nút phát lớn, nên có thể tái hiện cùng trải nghiệm đó nhẹ hơn nhiều bằng Web Component như ``
  • lite-youtube-embed chỉ khoảng 100KB và chia sẻ tài nguyên giữa nhiều phần nhúng, giúp cải thiện tốc độ và hiệu quả mà không mất tính năng
  • Vì nhúng YouTube được dùng rất rộng rãi, việc cắt giảm dữ liệu ở mức megabyte cho mỗi embed là một tối ưu hóa thực tế, giúp giảm cả điện năng tiêu thụ lẫn phát thải carbon

Chi phí của nhúng `` mặc định

  • Khi chọn Embed trong menu chia sẻ của YouTube, bạn sẽ nhận được HTML dựa trên ``
  • Mã mặc định không có loading="lazy", nên cả video ngoài màn hình cũng có thể bị tải ngay lập tức
  • Chỉ cần YouTube thêm lazy loading vào iframe mặc định là đã có thể cải thiện hiệu năng ngay

  • Để biến iframe thành dạng responsive và giữ đúng tỷ lệ gốc, có thể chỉ định trực tiếp iframe nhúng YouTube bằng CSS
iframe[src^="https://www.youtube.com/embed/";] {
  inline-size: 100%;
  block-size: auto;
  aspect-ratio: 16 / 9;
}

Số đo thực tế và mức tăng tuyến tính

  • Ngay cả khi chỉ đặt một nhúng YouTube trên trang trống, chi phí tải vẫn rất lớn
    • 32 request

      • 1.3MB dữ liệu truyền tải
      • 2.76 giây tải theo WiFi của tác giả
      • Zach Leatherman ghi nhận rằng khi số lượng embed tăng lên, tài nguyên không được chia sẻ nên dung lượng tăng tuyến tính
      • 2 embed: 2.4MB
      • 3 embed: 3.6MB
      • Có vẻ hiện tại kích thước còn lớn hơn so với thời điểm Zach kiểm tra

UI người dùng nhìn thấy lúc đầu rất đơn giản

  • Những thành phần người dùng gặp đầu tiên trong nhúng YouTube là khá hạn chế
    • Ảnh poster của video
    • Tiêu đề video
    • Nút phát lớn, bấm vào là chạy
  • Mức UI và hành vi này có thể triển khai được mà không cần tải toàn bộ tài nguyên của trình phát YouTube ngay từ đầu
  • Khó đánh giá nhận định rằng nhúng nhẹ hơn làm giảm mức độ tương tác nếu không công bố phương pháp và dữ liệu
  • Trong quá khứ, khi một kỹ sư YouTube thử nghiệm trang video nhẹ hơn, thời gian tải trung bình lại tăng lên
    • Trang nhẹ hơn đã tiếp cận được cả người dùng thiết bị cấu hình thấp và mạng chậm
    • Việc người dùng mới có thể truy cập được có thể đã làm chỉ số thời gian tải trung bình chậm đi
    • Nếu chỉ nhìn vào thời gian tải trung bình thì có thể bỏ lỡ mức cải thiện tốc độ thực tế theo từng người dùng

Giải pháp thay thế: Web Component ``

  • lite-youtube-embed do Paul Irish, một nhân vật gắn liền với hiệu năng tại Google, tạo ra là một Web Component tái hiện trải nghiệm nhúng mặc định theo cách nhẹ hơn
  • Phần mô tả dự án giới thiệu rằng nó render như embed thật nhưng nhanh hơn khoảng 224 lần
  • Trải nghiệm người dùng gần như giống nhúng YouTube mặc định
    • Hiển thị ảnh poster
    • Hiển thị tiêu đề
    • Hiển thị nút phát lớn
    • Phát video khi nhấp
  • Khác biệt nằm ở mức dùng tài nguyên và cách chia sẻ chúng
    • Nhúng YouTube mặc định: khoảng 1.3MB
    • ``: khoảng 100KB
    • Có thể chia sẻ tài nguyên giữa nhiều embed
    • Có được tốc độ, hiệu quả và quyền riêng tư cơ bản tốt hơn mà không mất tính năng

Cách sử dụng và triển khai liên quan

  • Cách dùng là đăng ký Web Component bằng JavaScript rồi sử dụng phần tử ``
  • Đều có thể dùng qua cài npm, sao chép trực tiếp hoặc liên kết CDN
import "https://esm.sh/lite-youtube-embed";;
  • Cách được README khuyến nghị là đặt HTML trước, rồi tải script bất đồng bộ để áp dụng progressive enhancement
  • Có thể đặt background-image ngay trong HTML để vẫn hiển thị đúng trước khi JavaScript được tải

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

2 bình luận

 
GN⁺ 2024-07-08
Ý kiến trên Hacker News
  • Trên một nền tảng diễn đàn cộng đồng, họ phát hiện YouTube embed và thay bằng thumbnail proxy không được tải trước khi người dùng nhấp vào
    Chỉ vì một người trong thread chia sẻ video YouTube mà tất cả những ai mở trang đó phải tải hơn 1MB JavaScript và còn bị Google theo dõi IP là điều không cần thiết

    • Tôi vận hành một site cuộn vô hạn chủ yếu là embed YouTube, SoundCloud, Reddit; với YouTube phải xử lý như vậy thì mới tạm dùng được
      Tôi không quá bận tâm về theo dõi nên vẫn dùng nguyên thumbnail do YouTube cung cấp
    • Tôi tò mò liệu SoundCloud có giải pháp tương tự không
      Player của SoundCloud cũng cực kỳ nặng
    • Đúng lúc tôi cũng đang xử lý cùng vấn đề, nên muốn biết có mẹo hay ví dụ nào cho cách này không
    • Tôi cũng tò mò liệu thumbnail có được cache hoặc proxy không
      Nếu hotlink thumbnail thì Google vẫn có thể theo dõi từ đó
  • Tác giả nói không tin có bằng chứng rằng phiên bản nhẹ hơn làm giảm mức độ tương tác, nhưng tôi nghĩ điều đó hoàn toàn có thể xảy ra
    Demo của dự án lite-youtube-embed được đề xuất có cả player nhẹ và player thông thường, và phiên bản nhẹ mất thời gian lâu hơn thấy rõ để bắt đầu phát video
    Cứ mỗi 1 mili giây tăng thêm trong thời gian tải thì mức độ tương tác lại giảm, còn ở đây chênh lệch có vẻ là hàng trăm mili giây trở lên
    https://paulirish.github.io/lite-youtube-embed/

    • Rất có thể là vậy, nhưng cũng cần cân nhắc liệu việc cho video bắt đầu nhanh hơn có đáng để đánh đổi bằng việc làm chậm chính trang web đang nhúng nó hay không
      Lập luận từng mili giây đều quan trọng cũng áp dụng cho trang web. Nếu người dùng rời trang thì họ còn chưa kịp tới video
      Ngoài ra, việc người dùng không muốn xem video cũng có thể là điều ổn. Cá nhân tôi thích khi trang web có phần tóm tắt để có thể tránh xem video
      Tôi cũng không hài lòng với đợt thiết kế lại bản desktop của YouTube; họ dùng quá nhiều diện tích màn hình để quảng bá các video khác thay vì video mà tôi thật sự đến xem. Tôi muốn ít yếu tố gây phân tâm hơn
    • Trong những khoảnh khắc hiếm hoi tôi thật sự muốn xem video được nhúng, việc chờ vài trăm mili giây vẫn tốt hơn nhiều so với mỗi lần ghé trang đều phải tải toàn bộ các player embed mà tôi sẽ không xem
      Ví như đèn giao thông, tôi thích đèn mình đang đi tới là đèn xanh hơn là tất cả đèn đều đỏ trong thời gian ngắn
    • “Cứ mỗi 1 mili giây tăng thêm trong thời gian tải thì mức độ tương tác giảm” nghe giống một niềm tin kiểu thập niên 90 hơn
      Nhìn vào hành vi thực tế của các tập đoàn lớn thì rõ ràng họ không bận tâm đến chuyện đó; nếu điều đó không quan trọng với họ thì chúng ta cũng không có lý do gì phải tối ưu hộ họ
      Trong trường hợp sử dụng này thì không phải vấn đề lớn, nhưng với phần còn lại của stack thì vẫn cần quan tâm đến hiệu năng
    • Player YouTube ngày trước tải và buffer toàn bộ video, nên khi xem lại không cần tải lại, rất tiện
      Không hiểu vì sao lại thụt lùi đến mức này, và Google có vẻ đang dần làm hỏng những thứ vốn hoạt động ổn
    • Có khác biệt thật, nhưng có vẻ không lớn đến vậy; nếu lên tới 100ms thì tôi sẽ ngạc nhiên
      Có thể tùy môi trường: Firefox, laptop i7-1185G7 khoảng 2 năm tuổi, Windows 11, Edge chế độ 32-bit vẫn đang cập nhật liên tục và vài tuần chưa khởi động lại
      Cảm giác chậm phần lớn đến từ biểu tượng loading xoay vòng. Nó giống như tự quảng cáo rằng mình chậm vậy
      Độ trễ từ lúc nhấp đến khi phát chắc chắn có ảnh hưởng, nhưng để đo đúng mức đó thì cần một bên có quy mô như YouTube
  • Về tin đồn rằng embed nhẹ hơn làm giảm mức độ tương tác và lite-youtube-embed được đề xuất, người dùng có thể cảm thấy xa lạ và không tin nếu player chỉ trông hơi khác hoặc hoạt động hơi khác
    Trong demo, lite-youtube-embed dù có hiển thị tiêu đề nhưng lại không có liên kết để chuyển sang trang YouTube thật, tạo cảm giác thù địch như thể ngăn người dùng tới “nội dung” gốc
    Tất nhiên tính năng đó có thể dễ dàng thêm vào, nhưng nó cho thấy một vấn đề lớn hơn
    Tôi hầu như không bao giờ phát video embed, nhưng nếu có phát thì trải nghiệm YouTube thông thường là đủ. Nếu bọc nó trong một lớp lạ khác thì khả năng tôi nhấp vào sẽ giảm
    Cách nói “không hy sinh gì cả” trong bài viết này là một ví dụ về việc lập trình viên tưởng rằng mình biết người dùng sử dụng phần mềm như thế nào. Thực tế thì luôn chỉ là phỏng đoán
    Tôi hy vọng video sẽ ít đi, sự phụ thuộc vào Google ở khắp nơi và các khối JavaScript cũng ít đi. Vì một web tốt hơn, mong mọi người đừng nhúng video YouTube lung tung khắp nơi
    https://paulirish.github.io/lite-youtube-embed/

    • Ngay cả trong UI embed chính thức của YouTube, nút Watch on YouTube cũng không đủ nổi bật, nên tôi luôn phải bấm phát rồi tạm dừng và bấm nút YouTube ở góc dưới bên phải
      Giờ đã biết chuyện này, tôi hy vọng các player nhẹ như vậy cũng có nút đó. Dù sao thì cách triển khai này cũng không hoàn toàn chặn cách dễ để lấy liên kết
    • lite-youtube-embed cũng thiếu nút lưu vào Xem sau, đây là tính năng tôi dùng thường xuyên
      Nếu phát video thì có thể truy cập được, nhưng như vậy lại trái mục đích. Tôi không muốn phát video, cũng không muốn chờ nó tải xong rồi tạm dừng để bấm nút lưu
  • Giờ chỉ cần ngăn các blogger dùng nhúng GitHub Gist nữa là được
    Hugo và có lẽ các trình tạo site tĩnh khác đều hỗ trợ sẵn các đoạn mã có tô sáng cú pháp, còn các site động hơn cũng có thể dùng highlight.js để loại bỏ phụ thuộc vào dịch vụ bên thứ ba
    Dùng một iframe nặng nề cho một đoạn mã nhỏ thật sự rất lạ
    https://gohugo.io/content-management/syntax-highlighting/
    https://highlightjs.org

    • Cứ để mọi người làm điều họ muốn trên site của họ không được sao
      Dù tôi không thích, việc “ép” họ thay đổi site cho hợp gu của tôi là vô lý
    • Khi làm ở Automattic, tôi từng phát hiện emoji trái tim của Gist thực ra được phục vụ từ WordPress chứ không phải GitHub
      Nó được sửa trong vài tuần, nhưng tôi ngạc nhiên là tình trạng đó đã tồn tại suốt nhiều năm
  • Nếu có thể tận dụng Content Security Policy trên trang, có thể chặn quảng cáo để giảm tổng dung lượng của phần nhúng và cải thiện trải nghiệm người dùng
    Thông tin liên quan: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...

    • Tốt nhất đừng vô tư thêm unsafe-inline vào Content-Security-Policy
      Vì làm vậy sẽ tắt cơ chế phòng vệ của CSP trước các cuộc tấn công chèn mã. Nếu thật sự cần, có những cách an toàn hơn để cho phép script inline
      https://content-security-policy.com/
  • Có vẻ câu chuyện “phần nhúng nhẹ hơn làm giảm mức độ tương tác” đang thiếu một phần quan trọng
    Lẽ ra thời gian tải nhanh hơn thì mức độ tương tác phải tốt hơn. Nhưng nếu phần nhúng nhẹ hơn lại làm tương tác giảm, nghĩa là đã hy sinh một tính năng hoặc hành vi nào đó
    Thế mà bài viết này nói không hy sinh gì cả, nên hẳn câu chuyện còn thiếu chỗ nào đó

    • Tôi nhớ từng đọc một bài nói rằng các công ty công nghệ lớn như Facebook hay Uber thêm tối ưu hóa rồi nhận được kết quả tương tự, và hóa ra trước đó họ bắt đầu tiếp cận được các thị trường mới vốn thậm chí còn không mở nổi trang
      Ở đây cũng có thể tương tự. Nhờ phần nhúng nhẹ hơn, nhiều người lần đầu tải được video, nhưng do thiết bị hoặc kết nối chậm nên rời đi ở bước phát
      Khi đó những người trước đây không tải nổi trình phát hoàn chỉnh và không để lại dữ liệu nào, nay lại xuất hiện như làm tăng tỷ lệ “bỏ xem video”
    • “Thời gian tải nhanh hơn thì tương tác tốt hơn” không đơn giản đến thế
      Người dùng có kỳ vọng và mức chịu đựng thời gian tải khác nhau tùy đối tượng, và trang với video bên trong là hai đối tượng khác nhau
      Thời gian tải toàn trang cũng không phải lúc nào cũng gắn với thời gian tải phần nhúng, và việc tải toàn trang có thể che lấp thời gian tải nội dung
      Chỉ số quan trọng hơn có thể không phải thời gian tải phần nhúng, mà là độ trễ từ lúc nhấp đến lúc phát
  • Với người dùng uBlock, có thể dùng bộ lọc click2load như một giải pháp phía người dùng
    Tuy nhiên Chrome đang chuyển sang Manifest V3 nên có thể không hoạt động. Có thể tham khảo bộ lọc của yokoffing/filterlists
    https://raw.githubusercontent.com/yokoffing/filterlists/main...
    Đây là tác giả của Betterfox và trên GitHub còn có các bộ lọc hữu ích khác

    • Click2load là một cải tiến, nhưng phần nhúng vẫn không ổn
      Thứ tôi muốn chỉ là một liên kết bình thường, nên trước đây tôi đã viết một userscript ngắn để thay iframe YouTube trên trang bằng liên kết
      Với một cách triển khai đơn giản, nó hoạt động tốt đáng ngạc nhiên. Nó tìm các iframe youtube.com/embedyoutube-nocookie.com/embed, đổi thành liên kết watch?v=, giữ cả timestamp, và nếu muốn còn có thể gắn thêm ảnh thumbnail
  • Phần nói “càng nhiều phần nhúng thì dung lượng cũng tăng tuyến tính. Hai cái là 2,4MB, ba cái là 3,6MB” nghe hơi lạ
    Tôi tò mò vì sao các tài nguyên này không được lấy từ cache. Nếu tất cả đều được tải từ www.youtube.com, theo same-origin policy thì đáng ra phải dùng được tài nguyên đã cache chứ

  • Phần hay nhất trong bài là đoạn nói rằng khi chuyển sang trang nhẹ hơn, thời gian tải trang trung bình lại tăng
    Nhìn kỹ hơn thì người dùng thiết bị cấu hình thấp và mạng chậm lần đầu tiên mới thật sự dùng được YouTube, và vì họ dùng nhiều nên trông như mức trung bình bị chậm đi
    Tốc độ sử dụng thực tế đã tương đối nhanh hơn với mọi người, và thật ấn tượng khi thấy chỉ số tốc độ tải trang trung bình rốt cuộc chỉ là một cái bẫy vô nghĩa

  • Trước đây tôi từng làm một extension Firefox biến mọi phần nhúng YouTube thành thumbnail, rồi khi nhấp thì mở YouTube
    Ban đầu tôi làm vì điện thoại không có Flash trong khi phần nhúng Flash rất phổ biến, về sau mở rộng để xử lý cả phần nhúng iframe
    Trong hầu hết trường hợp, mở bằng toàn bộ website hoặc ứng dụng YouTube cho trải nghiệm người dùng tốt hơn so với một khung nhúng nhỏ
    Dù khi đó tôi viết theo API extension cấp cao mới, hỗ trợ giữa các phiên bản trình duyệt vẫn không được duy trì như kỳ vọng, khiến tôi bực nên đã không chuyển sang WebExtension. Đọc bài này làm tôi muốn port lại