[React] React.lazy() & Suspense

Hannahhhยท2022๋…„ 9์›” 29์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
28/30

๐Ÿ” React.lazy() & Suspense



๐Ÿ‘€ React.lazy()


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 ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ™”๋ฉด๊ณผ ๊ฐ™์€ ์˜ˆ๋น„ ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.




๐Ÿ‘€ 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 ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค.

๋˜ํ•œ, Suspense ์ปดํฌ๋„ŒํŠธ๋Š” ์œ„์™€ ๊ฐ™์ด lazy ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๋ฉฐ, ํ•˜๋‚˜์˜ Suspense ์ปดํฌ๋„ŒํŠธ๋กœ ์—ฌ๋Ÿฌ lazy ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์Œ€ ์ˆ˜๋„ ์žˆ๋‹ค.




โœ” 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>
);

์œ„์™€ ๊ฐ™์ด Router๊ฐ€ ๋ถ„๊ธฐ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ React.lazy๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์‹ธ์ฃผ๊ณ  importํ•œ ๋’ค,

Route ์ปดํฌ๋„ŒํŠธ๋“ค์„ Suspense ๋กœ ๊ฐ์‹ผ ํ›„ ๋กœ๋”ฉ ํ™”๋ฉด์œผ๋กœ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ fallback ์†์„ฑ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.


์ด๋Ÿด ๊ฒฝ์šฐ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ๊ฐ„์€ ์ค„์–ด๋“ค์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ• ๋•Œ ๋งˆ๋‹ค ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋ณด์—ฌ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค์— ๋”ฐ๋ผ์„œ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.




Reference:

์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

https://ko.reactjs.org/docs/code-splitting.html#reactlazy

https://ko.reactjs.org/docs/react-api.html#reactsuspense

0๊ฐœ์˜ ๋Œ“๊ธ€