페이지 속도를 개선하기 위해 Youtube iframe 방지
10857 단어 pagespeedyoutubejavascripthtml
Google에서 웹 사이트 속도를 측정하기 위해 Core Web Vitals를 도입한 후 좋은 점수를 얻으려면 몇 가지 사항을 변경해야 합니다.
큰 문제는 YouTube iframe입니다! 페이지를 로드하자마자 그들은 외부 요청을 할 것입니다. 한편으로는 플레이어 설정에 따라 일부 kb/mb를 로드하지만 다른 한편으로는 GDPR/DSGVO로 인해 방지해야 할 수 있는 외부 요청입니다!
문제
따라서 다음과 같은 간단한 페이지가 있습니다.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<script src="main.js"></script>
</head>
<body>
<main>
<iframe id="ytplayer" type="text/html" width="640" height="360" src="http://www.youtube.com/embed/RNuUgbUzM8U?autoplay=1&origin=http://example.com" frameborder="0" />
</main>
</body>
</html>
DevTools 네트워크 탭에서 다음과 같이 표시됩니다.
요청 32개/2.92MB(3.47MB)
외부 요청이 많고 이미 비디오를 미리 로드하고 있습니다.
그것을 고치는 방법
HTML 코드를 변경하지 않고 이 간단한 JavaScript 파일을 사용하여 자동 로드를 방지할 수 있습니다.
function updateElements(elements) {
// loop through all elements
for (var i = 0; i < elements.length; i++) {
const currentNode = elements[i].addedNodes;
for (var j = 0; j < currentNode.length; j++) {
if (currentNode[j].nodeName.toLowerCase() == "iframe") {
const myLink = currentNode[j].src;
// create local HTML code with Youtube link - replace ___data___ with data - dev.to's markdown parser won't let me use it :)
const localHtml = '<html><body style="background:rgb(200,200,200)"><a href="' + myLink + '" style="font-size:14px;text-align:center;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);"><img src="___data___:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzMuOTJtbSIgaGVpZ2h0PSIyMy42Mm1tIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMy45MiAyMy42MiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04OC4wNCAtMTM2LjcpIj4KICA8cGF0aCB0cmFuc2Zvcm09InNjYWxlKC4yNjQ2KSIgZD0ibTM0MS43IDUxNi42Yy00Ljk0NiAwLTguOTI4IDMuOTgxLTguOTI4IDguOTI4djcxLjQzYzAgNC45NDYgMy45ODEgOC45MjggOC45MjggOC45MjhoMTEwLjRjNC45NDYgMCA4LjkyOC0zLjk4MSA4LjkyOC04LjkyOHYtNzEuNDNjMC00Ljk0Ni0zLjk4MS04LjkyOC04LjkyOC04LjkyOHptNDcuMzIgMjkuNTYgMjYuNTIgMTUuMDktMjYuNTIgMTUuMDl6IiBmaWxsPSIjZjAwIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMuMDM0cHgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8L2c+Cjwvc3ZnPgo=" width="80" height="55"/><br/>play video</a></body></html>';
currentNode[j].setAttribute("data-src", myLink);
// set local HTML
// replace ___data___ with data - dev.to's markdown parser won't let me use it :)
currentNode[j].src = "___data___:text/html;charset=utf-8," + localHtml;
}
}
}
// remove listeners at the end
removeEventListener(document, updateElements);
}
function removeEvents(obj, callback) {
if (window.__obs) {
window.__obs.disconnect();
}
}
function registerEvents(obj, callback) {
const MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
if (MutationObserver) {
const obs = new MutationObserver(function(mutations, observer) {
callback(mutations)
});
obs.observe(obj, {
childList: true,
subtree: true
});
window.__obs = obs;
}
}
// register events
registerEvents(document, updateElements);
Attention: please replace all
___data___
withdata
. The markdown parser will throw an error when I just usedata
이것은 MutationObserver를 등록하고 DOM에 추가될 때 iframe 소스를 제거합니다.
이렇게 하면 원본 iframe 소스 로드가 중지되고 대신 로컬 HTML 파일이 표시됩니다.
외부 요청이 없습니다!
링크를 클릭하자마자 원본 소스로 이동하고 사용자 상호 작용이므로 비디오를 재생합니다.
개량
물론
localHtml
페이지를 보기 좋게 변경하거나 이미지를 표시하는 등의 작업을 할 수 있습니다. 개념 증명을 위해 간단하게 유지하기로 결정했습니다 😉
Reference
이 문제에 관하여(페이지 속도를 개선하기 위해 Youtube iframe 방지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/miga/prevent-youtube-iframes-to-improve-page-speed-j0l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)