DOM이나 CSSOM을 변경하는 자바스크립트코드가 포함되었을 경우, js를 파싱하기 전에 DOM이나 CSSOM이 이미 생성되어 있어야한다. DOM api가 실행되는 시점에 생성이 완료되지 않았다면 문제가 발생할 수 있다.
자바스크립트 로딩/파싱/실행에 의해 html이 블로킹되면 그만큼 UI가 늦게 보여지므로, 페이지 로딩 시간이 길어질 수 있다.
js script를 html의 body가장 아래에 위치시키는 게 좋다.
async
/ defer
는 파싱에 의해 dom 생성이 블로킹 되는 이슈를 근본적으로 해결하기 위해 html5부터 script태그에 추가된 속성이다.async
: script 태그 순서와 상관없이 html파싱과 js 파일 로드가 비동기적으로 진행된다. 단 로드가 끝난 뒤 js 파싱/실행이 바로 실행되고, 이 때 html 파싱이 중단된다. 태그 순서와 상관없이 로드가 끝난 js 파일부터 실행되므로 js끼리 순서 보장이 필요한 경우 이 속성을 쓰면 안된다. ⇒ ❓이건 언제 쓰는거지?defer
: async와 비슷한데, html파싱이 완료되고 DOM생성이 완료되어 DOMContentLoaded 이벤트가 발생하는 시점에 js의 파싱과 실행이 진행된다.
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.