지연을 활용하여 JavaScript를 최적으로 로드합니다.
15243 단어 beginnersprogrammingjavascriptwebdev
최신 웹 사이트에서 스크립트는 HTML보다
heavier
경향이 있습니다. 다운로드하고 처리하는 데 더 오래 걸립니다. 브라우저가 HTML을 로드하고 script
태그를 만날 때마다 스크립트를 즉시 로드해야 하기 때문에 DOM(Document Object Model) 생성을 계속할 수 없습니다. 외부 스크립트도 유사하게 처리됩니다. 스크립트를 다운로드한 다음 나머지 HTML 구문 분석을 계속하기 전에 다운로드한 스크립트를 실행합니다.따라서 처음에는
index.html
와 script.js
라는 두 개의 파일을 만들고 index.html
파일 내부에 HTML snippets
확장자를 사용하여 간단한 상용구 코드를 추가하거나 간단히 복사할 수 있습니다. 아래에 언급된 코드.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Script: defer</title>
</head>
<body>
</body>
</html>
이제 본문 내부에 텍스트가 있는 간단한 버튼을 만든 다음 머리 내부에 스크립트 태그를 추가하고 방금 만든
script.js
파일을 가져옵니다.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Script: defer</title>
<script src="./scripts.js"></script>
</head>
<body>
<button>Hello There!</button>
</body>
</html>
그런 다음 라이브 서버가 있는 브라우저에서 색인 파일을 열면 매우 기본적으로 보이는 버튼이 있음을 알 수 있습니다.
버튼을 조작하는 간단한 스크립트를 추가해 보겠습니다. 다음 JavaScript 코드를 복사하여
script.js
파일에 붙여넣습니다.// scripts.js
const body = document.querySelector('body');
const btn = document.querySelector('button');
btn.style.display = 'block';
btn.style.position = 'absolute';
btn.style.left = '50%';
btn.style.top = '50%';
btn.style.transform = 'translate(-50%, -50%)';
btn.style.width = '200px';
btn.style.height = '100px';
btn.style.fontSize = '2rem';
btn.style.fontFamily = 'sans-serif';
btn.style.borderRadius = '10%';
btn.style.backgroundColor = '#8661d1';
btn.style.color = '#fff';
btn.style.border = 'none';
btn.style.outline = 'none';
btn.style.cursor = 'pointer';
btn.style.boxShadow = '0 0 10px #000';
btn.style.transition = 'all 0.5s ease-in-out';
btn.addEventListener('mouseenter', () => {
btn.style.backgroundColor = '#FD5252';
});
btn.addEventListener('mouseleave', () => {
btn.style.backgroundColor = '#8661d1';
});
btn.addEventListener('click', () => {
body.style.backgroundColor = '#FD5252';
setTimeout(() => {
body.style.backgroundColor = '#fff';
}, 1000);
});
btn.addEventListener('transitionend', () => {
btn.style.backgroundColor = '#8661d1';
});
따라서 이 스크립트에서 먼저
body
를 선택한 다음 button
를 선택한 다음 해당 버튼에 다양한 스타일을 적용한 다음 일부 이벤트 리스너를 추가하고 마지막으로 해당 버튼이 수행할 작업을 지정했습니다. 특정 이벤트에서 우리 버튼은 JavaScript의 절대적인 힘을 사용하여 완전히 제어되었습니다.브라우저를 새로고침하면 사이트에 변경 사항이 없음을 알 수 있습니다. 스크립트가 헤드에 있기 때문입니다. 이는 일반적으로 JavaScript가 본문 자체보다 훨씬 먼저 로드되고 있음을 의미하기 때문에 좋지 않습니다. 이 문제를 해결하려면
defer
태그 안에 script
를 추가하기만 하면 됩니다.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Script: defer</title>
<script src="./scripts.js" defer></script>
</head>
<body>
<button>Hello There!</button>
</body>
</html>
우리는 단순히 위의 코드에서 스크립트를 연기했습니다. 즉, 스크립트는 JavaScript를 실행하기 전에 전체 본문이 로드되도록 보장합니다. 따라서 이 작업을 완료하면
index.html
파일이 다음과 같아야 합니다.이제 브라우저로 이동하여 다시 로드하면 이와 유사한 내용이 표시됩니다.
이것을 제거하면
defer
버튼이 작동하지 않는다는 것을 알게 될 것입니다. 대신 cannot read property style of null
라는 오류가 발생합니다.스크립트 태그에 도달하면 나머지 HTML 구문 분석을 중지하지만 스크립트로 진행하고 그 후에만 구문 분석을 계속하기 때문에 이 오류가 발생합니다. 즉, 버튼이 페이지에 추가되지 않았음을 의미합니다. 그러나 스크립트 태그에
defer
를 입력하면 모든 JavaScript를 다운로드한 다음 모든 것을 계속 렌더링하므로 버튼을 먼저 렌더링한 다음 스크립트가 다운로드되면 전체 페이지 렌더링을 시작합니다.사람들은 자주 스크립트를 하단에 배치하는데 이는 잘 작동하지만 브라우저가 전체 페이지를 렌더링할 때까지 스크립트 다운로드가 시작되지 않아 웹 사이트의 로딩 속도가 느려지고 사이트를 무질서하고 매력적이지 않게 만듭니다.
따라서 단순히 JavaScript를 헤드에 배치하고
defer
가 설정되어 있는지 확인하면 DOM 이벤트가 로드될 때까지 기다릴 필요가 없으며 JavaScript를 끝에 배치하는 불편한 특성을 처리할 필요가 없습니다. 지루하고 끔찍한 몸.따라서 지금부터 스크립트를
head
에 유지하십시오. 그냥 defer
하기만 하면 스크립트를 맨 아래에 놓는 것과 동일한 작업을 수행하지만 웹 페이지나 웹 사이트를 훨씬 더 빠르게 로드하는 데 도움이 됩니다.
Reference
이 문제에 관하여(지연을 활용하여 JavaScript를 최적으로 로드합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pramit_marattha/load-javascript-optimally-by-utilizing-defer-4k77텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)