React์์ React.lazy ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด dynamic import๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๋ค.
์ฆ, React.lazy
๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก import๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์, React ์ฑ์ ์ด๊ธฐ ๋ ๋๋ง ์ง์ฐ์๊ฐ์ ์ด๋์ ๋ ์ค์ผ ์ ์๋ค.
import SomeComponent from './SomeComponent';
/* React.lazy๋ก dynamic import๋ฅผ ๊ฐ์ผ๋ค. */
const SomeComponent = React.lazy(() => import('./SomeComponent'));
์์ ๊ฐ์ด React.lazy
๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ ๋จ๋
์ผ๋ก ์ฐ์ผ ์๋ ์๊ณ , React.suspense
์ปดํฌ๋ํธ์ ํ์์์ ๋ ๋๋ง ๋์ด์ผ ํ๋ฉฐ, Suspense๋ lazy ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ก๋ฉ ํ๋ฉด๊ณผ ๊ฐ์ ์๋น ์ปจํ
์ธ ๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒ ํด์ค๋ค.
Router๋ก ๋ถ๊ธฐ๊ฐ ๋๋์ด์ง ์ปดํฌ๋ํธ๋ค์ lazy
๋ฅผ ํตํด importํ๋ฉด ํด๋น path๋ก ์ด๋ํ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋๋ฐ ์ด ๊ณผ์ ์์ ๋ก๋ฉํ๋ ์๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ค.
Suspense
๋ ์์ง ๋ ๋๋ง์ด ์ค๋น๋์ง ์์ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ๋ก๋ฉ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ , ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๋ ๋๋ง์ด ์ค๋น๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
/* suspense ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ import ํด์์ผ ํ๋ค. */
import { Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const AnotherComponent = React.lazy(() => import('./AnotherComponent'));
function MyComponent() {
return (
<div>
{/* React.lazy๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ฅผ Suspense ์ปดํฌ๋ํธ์ ํ์์ ๋ ๋๋ง */}
<Suspense fallback={<div>Loading...</div>}>
{/* Suspense ์ปดํฌ๋ํธ ํ์์ ์ฌ๋ฌ ๊ฐ์ lazy ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง์ํฌ ์ ์๋ค. */}
<OtherComponent />
<AnotherComponent />
</Suspense>
</div>
);
}
Supense
์ปดํฌ๋ํธ์ fallback
prop์ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ๋ณด์ฌ์ค React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐ์๋ค์ธ๋ค.
๋ํ, Suspense
์ปดํฌ๋ํธ๋ ์์ ๊ฐ์ด lazy
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ฉฐ, ํ๋์ Suspense
์ปดํฌ๋ํธ๋ก ์ฌ๋ฌ lazy
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ์๋ ์๋ค.
์น ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ง์
ํ๋ ๋จ๊ณ์ธ Route
์ ์ด ๋ ๊ธฐ๋ฅ์ ์ ์ฉ์ํค๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ์๋์ ๊ฐ์ด ์ ์ฉํ๋ค.
import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));
const App = () => (
<Router>
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>
);
์์ ๊ฐ์ด Router
๊ฐ ๋ถ๊ธฐ๋๋ ์ปดํฌ๋ํธ์์ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ React.lazy
๋ฅผ ์ฌ์ฉํด ๊ฐ์ธ์ฃผ๊ณ importํ ๋ค,
Route
์ปดํฌ๋ํธ๋ค์ Suspense
๋ก ๊ฐ์ผ ํ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ฅผ fallback
์์ฑ์ผ๋ก ์ค์ ํ๋ค.
์ด๋ด ๊ฒฝ์ฐ, ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ ์ค์ด๋ค์ง๋ง ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ๋ง๋ค ๋ก๋ฉ ํ๋ฉด์ด ๋ณด์ฌ์ง๊ธฐ ๋๋ฌธ์ ์๋น์ค์ ๋ฐ๋ผ์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋ค.
Reference:
์ฝ๋์คํ ์ด์ธ