import()
구문을 활용해 동적으로 모듈을 로드한다.function loadComponent() {
import('./MyComponent').then((module) => {
const MyComponent = module.default;
// 모듈 사용
});
}
splitChunks
옵션을 사용하면 청크 파일을 자동으로 생성할 수 있다.module.exports = {
optimization: {
splitChunks: {
chunks: 'all', // 모든 청크에 대해 스플리팅 수행
},
},
};
React.lazy
와 Suspense
를 통해 컴포넌트를 동적 로드하고, 로드 중 상태를 표시할 수 있다.import React, { Suspense } from 'react';
// React.lazy : 동적으로 컴포넌트 로드
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
{/* Suspense : 로딩 중일 때 fallback 속성으로 전달한 element를 표시한다. */}
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
);
}
import React, { Suspense } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const Home = React.lazy(() => import('./Home'));
const About = React.lazy(() => import('./About'));
function App() {
return (
<Router>
<Suspense fallback={<div>Loading...</div>}>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</Suspense>
</Router>
);
}
dynamic
함수dynamic
함수를 통해 추가 제어가 가능하다.import dynamic from 'next/dynamic';
// 동적 로드 설정
const DynamicComponent = dynamic(() => import('./MyComponent'), {
loading: () => <p>Loading...</p>, // 로딩 중 표시할 컴포넌트
});
function App() {
return <DynamicComponent />;
}
실제 필자가 작성해본 dynamic
함수를 사용한 스플리팅은 아래와 같다.
"use client";
import dynamic from "next/dynamic";
import styles from "./DashboardClient.module.scss";
import { User } from "next-auth";
import Loading from "@/components/common/Loading/Loading";
interface IProps {
user: User;
}
const MonthlyEmissionsChart = dynamic(() => import("./MonthlyEmissionsChart"), {
ssr: false,
loading: () => (
<>
<Loading text="탄소배출량 현황 정보를 불러오고 있습니다." open={true} />
<div className={styles.w100_box}>
<div className={styles.w100}>
<div className={styles.tit}>
<p>
탄소배출량 현황 <span>(단위 : CO2eq)</span>
</p>
</div>
<div className={styles.chart_box}>
차트 데이터를 불러오고 있습니다...
</div>
</div>
</div>
</>
),
});
const ScopeEmissionsChart = dynamic(() => import("./ScopeEmissionsChart"), {
ssr: false,
loading: () => (
<>
<Loading
text="Scope별 탄소배출량 현황 정보를 불러오고 있습니다."
open={true}
/>
<div className={styles.w30}>
<div className={styles.tit}>
<p>
Scope별 탄소배출량 현황 <span>(단위 : CO2eq)</span>
</p>
</div>
<div className={styles.chart_box}>
차트 데이터를 불러오고 있습니다...
</div>
</div>
</>
),
});
const ProcessEmissionsChart = dynamic(() => import("./ProcessEmissionsChart"), {
ssr: false,
loading: () => (
<>
<Loading
text="공정별 탄소배출량 현황 정보를 불러오고 있습니다."
open={true}
/>
<div className={styles.w30}>
<div className={styles.tit}>
<p>
공정별 탄소배출량 현황 <span>(단위 : CO2eq)</span>
</p>
</div>
<div className={styles.chart_box}>
차트 데이터를 불러오고 있습니다...
</div>
</div>
</>
),
});
const SourceEmissionsChart = dynamic(() => import("./SourceEmissionsChart"), {
ssr: false,
loading: () => (
<>
<Loading
text="배출원별 탄소배출량 현황 정보를 불러오고 있습니다."
open={true}
/>
<div className={styles.w30}>
<div className={styles.tit}>
<p>
배출원별 탄소배출량 현황 <span>(단위 : CO2eq)</span>
</p>
</div>
<div className={styles.chart_box}>
차트 데이터를 불러오고 있습니다...
</div>
</div>
</>
),
});
export default function DashboardClient({ user }: IProps) {
return (
<div className={styles.wrap}>
{/* 탄소배출량 현황 */}
<MonthlyEmissionsChart user={user} />
<div className={styles.w100_box}>
{/* Scope별 탄소배출량 현황 */}
<ScopeEmissionsChart user={user} />
{/* 공정별 탄소배출량 현황 */}
<ProcessEmissionsChart user={user} />
{/* 배출원별 탄소배출량 현황 */}
<SourceEmissionsChart user={user} />
</div>
</div>
);
}