브라우저 구조
- 자바스크립트 엔진
- 자바스크립트 코드를 해석하고 실행하는 인터프리터
크롬은 v8, 사파리는 webkit
- 이벤트 루프
- 자바스크립트 엔진의 뒷편에서 동작하는 장치
- call stack(호출 스택)과 콜백 큐를 계속 주시하고 있음
- call stack이 비어있으면 콜백 큐에 먼저 들어온 순서대로 콜백 함수들을 호출 스택으로 집어넣음
- 콜백 큐(태스크 큐)
- 마이크로 태스크 큐
- Promise의 반환 객체가 (then, catch) 대기하는 큐
- web API
- setTimeout, DOM, Http 요청 등 모두 비동기 요청
- 작동을 하면 콜백 큐에서 실행 대기
- 자바스크립트 엔진은 싱글스레드이지만 web API는 멀티스레드로 동작
- setTimeout(callback, 0) 실행 과정 : 콜스택이 비어야 콜백큐에 넣어진 요청이 콜스택에 갈 수 있기 때문에, 콜스택에 있는 모든 함수가 실행된 후 setTimeout 실행
브라우저 렌더링
- 브라우저 실행 과정
- 렌더링 엔진이 HTML, CSS 파싱 (브라우저 렌더링)
- 브라우저 엔진이 유저 인터페이스와 렌더링 엔진 연결
- 렌더링 엔진 동작 과정(Critical Rendering Path)
- HTML 태그 토큰화되어 노드 객체로 바뀌고 DOM tree 생성
- 스타일 CSSOM tree 생성
- DOM tree와 CSSOM tree 합친 Render tree 생성
- document 객체부터 각 노드 순회하면서 각각에 맞는 CSSOM 찾아서 규칙 적용
- meta, display:none 속성은 렌더와 관련 없어서 Render tree에 포함X
- Layout (리플로우) - Render tree 배치
- 뷰포트 내에서 요소들의 정확한 위치와 크기 계산
- %나 em 같이 상대적인 단위를 사용한 경우 이 과정에서 정확한 px단위로 변환
- Paint (리페인트) - Render tree 그리기
- text, image 실제 픽셀로 화면에 그려짐
- css 변경 / animation 동작한 경우
- 리플로우부터 다시 발생: 요소의 크기나 위치가 바뀔 때, 브라우저 창 크기가 바뀔 때(수치를 다시 계산해야 할 때)
- 리페인트부터 다시 발생 : 배경 이미지나 텍스트 색상, 그림자 등 스타일의 변경 일어날 때(레이아웃의 수치는 변하지 않을 때)
프론트엔드의 비동기 (callback -> promise -> async/await)
- Promise
- 자바스크립트에서 비동기를 간편하게 처리하기 위해 제공하는 객체
Promise 상태
- pending : Promise 만들어지고 지정한 operation 수행 중인 상태
- fulfilled : operation 성공적으로 완료한 상태
- rejected : 파일 찾을 수 없거나 네트워크 에러
- 콜백함수
- 클로저
- 중첩 함수에서 내부 함수가 부모함수에게 있는 변수를 가지고 있고 접근할 수 있는 것
- 어떤 함수 A에서 선언한 변수 a를 참조하는 내부 함수 B를 외부로 전달할 경우, A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상