앱의 반응 속도를 한 줄로 빠르게 만드는 `requestIdleCallback()`
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 프론트엔드 개발자, 성능 최적화에 관심 있는 개발자
- 난이도: 중급 (브라우저 렌더링 메커니즘 이해 필요)
핵심 요약
requestIdleCallback()
을 사용해 비우선 처리 가능한 작업 을 UI 블로킹 없이 실행- 주요 이점:
layout shift
감소 및 사용자 경험 개선- 비동기 처리 로 즉각적인 반응 속도 향상
- 금지 사항: 사용자 예상 작업 (예: 유효성 검사, 트랜지션)은 절대 사용 금지
섹션별 세부 요약
1. 문제 정의: UI 블로킹의 원인
- 사용자 상호작용 직후에 동기 처리 로 애니메이션/입력 지연 발생
- 예:
cleanupDOM()
,trackAnalytics()
와 같은 비우선 작업이 UI 블로킹 - 결과: Jank(결함), 사용자 불만 증가
2. 해결책: `requestIdleCallback()`의 원리
- 브라우저의 메인 스레드가 여유 상태 인 때에만 작업 실행
- UI 블로킹 없이 비우선 작업 처리 가능
- 예시:
```javascript
requestIdleCallback(() => {
cleanupDOM();
});
```
3. 호환성 및 폴리필
- 현대 브라우저 지원 (Chrome, Firefox, Safari)
- 구형 브라우저 대응:
```javascript
window.requestIdleCallback = window.requestIdleCallback ||
function(handler) {
return setTimeout(() => handler({ timeRemaining: () => 0 }), 1);
};
```
4. 사용 시나리오 및 예시
- 적합한 작업:
- DOM 정리, 로그 수집, 비동기 로딩
- 사용자 시야 밖 요소 제거
- 비추천 작업:
- 즉각적인 UI 업데이트, 사용자 입력 처리
- 구현 예시:
```javascript
onUserAction(() => {
updateUI();
requestIdleCallback(() => clearOldDOMNodes());
});
```
5. 성능 개선 효과
- 초기 반응 속도 향상
- UI 레이아웃 변동 최소화
- 개발자 및 사용자 모두 만족도 증가
결론
requestIdleCallback()
을 활용해 비우선 작업을 스케줄링 하면 사용자 경험 향상 가능- 주의: 사용자 기대 작업은 절대 사용 금지
- 추천: 앱 성능 최적화 시
requestIdleCallback()
을 우선 고려 하며, 구형 브라우저 대응 위한 폴리필 적용 필수