자바스크립트

파일 효과적으로 가져오기 | script defer, async

solfa 2024. 7. 8. 02:04

해당 글은 하단 강의와 교안을 바탕으로 작성되었습니다.

https://www.youtube.com/playlist?list=PLlaP-jSd-nK9LiA2n07uBhzOn9wI53xGV

 

프론트엔드 날개달기

이 강의를 통해 Webpack, NPM, 모듈시스템 등 프론트엔드 개발자가 되기 전에 꼭 알아야할 지식을 탄탄히 다질 수 있습니다.

www.youtube.com

 


HTML 파일에서 자바스크립트 파일을 효과적으로 가져오는 방법

기본적인 자바스크립트 파일 가져오기

  1. HTML 파일 생성 (index.html)
  2. 자바스크립트 파일 생성 (script.js)
  3. HTML 파일에서 <script> 태그를 통해 자바스크립트 파일을 가져옴:
  4. <script src="script.js"></script>
  5. 브라우저에서 라이브 서버 실행하여 확인

버튼 클릭 시 경고창 띄우기

  1. HTML 파일에 버튼 추가:
<button id="btn">Click me</button>

 

 

   2. 자바스크립트 파일에서 버튼에 이벤트 리스너 추가:

document.querySelector('#btn').addEventListener('click', function() { alert('Hello World'); });

 

에러 발생 이유와 해결 방법

  • HTML 파일을 위에서 아래로 순차적으로 파싱하다가 <script> 태그를 만나면 자바스크립트 파일을 가져와 실행함.
  • 이때, HTML 파싱이 완료되지 않아 버튼 요소를 찾을 수 없어 에러 발생.
  • 해결 방법:

1. 스크립트 태그를 <body> 태그 하단에 위치시키기

<!DOCTYPE html>
<html lang="ko">
  <head> </head>
  <body>
    <button id="btn">버튼</button>
    <script>
      let btn = document.querySelector('#btn'); // button을 참조할 수 없습니다.
      btn.addEventListener('click', function () {
        alert('Hello world!');
      });
    </script>
  </body>
</html>

 

2. 로드 관련 이벤트 사용

  • window.onload 이벤트- HTML파싱 DOM생성 그리고 외부 콘텐츠(images, script, css, etc)가 로드된 후 발생하는 이벤트이다.
    • 근데 모든 콘텐츠를 기다려야 하니까 비효율적임
    <!DOCTYPE html>
    <html lang="ko">
      <head>
        <script>
          window.onload = function () {
            let btn = document.querySelector('#btn'); // button을 참조할 수 없습니다.
            btn.addEventListener('click', function () {
              alert('Hello world!');
            });
          };
        </script>
      </head>
      <body>
        <button id="btn">버튼</button>
      </body>
    </html>
    
  • DOMContentLoaded 이벤트 - HTML파싱 DOM생성 후 발생하는 이벤트
  •  
<!DOCTYPE html>
<html lang="ko">
  <head>
    <script>
      document.addEventListener('DOMContentLoaded', function () {
        let btn = document.querySelector('#btn'); // button을 참조할 수 없습니다.
        btn.addEventListener('click', function () {
          alert('Hello world!');
        });
      });
    </script>
  </head>
  <body>
    <button id="btn">버튼</button>
  </body>
</html>

 


 

기본적인 자바스크립트의 파일 로딩 과정

 

스크립트 태그를 헤드 태그 위에 선언했을 때,

스크립트 파일을 만나면 중간에 멈춰서 실행~

따라서 dom요소를 잘 가져오지 못했음!

 

 

스크립트를 맨 밑에 위치하게 하면 오류 발생 없음!

하지만… 이런 방법도 단점이 있다!

HTML 파싱을 할 때 스크립트 파일을 다운받으면 얼마나 좋을까?!!

 

그래서 나온게 defer과 async!

defer와 async 속성을 활용한 자바스크립트 파일 로딩

1. defer 속성

  • HTML 파싱과 함께 비동기로 자바스크립트 파일을 불러오고, 파싱이 완료된 후 실행.
  • 파싱과 스크립트 다운이 병렬적으로 실행됨
  • 사용법 : 
<script src="script.js" defer></script>

 

 

2. async 속성

  • HTML 파싱과 함께 비동기로 자바스크립트 파일을 불러오고, 불러온 즉시 실행.
  • 파싱이 완료되지 않았어도! 먼저 로딩되는 자바스크립트 파일부터 실행이 됨.
  • 사용법:
<script src="script.js" async></script>

실습 예시

  • 기본적인 <script> 태그 사용 시 문제 발생 예시:
<script src="script.js"></script>
  • 파싱 중간에 스크립트를 실행하여 요소를 찾지 못하는 경우 에러 발생.

 

  • defer 속성 사용 시 문제 해결 예시:
<script src="script.js" defer></script>
  • HTML 파싱 완료 후 스크립트를 실행하여 요소 접근 가능.

 

  • async 속성 사용 시:
<script src="script.js" async></script>
  • 스크립트를 불러온 즉시 실행하여 요소 접근이 어려울 수 있음.
728x90

'자바스크립트' 카테고리의 다른 글

이벤트 버블링&캡쳐링, 이벤트 전파  (0) 2024.07.08
this란 무엇인가?  (0) 2024.07.08
BOM 이란?  (0) 2024.07.08
DOM 이란?  (0) 2024.07.08
[JS] 동적으로 객체 속성을 생성하기  (0) 2024.01.28