💻 Frontend
[Next.js] 코드 스플리팅 (Code Splitting)
💡 코드 스플리팅 (Code Splitting)#
코드 스플리팅 (Code Splitting) ? 웹 애플리케이션의 초기 로딩 속도를 개선하기 위해 코드 여러 개의 파일을 청크로 나누는 기법
단순히 “파일을 나눈다”는 의미가 아니라, 사용자가 실제로 필요로 할 때 필요한 코드만 불러오는 전략까지 포함해요
사용 이유 ? 웹 애플리케이션은 하나의 큰 번들 파일로 묶음
- 파일 크기가 매우 커 초기 로딩 속도가 느려짐
- 코드 한 줄만 바뀌어도 전체 파일을 다시 빌드해야 함 → 비효율적
⇒ 코드 스플리팅을 통해 파일을 보낼 때 먼저 보낼 수 있는 파일을 먼저 보냄 → 렌더링 속도 증가 → 성능 최적화
📄 코드 스플리팅의 방식
1️⃣ Route 단위 분할
페이지를 전환할 때 필요한 컴포넌트만 불러와요
import React, { Suspense } from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
const Home = React.lazy(() => import("./pages/Home"));
const About = React.lazy(() => import("./pages/About"));
function App() {
return (
<BrowserRouter>
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</BrowserRouter>
);
}
React.lazy
공식문서에서 lazy의 설명을 다음과 같이 시작해요
lazy를 사용하면 컴포넌트의 코드가 최초로 렌더링될 때까지 로딩을 미룰 수 있다.
lazy loading은 중요도가 떨어지거나 당장은 화면에 보이지 않는 요소들의 로딩을 우선적으로 시행하지 않으면서 웹페이지 로딩 성능을 최적화해요.
쉽게 말하면 페이지 내에서 실제로 필요로 할 때까지 리소스의 로딩을 미루는 것이라고 생각하면 돼요.
const SomeComponent = lazy(() => import('./SomeComponent'));
2️⃣ Component 단위 분할
컴포넌트를 필요할 때만 불러와요
import React, { Suspense } from "react";
const LazyComponent = React.lazy(() => import("./LazyComponent"));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}
3️⃣ vendor 분할
vendor 파일 ? 프로젝트에서 전역적으로 사용되는 라이브러리(like react, zustand, framer-motion)를 따로 분리한 청크 파일
- vendor의 경우 변경 가능성이 낮기 때문에, 유저는 브라우저에 캐시해뒀던 vendor.js를 재사용할 수 있어요. 이로 인해 서버 리소스가 절약되고 초기 로딩 속도가 개선돼요
4️⃣ dynamic import
번들러의 경우, import() 구문을 만나면 자동으로 별도 청크로 분리해요
조건부 로딩이나 특정 상황에서만 모듈을 불러올 때 유용해요
async function loadModule() {
const { myFunction } = await
import("./module.js");
myFunction();
}