애플리케이션의 번들 크기를 줄이고
필요한 코드만 로드하여 초기 로딩 시간을 단축
하는 기법
동적 import 문법 사용
const SomeComponent = React.lazy(() => import('./SomeComponent'));
function MyComponent() {
return (
<React.Suspense fallback={<div>Loading...</div>}>
<SomeComponent />
</React.Suspense>
);
}
라우트 기반 분할
const Home = React.lazy(() => import('./routes/Home'));
const About = React.lazy(() => import('./routes/About'));
// 라우터 내부에서 React.Suspense 사용
<Switch>
<React.Suspense fallback={<div>Loading...</div>}>
<Route path="/about" component={About} />
<Route path="/" component={Home} />
</React.Suspense>
</Switch>
화면에 보이는 부분만 로드
하고,사용자가 스크롤하면서 필요한 부분을 동적으로 로드
하는 기법
이미지 레이지 로딩
<img src="image.jpg" loading="lazy" alt="description" />
커스텀 레이지 로딩 구현
<img class="lazy-load" data-src="path_to_image.jpg" alt="image description" />
// 특정 컴포넌트(YourComponent)가 화면에 보일 때만 렌더링
import React, { useEffect, useRef, useState } from 'react';
const LazyComponent = () => {
const [isVisible, setIsVisible] = useState(false);
const domRef = useRef();
useEffect(() => {
const observer = new IntersectionObserver(entries => {
if (entries[0].isIntersecting) {
setIsVisible(true);
observer.unobserve(domRef.current);
}
});
observer.observe(domRef.current);
return () => observer.disconnect();
}, []);
return (
<div ref={domRef}>
{isVisible && <YourComponent />} {/* YourComponent가 화면에 보일 때만 렌더링 */}
</div>
);
};
이미지 최적화
이미지를 웹에 최적화된 형식으로 변환하고, 적절한 크기로 리사이징합니다. 필요한 경우 이미지 CDN을 사용
캐싱 전략
브라우저 캐싱, 서비스 워커를 사용하여 자주 사용되는 리소스를 캐시
Webpack 설정
Webpack의 다양한 플러그인과 로더를 사용하여 CSS, 이미지, 폰트 파일 등을 최적화