브라우저란 동기(Synchronous)적으로 (HTML + CSS), Javascript 언어를 해석하여 내용을 화면에 보여주는 응용 소프트웨어입니다.
브라우저의 주된 기능은 사용자가 원하는 정보를 서버에 요청하고 브라우저에 표시하는것입니다.
여기서 원하는 정보의 종류는 크게 Html , img, pdf 등입니다.
여기서 정보의 종류 특히나 Html을 구분하는 것은 주소라고 하며, 이는 Url(Uniform Resource Locator) 이라고 합니다.
브라우저의 종류에는 크롬, 사파리, 파이어폭스 (오픈소스 기반) , 네이버 웨일 등등 다양한 종류의 브라우저가 존재합니다.
최근 유저들의 브라우저 점유율 입니다. 크롬과 사파리가 대부분을 차지하는것으로 보입니다.
브라우저의 여러 구성 요소가 있지만 브라우저 렌더링 과정에 중심이 되는 요소들을 중심으로 작성하겠습니다.
주소 표시줄 , 이전 앞으로 가기 버튼, 즐겨찾기, 설정, 창 끄기, 텝, 등등 페이지 정보를 표시하는 창을 제외한 모든 부분입니다. 여러 브라우저들은 서로 경쟁과 발전을 통해서 어느 정도 유사한 디자인을 가지게 되었습니다.
User Interface와 Rendering Engine 사이의 동작을 제어해주는 엔진입니다.
웹에서 렌더링 엔진의 역할은 요청 받은 내용을 브라우저 화면에 Render 시키는 역할입니다.
일반적으로 사용되는 크롬, 사파리등은 webkit 엔진을 사용하고 있습니다.
Html 문서를 파싱하던중
<script></script>
태그를 만나게 된다면 Html 문서의 파싱을 중단하고 js 파일을 로드하게 됩니다. 이 경우 html문서를 파싱하는 과정에 있어서 2가지 문제가 발생하게 됩니다.
따라서 위와 같은 상황을 피하기 위해 script 태그는 body태그의 최하단에 위치하는 것이 좋습니다.
혹은 다음과 같은 방법으로 js 파일을 로드하는것을 지연시킬 수 있습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>script load</title>
</head>
<body>
<script>
// window.onload가 가장 앞에 위치!
window.onload = function () {
console.log("afterwindowload");
var target = document.querySelector("#test");
console.log(target);
};
// DOMContentLoaded가 두번째에 위치!
document.addEventListener("DOMContentLoaded", function () {
console.log("afterdomload");
var target = document.querySelector("#test");
console.log(target);
});
// 일반 script 코드가 가장 끝에 위치
console.log("바로시작");
var target = document.querySelector("#test");
console.log(target);
</script>
<div id="test">test</div>
</body>
</html>
위의 코드에서 볼 수 있듯 script 태그가 body 태그의 시작부분에 존재합니다. 하지만 onload함수 , "DOMContentLoaded"를 통해서 script 태그를 만나더라도 js 파일의 load를 지연시킬 수 있습니다.
위와 같이 script의 하단의 console.log의 출력을 보면 null로 나오게 됩니다. 하지만 두 방법을 통해서 html 파싱이 끝난 후 요소에 접근 했기 때문에 querySelector를 통해서 접근한 div 태그를 출력할 수 있습니다.
HTML 문서의 파싱이 정상적으로 마무리 되었다면, 이를 바탕으로 렌더링 엔진은 DOM tree를 생성합니다.
구축된 Render tree를 화면에 배치될 위치를 정합니다.(Layout)
정해진 위치에 따라서 Render tree를 그립니다.(painting)
자바스크립트 언어를 해석하고 실행시킵니다. 가장 대중적으로 크롬에서 사용하는 v8 엔진이 있습니다.