2017. 7. 16. 14:29ㆍDev/javascript
속 싶은 자바스크립트 7장 : 자바스크립트 성능과 사용자 경험 개선
script위치와 lazyload
script 태그의 위치는 body 태그 아래쪽에 위치해야한다.
아니면 lazyload 방식을 이용하여 html과 css가 먼저 load되어 화면이 렌더링 된 후 script를 호출하도록 해야 한다.
(function () {
var previousOnload;
if (window.addEventListener) {
window.addEventListener("load", lazyload);
} else if (window.attachEvent) {
window.attachEvent("onload", lazyload);
} else if (window.onload) {
previousOnload = window.onload;
window.onload = function () {
previousOnload.call();
lazyload();
}
} else {
window.onload = lazyload; // this can be overwritten by another JS
}
function lazyload() {
var scriptTag = document.createElement("script"),
headTag = document.getElementsByTagName("head")[0];
scriptTag.setAttribute("src", "./sleep.js");
scriptTag.setAttribute("type", "text/javascript");
scriptTag.setAttribute("async", "true");
// way around if there is no head tag
if (!headTag) {
headTag = document.getElementsByTagName("script")[0].parentNode;
}
headTag.appendChild(scriptTag);
}
}());
이미지 역시 lazyload 함수를 활용하여 이미지 다운로드가 지연되는 현상에 대응할 수 있도록 만들어 줄 수 있다.
웹페이지의 main이 되는 이미지들은 제외하고 lazyload를 적용시키면 좋다.
(function () {
var previousOnload;
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; // this can be overwritten by another JS
}
function lazyloadImages() {
var imgList = document.getElementsByClassName("lazyload"),
length = imgList.length,
i;
for ( i = 0 ; i < length ; i++ ) {
imgList[i].src = imgList[i].getAttribute("data-src");
}
}
}());
여기서 img 태그의 width와 height 속성을 지정해 주는 것이 좋다.
지정하지 않는다면 이미지가 로드 된 후 이미지 크기에 맞게 레이아웃이 변경되어 사용자 경험에 부정적이기 때문이다.
lazyload를 사용할 때 주의할 점은 사용자가 빠르게 사용하게 될 기능이라 생각되는 기능들은 적용하면 안된다.
마찬가지로 페이지의 핵심적인 기능들을 고려하여 layload를 적용해야 한다.
미니피케이션
자바스크립트 뿐만 아니라 CSS HTML까지 용량을 줄여 전송을 좀 더 빠르게 하는 방법
파일을 압축해서 최소화(gzip, deflate)
미니피케이션은 별도의 빌드 환경을 구축해야 하고 후처리 프로세스가 많이 들어가는 번거로움이 있다. 이보다 쉽게 용량을 줄이는 방법이 바로 파일을 압축하는 방법이다. 이 방법은 웹서버에서 환경을 구축해야 한다.
GET 요청 최소화
파일을 하나로 합쳐서 get요청을 최소화 시켜 성능을 향상 시킬 수 있다.
캐시 효율을 떨어뜨리는 자주 수정되는 파일들은 별도로 분리 시키는게 좋다.
jqeury와 같이 다른 사이트에서도 자주 사용되는 라이브러리는 cdn으로 사용하는 것을 고려하는 것도 좋다. 다른 사이트에서 접속하여 캐시에 저장된 파일을 사용할 수 있기 때문이다.
이미지 파일 역시 하나로 합쳐서 사용하면 get 요청을 줄일 수 있다.
공통적으로 사용될 img 태그에 background-image 속성을 통합된 이미지 url을 할당한다. 이미지 요소마다 background-position 속성으로 필요한 이미지만 보여주도록 하는 방법이다. 참고
캐시 설정
웹 서버의 캐시 설정을 통해서 정적인 컨텐츠에 대해서 캐시를 활용해 주도록 유도하는 것도 좋다.
캐시와 관련된 헤더 중 대표적으로 Expires가 있다.
이를 이용한 웹서버 설정을 통해서 파일 종류마다 캐시 기간을 설정하도록 할 수 있다.
'Dev > javascript' 카테고리의 다른 글
모듈의 이해(import, export) (0) | 2017.07.25 |
---|---|
npm과 yarn의 명령어 비교 (0) | 2017.07.25 |
브라우저의 단일스레드와 repaint, reflow (0) | 2017.07.16 |
Array.prototype.slice.call(arguments) 에 대하여 (2) | 2017.06.25 |
패턴 (0) | 2017.06.04 |