<script> 태그는 보통 <body> 태그의 최하단에 위치하는데요. 그 이유가 무엇일까요?의도: 브라우저의 로딩 방식과 DOM 트리 구축 등 렌더링 과정에 대한 지식이 있는지 확인하는 질문
팁: module과 defer 속성에 대해서도 언급하면 좋다.
나의 답안
그 이유는 페이지 로딩 속도와 사용자 경험 때문입니다.
브라우저는 HTML을 위에서부터 차례로 파싱하면서 화면을 그리는데,
<script>태그를 만나면 자바스크립트를 다운로드하고 실행할 때까지 HTML 파싱이 일시 중단됩니다.
즉, 스크립트가 상단에 있으면 렌더링이 지연되어 사용자에게 화면이 늦게 보이는 문제가 생깁니다.그래서
<body>하단에 스크립트를 두면 HTML 구조와 콘텐츠가 먼저 로드된 뒤,
그 이후에 자바스크립트가 실행되기 때문에 초기 렌더링 속도가 빨라지고 사용자에게 더 빠른 반응을 보여줄 수 있습니다.
주어진 답안 (모범 답안)
첫 번째 이유는 페이지의 로딩 속도 최적화 때문입니다.
브라우저는 html을 읽어내려가다<script>태그를 만나게 되면 해당 자바스크립트 코드를 읽고 실행하기 시작합니다.
만약<script>태그가 상단에 있다면 DOM 트리 구축 시기가 늦어져 페이지의 로딩이 느려질 수 있습니다.두 번째 이유는 DOM 접근 시에 오류가 생길 수 있기 때문입니다.
앞서 자바스크립트가 먼저 읽히고 실행될 수도 있다고 말씀드렸죠?
그런데 만약 자바스크립트 코드에document.querySelector처럼 html 태그를 가져오는 코드가 있다면 어떻게 될까요?
아직 DOM 트리가 구축되지 않았으므로 원하는 태그를 가져오지 못하고undefined를 반환하게 됩니다.
이러한 이유로<script>태그를<body>의 최하단에 넣곤 합니다.물론 다른 방법도 있는데요, 바로
<script>태그에defer나module을 작성하는 것입니다.
그러면 자동으로<script>태그를 지연 로딩할 수 있습니다.
<script> 태그는 HTML 문서에서 JavaScript 코드를 포함하거나 외부 스크립트 파일을 불러올 때 사용하는 태그이다.
<script> 태그의 기본 구조<!DOCTYPE html>
<html lang="ko">
<head>
<title>스크립트 테스트</title>
</head>
<body>
<h1>안녕하세요!</h1>
<script>
alert("페이지가 로드되었습니다.");
</script>
</body>
</html><script> 태그는 기본적으로 HTML 코드 어디에서든 사용할 수 있지만, 가능하면 <body>의 맨 아래나 defer 속성을 사용하는 것이 좋다.<script src="script.js"></script><script> 태그의 주요 속성들src: 외부 스크립트 파일 경로<script src="app.js"></script>src 속성을 사용하면 해당 파일의 코드를 실행한다.src가 있으면 <script> 태그 내부에는 코드를 작성하면 안 된다.async: 비동기 실행<script src="script1.js" async></script>
<script src="script2.js" async></script><script> 태그가 있을 때, 실행 순서가 보장되지 않는다.defer: HTML 파싱 완료 후 실행<script src="script1.js" defer></script>
<script src="script2.js" defer></script><script defer>는 작성된 순서대로 실행된다.async보다 defer가 안정적)type: MIME 타입 지정
MIME(Multipurpose Internet Mail Extensions) 타입은 파일의 형식(타입)을 나타내는 문자열이다.
웹에서 서버와 클라이언트가 데이터를 주고받을 때 파일의 종류를 명확하게 구분하는 역할을 한다.
즉, 브라우저나 서버가 이 파일이 어떤 형식인지 알 수 있도록 하는 정보이다.
<script type="module" src="script.js"></script>
type="module" → ES 모듈(JavaScript 모듈) 사용type="text/javascript" (생략 가능)<script type="module">
import { hello } from "./module.js";
hello();
</script><script> 태그의 위치일반적으로 script 태그는 두 가지 위치에서 사용된다.
<head> 안에 배치<head>
<script src="script.js"></script>
</head>src)이 크다면 페이지 로딩이 느려질 수 있다.defer 또는 async 사용<head>
<script src="script.js" defer></script>
</head><body>의 맨 아래에 배치 (권장)<body>
<h1>안녕하세요!</h1>
<script src="script.js"></script>
</body><script> 태그를 사용할 때 주의할 점async를 사용하면 실행 순서가 보장되지 않는다.defer를 사용하면 순서가 유지된다.defer 속성을 추가하거나 <script> 태그를 <body> 아래에 배치하는 것이 안전하다.<script> 태그를 <body>의 최하단에 위치시키는 게 좋은 이유<script> 태그를 <body> 태그의 맨 아래에 배치하는 이유는 웹페이지의 성능과 사용자 경험(UX)을 개선하기 위해서이다.
<script> 태그는 기본적으로 HTML 렌더링을 차단(blocking)한다.
기본적으로 <script> 태그를 만나면, 브라우저는 HTML 파싱을 멈추고 JS 파일 다운로드 → 실행 완료 후 다시 HTML을 파싱한다.
<head>에 <script>를 배치한 경우<!DOCTYPE html>
<html lang="ko">
<head>
<script src="script.js"></script> <!-- 여기서 실행 차단 발생 -->
</head>
<body>
<h1>안녕하세요!</h1>
</body>
</html>script.js 파일을 다운로드하고 실행하는 동안, 페이지 렌더링(화면 표시)이 멈춰 있다.script.js가 크다면 로딩 속도가 크게 느려진다.<script>를 <body> 맨 아래 배치하면 렌더링이 먼저 완료된다.<!DOCTYPE html>
<html lang="ko">
<head>
<title>최적화된 페이지</title>
</head>
<body>
<h1>안녕하세요!</h1>
<script src="script.js"></script> <!-- HTML이 먼저 로드된 후 실행됨 -->
</body>
</html>브라우저의 HTML 파싱(렌더링) 과정과의 관계
<script>를 만나면 HTML 파싱을 중단한다.즉, <script> 태그가 상단에 있으면 그 시점에서 페이지가 멈추는 문제가 발생한다.
<script> alert("안녕!"); </script><script src="script.js"></script> (권장 방법)| 속성 | 설명 | 실행 시점 | 순서 보장 |
|---|---|---|---|
| 없음 | HTML 파싱 중 스크립트 실행 | 즉시 | X |
async | HTML 파싱과 병렬 다운로드, 완료 즉시 실행 | 즉시 | X |
defer | HTML 파싱 후 실행 (DOMContentLoaded 직전) | HTML 이후 | O |
<head> 안에서 async 또는 defer 사용<body> 맨 아래 배치