<!DOCTYPE html>
<html>
<head>
<!-- css는 head 안에! -->
<link href="style.css" rel="stylesheet" />
</head>
<body>
<div>
</div>
<!-- js는 body 하단에! -->
<script>
//...
</script>
</body>
</html>
때문에 인라인으로 스크립트를 실행하면 돔 생성이 차단되어 초기 렌더링이 지연된다.
css는 head 태그 안에, js는 body의 맨 하단에 위치시켜 돔 생성을 차단하는 것을 방지할 수 있다.
css의 경우 media 속성으로 단말기 유형의 css를 명시하면 불필요한 블로킹을 방지할 수 있다.
js 파일을 body 끝에 몰아 넣는 방법은 js가 해석되는 도중 사용자의 상호작용이 시도된다면 재대로 동작하지 않는다. 이 문제를 해결하기 위해 브라우저가 비동기로 스크립트를 병렬로 불러오는 async 와 defer 속성을 사용한다.
async 스크립트는 파일을 불러오는 것만 병렬로 실행하고 파일의 로드가 끝나면, 돔 렌더를 멈추고 스크립트 파일을 해석하기 때문에 실행 순서가 보장되지 않는다. 때문에 돔에 접근하지 않거나, 다른 스크립트에 의존성이 없을 때 효과적이다.
defer 스크립트는 병렬로 파일을 로드한 후, 돔 렌더가 끝난 후에 실행된다.
때문에 스크립트의 선언 순서를 보장한다.