Suspense(๋๊ธฐ)๋ React v18๋ถํฐ ๋์
๋ ๊ธฐ๋ฅ์ผ๋ก,
๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋ ๋ฏธ๋ฆฌ ์ ํด์ง ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ,
๋ก๋๊ฐ ์๋ฃ๋๋ฉด ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง ํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๊ณ , ๋ก๋ฉ ์ํ๋ฅผ ์ง์ ๊ด๋ฆฌํ ํ์๊ฐ ์์ด์ง๋ค.
์ผ๋ฐ์ ์ผ๋ก React.lazy์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ฝ๋ ์คํ๋ฆฌํ
์ ์ ์ฉํ๋ค.
โ๏ธ์ฐธ๊ณ ) ์ฝ๋ ์คํ๋ฆฌํ
์ด๋ ์ฝ๋์์ ๋น์ฅ ์ฌ์ฉํ๋ ๋ถ๋ถ๋ง์ ๋ก๋ฉํ๊ณ , ํ์ฌ ํ์ํ์ง ์์ ์ฝ๋ ๋ถ๋ถ์ ๋ฐ๋ก ๋ถ๋ฆฌ์์ผ ๋์ค์ ๋ก๋ํจ์ผ๋ก์จ ๋ก๋ฉ์๊ฐ์ ๊ฐ์ ํ๋ ๊ฒ์ ๋งํ๋ค.
dynamic import๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๋ค.
// React๋ SPA์ด๋ฏ๋ก ํ ๋ฒ์ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๊น์ง ๋ถ๋ฌ์ค๋ ๋จ์ ์ด ์๋ค.
// React.lazy๋ฅผ ํตํด ๋์ ์ผ๋ก import๋ฅผ ํ๋ฉด ์ด๊ธฐ ๋ ๋๋ง ์ง์ฐ์๊ฐ์ ์ด๋ ์ ๋ ์ค์ผ ์ ์๊ฒ ๋๋ค.
import Component from './Component';
// React.lazy๋ก dynamic import๋ฅผ ๊ฐ์ผ๋ค.
const Component = React.lazy(() => import('./Component'));
Component๊ฐ ๋ก๋๋๋ ๋์ Loading ์ปดํฌ๋ํธ๊ฐ ํ์๋๋ค.
Component๊ฐ ๋ก๋๋๋ฉด, Loading ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก ์ฌ๋ผ์ง๋ค.
// suspense ๊ฐ์ ธ์ค๊ธฐ
import React, { Suspense } from 'react';
const ComponentA = React.lazy(() => import('./ComponentA'));
const ComponentB = React.lazy(() => import('./ComponentB'));
function Loading() {
return <div>Loading...</div>
}
function MyComponent() {
return (
<div>
/* fallback ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉ ์ค์ธ ์ํ๋ฅผ ๋ํ๋ด๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ค. */
<Suspense fallback={<Loading />}>
/* Suspense ์ปดํฌ๋ํธ ํ์์ ์ฌ๋ฌ ๊ฐ์ lazy ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง์ํฌ ์ ์๋ค. */
<ComponentA />
<ComponentB />
</Suspense>
</div>
);
}
์น ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ง์
ํ๋ ๋จ๊ณ์ธ
Route์ ์ด ๋ ๊ธฐ๋ฅ์ ์ ์ฉ์ํค๋ ๊ฒ์ด ์ข๋ค.
์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ด ์ค์ด๋๋ ๋ถ๋ช
ํ ์ฅ์ ์ด ์์ผ๋,
ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๊ณผ์ ๋ง๋ค ๋ก๋ฉ ํ๋ฉด์ด ๋ณด์ฌ์ง๊ธฐ ๋๋ฌธ์
์๋น์ค์ ๋ฐ๋ผ์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋ค.
import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./Component/Home'));
const About = lazy(() => import('./Component/About'));
function Loading() {
return <div>Loading...</div>
}
const App = () => (
<Router>
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>
);
๐ React(๊ณต์๋ฌธ์) - Suspense 1 ๏ผ Route-based code splitting
๐ React(๊ณต์๋ฌธ์) - Suspense 2
๐SPA์ Dynamic Import ๋ณด๋ฌ๊ฐ๊ธฐ