브라우저 렌더링 시 사용자 경험 개선을 위한 방법들
사용자 경험 개선을 위해 (브라우저가 HTML보다 script 태그를 먼저 만나서 자바스크립트 파일을 실행하는 중에는 화면 렌더를 안하고 멈춰있다. 그래서 사용자가 멈춰있는 웹페이지를 보고 반복해서 새로고침을 눌러 불필요한 트래픽이 증가할 수도 있다.
이 문제를 해결하기 위해 중요한 HTML 요소들 밑에 script 파일을 넣는데, 그렇게 할 경우 텍스트는 먼저 화면에 나타나지만 이미지는 나타나지 않는 현상이 있을 수 있다. 브라우저에서는 DOM을 전체적으로 파싱하고, CSS 파일을 파싱하여 그 파싱이 다 끝난 후에야 화면에 레이아웃을 렌더한다. CSS 파일의 설정들을 알아야 이미지의 모습을 알고 화면에 나타낼 수 있기 때문이다.
브라우저 렌더링 과정의 정확한 순서는 아래와 같다.
DOM 파싱 → CSS 파싱 후 적용 → 레이아웃, 렌더링
만약 이미지도 중요하여 최초 페이지가 로드될 때 바로 보여지게 하고 싶다면, 자바스크립트를 분산하여 나중에 동적으로 새로운 script 태그를 추가하는 레이지 로드 방식이 사용된다.
보통 페이지에 있는 요소들이 load 된 후에 레이지 로딩으로 불러올 자바스크립트 파일을 불러오도록하는데, 두가지 방법이 있다.
window.onload 를 바로 함수로 설정하는 방법은 브라우저의 호환성을 고려하지 않고 바로 적용할 수 있는 장점이 있는데, 단점이 치명적이라 그렇게 추천되는 방법은 아니다.
보통 방어적으로 addEventListener 나 attachEvent 로 load 이벤트를 부착하고, 콜백으로 실행할 함수를 정의하는 방식을 사용한다. 실행하는 함수의 내부에서 script 태그를 생성하고, setAtrribute로 src 속성에 불러오고 싶은 js의 path, type 속성에 text/javascript, async 속성에 true 를 설정한다. async는 스트립트를 비동기로 실행하는 속성이다.
보통 레이지로드 방식을 응용해서 페이지 로드하는 함수가 별도로 인자를 받도록 하여 여러개의 스크립트 파일을 레이지 로드로 처리할 수 있다. 내려받는데 오래걸리는 img 태그에도 사용할 수 있다.
(function () {
let previoustOnload;
if (window.addEventListener) {
window.addEventListener("load", lazyloadImages);
} else if (window.attachEvent) {
window.attachEvent("onload", lazyloadImages);
} else if (window.onload) {
previousOnload = window.onload;
window.onload = function () {
previousOnload.call();
lazyloadImages();
}
} else {
window.onload = lazyloadImages;
}
function lazyloadImages() {
let imgList = document.getElementsByClassName("lazyload"),
length = imgList.length,
i;
for( i = 0; i < length ; i++ ) {
imgList[i].src = imgList[i].getAttribute("data-src");
}
}
}());
이렇게 할 경우, 전체 페이지 로드가 끝난 뒤부터 이미지를 내려받게 된다.
사용자 경험 개선을 위해 HTTP GET 의 병목 현상을 최소화하는게 무엇보다 중요하다. 크게 두가지로 GET 용량을 줄이거나 GET 횟수를 줄이는 방식이 있다.
JS, CSS, HTML 모두 미니피케이션이 가능한데, JS > HTML > CSS 순으로 용량이 크게 개선된다.
두 가지 단계로 이루어진다.
그 외에도 다양한 부수적인 방법들이 있다.
HTML은 트리 구조로 이루어져있어 들여쓰기가 많기 때문에 개행과 공백을 삭제하면 용량이 많이 개선된다.
출처