February 06, 2019
웹사이트는 어떻게 보여줄까?
웹개발자들 이라면 한번쯤 들어봤을 브라우저 렌더링 과정을
좀더 자세히 다뤄보고자 여러 문서들을 기반으로 포스팅을 작성하게됐다.
렌더링은 화면에 컨텐츠를 그리는 과정으로, 브라우저들은 각자의 렌더링 엔진으로 이를 구현했다. 크롬과 사파리는 “Webkit 엔진”을 사용하고, 파이어폭스는 “Gecko 엔진”을 사용한다.
브라우저 렌더링 과정
출처 : http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/
파싱 (Parsing)
렌더링 엔진은 HTML/XML 문서를 파싱하고 “콘텐츠 트리” 내부에서 태그를 DOM 노드로 변환하고,
외부 CSS 파일을 포함하여 스타일 요소도 파싱한다.
DOM(Document Object Modal), CSSOM(CSS Object Model)을 생성한다.
Bytes < Characters < Tokens < Nodes < DOM 순서로 생성한다.
[Webkit 엔진 동작과정]
[Gecko 엔진 동작과정]
출처 : https://d2.naver.com/helloworld/59361
문서를 파싱해서 DOM 노드로 변환을 해도 스타일 정보가 없으면 렌더 트리를 생성 할 수가 없다.
스타일 정보를 빨리 취득하기 위해
태그 바로 위
자바스크립트 파일이
내에 위치하게 되면 파서가 파싱을 멈추고 스크립트파일 읽는다.
스크립트파일이 많고 파일이 크면 읽는 시간이 오래걸리고 그만큼 렌더링이 늦어져 엔드 유저에겐 웹페이지 자체가 느리다고 판단 될 수 있다.
또한 스크립트 파일내 에러가 존재할 경우 렌더후 동작이 안되는 결과를 불러올수도 있다.
그래서 태그 위에 스크립트 파일을 모아둔다.
[async, defer 비교] 출처 : https://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
<script async src="script.js">
태그
내에 자바스크립트 파일을 놓게 될경우 두가지 속성을 줄 수 있는데,
async 속성은 브라우저에 스크립트 파일이 비동기적으로 실행될 수 있음을 나타내기 위해 사용된다.
parser는 스크립트에 도달한 지점에서 스크립트를 가져오고 실행하기 위해 일시 중지 할 필요가 없다.
그러나 다운로드가 완료되면 스크립트가 실행될 수 있도록 파싱이 일시 중지 된다.
<script defer src="script.js">
defer 속성은 파싱이 완료된 후 스크립트 파일을 실행하도록 브라우저에 지시한다.
비동기로 로드된 스크립트와 마찬가지로, 파싱이 실행되는 동안 파일을 다운로드 할 수 있다.
그러나 파싱이 완료되기 전에 스크립트 다운로드가 완료 되더라도 파싱이 완료 될 때까지 스크립트는 실행되지 않는다.
또한, async와는 다르게 호출된 순서대로 실행된다.
IE | Chrome | Firefox | Safari | IOS | Android | |
---|---|---|---|---|---|---|
async | 10버전이상 | 8버전이상 | 3.6버전이상 | 5버전이상 | 5.1버전이상 | 3버전이상 |
defer | 모두지원 | 8버전이상 | 3.6버전이상 | 5버전이상 | 5.1버전이상 | 3버전이상 |