DOM 트리 → CSSOM 트리 → 렌더트리 → 레이아웃 → 페인트
위의 전체 과정 즉, 브라우저 렌더링 과정 가운데 JavaScript 실행되면 렌더링이 멈추게됨.
보다 구체적으로는,
변경된 DOM과 CSSOM은 다시 렌더트리로 결합. === 리플로우, 리페인트
JS 엔진과 렌더링 엔진은 직렬적으로 실행.
즉, 위에서 부터 한줄한줄 내려가며 코드를 실행시키고, 한 엔진이 실행되면 다른 엔진은 실행 권한 X.
만약 파싱이 중단되지 않으면 렌더트리가 다 구성되지 않았을 때 JS 엔진이 DOM 트리 변경시킬 수도 있고 아직 그려지지 않은 DOM 트리의 노드에 접근한다면 오류가 날 수도 있겠지?
같은 이유로 <script> 태그
를 <body> 태그
끝에 두는 것을 권장.
HTML 파싱과 자바스크립트 파일의 로드가 비동기적으로 동시에 진행.
단, 자바스크립트 실행은 로드되면 바로 진행되며 이때 HTML파싱 중단.
즉, 자바스크립트 파일의 로드는 동기적으로 진행할 수 있으나, 바로 자바스크립트 파일이 실행되므로 실행 순서를 보장할 수는 없음.
HTML파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 진행된다는 점에서 async어트리뷰트와 동일.
단, 실행이 HTML 파싱이 완료된 직후, 즉 DOM이 생성된 이후에 진행된다는 점이 다름.
DOM 생성이 완료된 이후 실행되어야 하는 자바스크립트 파일에 유용하게 사용할 수 있음.
→ 스타일 시트는 이론적으로 DOM 트리를 변경하지 않기 때문에 문서 파싱을 기다리거나 중단하지 않는다.