์ฝ๋ ๋ถํ (Code Spliting)
๋ฒ๋ค๋ง์ ํ ๋, HTML ์น ํ์ด์ง์ JS๋ฅผ ์ถ๊ฐํ๋๋ฐ, ๋ชจ๋ ์น์ผ๋ก ๋ฐ์ ํ๋ฉด์ ์ ์ DOM์ ๋ค๋ฃจ๋ ์ ๋๊ฐ ์ ๊ตํด์ง๋ฉด์ JS ์ฝ๋ ์์ฒด๊ฐ ๋ฐฉ๋ํด์ง๊ณ ๋ฌด๊ฑฐ์์ก๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก, ๋ฒ๋ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋ ํ, ํ์ํ ์ฝ๋๋ง ๋ถ๋ฌ์ค๊ณ ๋์ค์ ํ์ํ ์ฝ๋๋ ๋์ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๋ค.
=> ์ด๊ฒ ๋ฐ๋ก ์ฝ๋ ๋ถํ !
์ฝ๋ ๋ถํ ์ ๋ฐํ์ ์ ์ฌ๋ฌ ๋ฒ๋ค์ ๋์ ์ผ๋ก ๋ง๋ค๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ์ผ๋ก, Webpack, Rollup๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ฒ๋ค ๋ถํ ํ๋ ๋ฐฉ๋ฒ => ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ npm์ ํตํด ๋ค์ด๋ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ, ์ฌ์ฉ์์๊ฒ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์์ด ๋ง๊ณ , ๋ฒ๋ค๋ง ์ ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค. ๊ทธ๋์ ์ฌ์ฉ ์ค์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ถ๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฐ๋ก๋ฐ๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์ฐจ์งํ๋ ๊ณต๊ฐ์ ์ค์ผ ์ ์๋ค.
โ๏ธ React์์ ์ฝ๋ ๋ถํ ํ๋ ๋ฐฉ๋ฒ => dynamic import(๋์ ๋ถ๋ฌ์ค๊ธฐ)๋ฅผ ์ฌ์ฉํ๊ธฐ
๊ธฐ์กด ๋ฐฉ๋ฒ (static import /์ ์ ๋ถ๋ฌ์ค๊ธฐ)
import moduleA from "library";
โ๏ธ dynamic import(๋์ ๋ถ๋ฌ์ค๊ธฐ)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ => React.lazy์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
React.lazy ์ฌ์ฉ๋ฐฉ๋ฒ
React.lazy๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ ๋จ๋ ์ผ๋ก ์ฐ์ผ ์๋ ์๊ณ , React.suspense ์ปดํฌ๋ํธ์ ํ์์์ ๋ ๋๋ง์ ํด์ผ ํ๋ค.
import Component from './Component';
/* React.lazy๋ก dynamic import๋ฅผ ๊ฐ์๋๋ค. */
const Component = React.lazy(() => import('./Component'));
React.Suspense ์ฌ์ฉ๋ฐฉ๋ฒ
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 ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐ์๋ค์ธ๋ค.
โ๏ธ ๊ทธ๋์ React.lazy์ Suspense๋ฅผ ์ด๋์ ์ ์ฉํ ์ ์๋๊ฐ?
์น ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ง์ ํ๋ ๋จ๊ณ์ธ 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>
);
๐ ์๋ชป๋ ๊ฐ๋ ์ ๋ฌ์ด ์๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค. ์ ์ ์ฑ์ฅ์ ํฐ ๋์์ด ๋ฉ๋๋ค๐ค
'๐ฅFrontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL) ๋ฆฌ์กํธ์์ <a> ํ๊ทธ? Link ์ปดํฌ๋ํธ? (0) | 2022.09.02 |
---|---|
๋ฆฌ์กํธ ์ธ์ฆ ๊ณต๋ถํ๊ธฐ, ๋ก๊ทธ์ธ ๋ก๊ทธ์์ ์ฝ๋ (0) | 2022.08.01 |
useRef๋, useRef ์ฌ์ฉ๋ฐฉ๋ฒ, useRef ์ฌ์ฉ ์์ (0) | 2022.07.27 |
Custom Hook, Custom Hook ์ฅ์ , ๊ท์น (0) | 2022.07.27 |
๋ฆฌ์กํธ ๋ ๋๋ง ์ต์ ํํ๊ธฐ, useMemo์ ํ์์ฑ, useCallback, useCallback๊ณผ ์ฐธ์กฐ ๋๋ฑ์ฑ (0) | 2022.07.27 |