개발공부/JavaScript

html에 script를 추가할 때 어떤 방법이 가장 좋을까?

개발자 찐빵이 2022. 1. 17. 20:23
728x90
반응형

웹 개발을 할 때 HTML head에 script를 포함한다.
브라우저는 사용자가 HTML 파일을 다운로드하였을 때 브라우저를 한 줄씩 분석하게 되는데,
script 태그가 보이면 script파일을 다운받아야 한다.

script를 다운받는 방법은 한 가지 일까?
효율적으로 script파일을 다운로드하는 방법은 무엇일까?

fetching : 스크립트를 서버에서 받아온다.
executing : 스크립트 실행

1. 헤더에 그냥 추가하기

<head>
  <script src="main.js"></script>
</head>

이 방법은 HTML을 파싱하다가 script태그를 만났을 때 파싱을 멈추고,
. js파일을 다운로드, 실행한다.

. js파일이 크기가 크거나 인터넷이 느린 경우 사용자가 웹 페이지를 볼 때까지
오랜 시간이 걸린다는 단점이 있다.

2. body 끝부분에 추가하기

<body>
  <div></div>
  <script src="main.js"></script>
</body>

브라우저가 HTML을 파싱 해서 페이지가 준비된 다음
스크립트를 다운받고 실행한다.

스크립트가 준비가 안되어도 페이지를 볼 수 있다는 장점이 있지만,
웹사이트가 자바스크립트에 의존적이라면 (ex: 서버에서 데이터를 받아오거나, DOM요소를 더 꾸며야 할 때)
스크립트를 받기 전까지 정상적인 페이지를 볼 수 없다.

3. 헤더에 asyn 옵션으로 추가하기

<head>
  <script asyn src="main.js"></script>
</head>
  • asyn 옵션은 boolean 타입이라 선언하면 true로 설정된다.

이 방법은 HTML과 script 다운로드를 동시에 진행하면서 시간을 단축할 수 있다.
script다운로드가 끝나면 HTML파싱을 멈추고 script 실행을 한 다음,
남은 HTML을 파싱한다.

단점
이 방법은 script가 HTML이 파싱 되기 전에 실행될 수 있기 때문에
script 파일에서 DOM접근을 해야 하는데 파싱이 되지 않아서 접근하지 못할 수 있다.

또한 파싱이 끝나기 전에 멈추고 script를 실행하기 때문에
사용자가 페이지를 볼 때까지 오랜 시간이 걸릴 수 있다.

script가 여러 개라면 순차적으로 실행되지 않을 수 있다.

4. 헤더에 defer 옵션으로 추가하기

<head>
  <script defer src="main.js"></script>
</head>

이 방법은 HTML과 script 다운로드를 동시에 진행하면서 시간을 단축할 수 있다.
HTML 파싱이 끝나면 script를 실행한다.

script가 여러개라면 선언한 순서대로 실행된다.

결론

사용자에게 웹 페이지를 가장 빠르게 보여주고, script를 순서대로 보여주는
defer 옵션이 가장 안전하다.

반응형