[JS] 최적화 (Optimization)
Javascript를 최적화를 위한 다양한 방법들을 알아보자!
[ 속도가 중요한 이유 ]
https://web.dev/why-speed-matters/
속도가 왜 중요합니까?
사용자 경험에서 속도는 중요한 역할을 합니다. 모바일 속도로 인한 지연은 실망스러울 뿐만 아니라 비즈니스 결과에도 부정적인 영향을 미칠 수 있습니다.
web.dev
성능 측정의 척도
- 올바르게 동작하게 만든다
👉 메모리, 네트워크 트래픽과 같은 자원과 연관
- 빠르게 동작하게 만든다.
👉 시간과 관계
시간
시간은 크게 3가지로 분류한다.
1. 초기 구동시간
2. 계산시간
3. 반응 시간
이 시간들을 어떻게 최적화 할지 알아보자.
초기 구동시간
- 초기에 애플리케이션이 로드 되는 시간
[ 초기 구동시간을 줄이는 법 ]
- 다운로드 해야하는 파일 갯수,용량은 작게!
👉 이미지 스프라이트 기법
👉 가능한 최신 포맷의 이미지 사용 (WebP ,AVIF)
( IE 지원불가능 주의 )
👉 최적화된 폰트사용
( 폰트용량 고려, 최신포맷의 폰트사용 , 이미지폰트사용 )
계산시간
- 동일한 계산을 얼마나 빨리 수행하는지
👉 알고리즘 영역
반응 시간
- 사용자 행동에 얼마나 빨리 반응하는지
반응시간을 줄이기 위해선 브라우저의 렌더링 과정을 이해해야한다.
[ 😀 브라우저 렌더링에 대해 궁금하다면 ? ]
https://mandelina-code.tistory.com/63
[FE] 웹페이지 렌더링과 page reflow & repaint
웹 페이지 렌더링 - 브라우저가 HTML파일을 화면에 그려내는 과정 1. 파싱 : HTML파일을 DOM으로 변환 (파싱) 2. 스타일 계산 : CSS를 CSSOM으로 파싱 3. 레이아웃 : CSSOM 정보를 토대로 레이아웃 트리(렌더
mandelina-code.tistory.com
반응 시간을 줄이기 위해서는
1. JS보단 CSS로 애니메이션 수정
2. Position보단 Transform 속성을 사용
3. repaint, reflow 를 유발하는 속성은 되도록 사용하지 않기
참고 : css 속성별 reflow & repaint 를 유발하는 브라우저
CSS Triggers
@PROPERTY_DESCRIPTION@ B G W E Change from default B G W E Subsequent updates
csstriggers.com
4. requestAnimationFrame 을 사용
requestAnimationFrame 란 ?
- 비활성 탭에서는 애니메이션이 동작하지 않게 한다.
- 브라우저가 애니메이션을 최적화 하도록 한다.
5. DOM 접근과 업데이트는 가능한 적게한다.
- DOM접근은 가능한 좁은 범위에서!
- DocumentFragment 을 사용하여 DOM을 한번에 업데이트
메모리
메모리누수 ?
프로그램이 필요하지 않은 메모리 공간을 계속해서 점유하는 현상을 의미
이를 방지하기 위해 고수준 언어에는 가비지 컬렉터가 존재
Garbage Collection ?
- 자바스크립트 엔진이 사용하지 않는 메모리를 추정하여 삭제한다.
- 이때 사용하는 방식은 참조 카운팅이다.
- 참조카운팅이 0이 되면 값을 메모리에서 삭제
- 객체끼리 서로 맞물려있어 제거되지 않았던 순환 참조 문제가 있었지만 마크 스위프 알고리즘을 통해 해결
[마크 스위프 알고리즘]
https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management#mark-and-sweep_algorithm
자바스크립트의 메모리 관리 - JavaScript | MDN
C 언어같은 저수준 언어에서는 메모리 관리를 위해 malloc() 과 free()를 사용합니다. 반면, 자바스크립트는 객체가 생성되었을 때 자동으로 메모리를 할당하고 더 이상 필요하지 않을 때 자동으
developer.mozilla.org
- 전역변수는 프로그램이 종료되기 전까지 계속 메모리에 존재하므로 주의해서 사용해야한다.
strict mode (엄격모드)
엄격모드란 ?
- 오류를 줄여 안정적인 코드를 생산하기 위해 ES5부터 엄격모드가 추가되었다.
- 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류발생을 줄이고 최적화 작업에 문제를 일으킬수 있는 코드에 대해 명시적인 에러를 발생시킨다.
적용방법
- 전역의 선두에 'use strict'를 추가한다.
'use strict' ;
엄격모드가 발생시키는 에러
1. 암묵적 전역 : 선언하지 않은 변수를 참조하면 RefernceError
2. 변수,함수,매개변수의 삭제 : delete연산자로 지울수 없는 값 삭제시 SyntaxError
3. 매개변수 이름의 중복 : 중복된 매개변수 이름을 사용하면 SyntaxError
4. 읽기 전용 객체에 값을 할당하면 에러
하지만 전역에 strict mode를 적용하는것 또는 함수단위로 적용하는 것은 피하고
즉시 실행 함수로 감싼 스크립트 단위로 적용하는것이 바람직하다.