이때 렌더링 엔진은 사용자의 편의성을 위해 가능하면 빠르게 내용을 표시하려고 합니다. 그래서 모든 HTML을 파싱할 때까지 기다리지 않고 바로 배치와 그리기 과정을 시작합니다. 네트워크로부터 나머지 내용이 전송되기를 기다리는 동시에 받은 내용의 일부를 먼저 화면에 표시를 하게 됩니다.
그런데렌더링엔진은 HTML 문서를파싱하는도중, <script> 태그를만나게되면중간에파싱을멈추게됩니다.
javaScript 파일을 파싱 또는 다운로드(download)하고 javaScript 코드를 실행(execution)을 모두 완료하고 난 이후에 멈추었던 HTML 문서 파싱을 시작하게 됩니다.
따라서 HTML 태그들 사이에 <script> 태그가 위치하게 되면 HTML 문서를 읽고 파싱하는 과정에서 중단 시점이 생기고 그만큼 브라우저 화면에 표시되는 시간이 길어지게 됩니다.
HTML 문서에 <script> 태그나 스크립트 파일이 많아질수록 그만큼 브라우저 화면에 출력되는 것이 늦어지므로 사용자 입장에서는 아무것도 출력되지 않은 화면을 보는 시간이 길어지기 때문에 불편함을 느끼게 됩니다.
<script> 태그를 <body> 태그의 최하단에 위치하는 방법 이외에도 태그 안에 속성을 추가하여 javaScript 파일의 파싱 순서를 제어할 수 있습니다.
1. async
<script async src="script.js"></script>
HTML 문서를 읽고 파싱하는 과정에서 <script> 태그를 만나도 파싱이 중단되지 않습니다. HTML 문서가 파싱되는 동안 동시에 javaScript 파일이 파싱 또는 다운로드됩니다. 그러다가 javaScript 파일의 파싱이 완료되고 javaScript 코드를 실행되는 시점에서 잠시 HTML 파싱을 중단하게 됩니다. 실행이 모두 끝난 후에 다시 HTML 파싱이 재개됩니다.
2. defer
<script defer src="script.js"></script>
defer도 async와 비슷합니다. <script> 태그를 만나도 HTML 파싱이 중단되지 않고 javaScript 파일과 함께 파싱됩니다. 하지만 다른 점은 javaScript 코드를 실행하는 시점은 HTML 파싱이 모두 완료된 이후입니다.
이처럼 <script>, <script async>, <script defer> 태그를상황에맞게사용하여스크립트파일의파싱순서를제어할수있습니다.