
React는 대표적인 CSR(Client Side Rendering) 방식의 라이브러리, CSR에서 발생하는 속도 저하 문제를 해결하기 위한 방법들이 고안됨
CSR 방식에서는 초기 로딩 시 모든 JavaScript 파일을 다운로드하고 실행
React 앱 실행 과정:
1. HTML 파일 요청 (<div id="root"></div>만 존재)
2. 번들된 JavaScript 파일 다운로드 (bundle.js)
3. React가 실행되면서 화면을 동적으로 렌더링
💡 문제:
✔️ React가 실행될 때까지 사용자는 빈 화면을 보게 됨
✔️ 앱이 커질수록 JavaScript 번들이 커져서 로딩 속도가 느려짐
CSR에서는 사용자가 보지 않는 페이지의 코드도 모두 로드
예를 들어, 홈(Home) 페이지를 방문했을 때:
마이페이지(MyPage), 설정(Settings), 대시보드(Dashboard) 등의 코드도 다운로드됨React 앱 실행 과정
1. HTML + JavaScript 다운로드
2. JavaScript 실행 (React 라이브러리 로드)
3. 가상 DOM 생성 및 실제 DOM 업데이트
💡 문제:
✔️ 다운로드한 JavaScript가 많을수록 실행 시간이 증가
✔️ 초기 화면이 표시되기까지 지연 발생
React는 SPA(Single Page Application)이므로 페이지 이동 시에도 JavaScript가 실행
// 기존 방식 (정적 import)
import Main from "./Main.jsx";
// Lazy를 활용한 코드 스플리팅
const Main = lazy(() => import("./Main.jsx"));
<Suspense fallback={<h1>로딩중...</h1>}>
<Main />
</Suspense>
여러 개의 JavaScript, CSS 파일을 하나의 파일로 합치는 과정
🔹 효과
🔹 Bundling 도구
🔹 Bundling 실행 명령어
npm run build
애플리케이션의 코드를 여러 개의 작은 부분으로 나누는 기술
🔹 효과
✨ React의 Lazy & Suspense는 대표적인 코드 스플리팅 기법!
📁 vite.config.js 설정 예시
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
build: {
outDir: "docs",
rollupOptions: {
output: {
manualChunks: (id) => {
if (id.includes("node_modules")) {
const module = id.split("node_modules/").pop().split("/")[0];
return `vendor-${module}`;
}
},
},
},
},
});

useEffect(() => {
const debounceTimer = setTimeout(() => {
const newFilteredData = data.filter((el) => el.name.match(reg));
setFilteredData(newFilteredData);
}, 1000);
return () => clearTimeout(debounceTimer);
}, [param]);
useEffect(() => {
const newTime = new Date();
const throttleTimer = setTimeout(() => {
const newFilteredData = data.filter((el) => el.name.match(reg));
setFilteredData(newFilteredData);
time.current = new Date();
}, 1000 - (newTime - time.current));
return () => clearTimeout(throttleTimer);
}, [param]);