Jieunny์ ๋ธ๋ก๊ทธ
S4) Unit 4. [React] React์ ๊ธฐ๋ฅ ๋ณธ๋ฌธ
๐ฃ ์ฝ๋ ๋ถํ
๐ญ. ์ฝ๋ ๋ถํ ์ด๋?
โ๏ธ ๋ฐํ์ ์ ์ฌ๋ฌ ๋ฒ๋ค์ ๋์ ์ผ๋ก ๋ง๋ค๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ
โฐ ๋น์ฅ ํ์ํ ์ฝ๋๊ฐ ์๋๋ผ๋ฉด ๋ฐ๋ก ๋ถ๋ฆฌ๋ฅผ ์ํค๊ณ , ๋์ค์ ํ์ํ ๋ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
โฐ Webpack, Rollup๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ
โฐ ํ์ด์ง์ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
๐ฎ. ๋ฒ๋ค ๋ถํ ํน์ ์ค์ด๋ ๋ฒ
โ๏ธ ๋ฒ๋ค๋ง ๋๋ ํ์ผ์ npm์ ํตํด ๋ค์ด๋ฐ๋ ๊ฒ์๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋๋๋ฐ ์ด๋ฅผ ๋ฐ๋ก ๋ฐ๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
โฐ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ๊ฐ์ธ ๊ฐ๋ฐ์๋ ํ๋ก์ ํธ ํ, ํน์ ์ ์ฒด๋ฑ์์ ๊ฐ๋ฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฆ ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ใด ํ๋ฌ๊ทธ์ธ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ ๋ฑ์ด ์กด์ฌํ๋ฉฐ, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฌ์ฉํ๋ฉด ํธํ๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ํ ์ ์๋ค.
/* ์ด๋ ๊ฒ lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฒด๋ฅผ ๋ถ๋ฌ์์ ๊ทธ ์์ ๋ค์ ๋ฉ์๋๋ฅผ ๊บผ๋ด ์ฐ๋ ๊ฒ์ ๋นํจ์จ์ ์
๋๋ค.*/
import _ from 'lodash';
...
_.find([]);
/* ์ด๋ ๊ฒ lodash์ ๋ฉ์๋ ์ค ํ๋๋ฅผ ๋ถ๋ฌ์ ์ฐ๋ ๊ฒ์ด ์ฑ์ ์ฑ๋ฅ์ ๋ ์ข์ต๋๋ค.*/
import find from 'lodash/find';
find([]);
โฐ lodash๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋์ ํด๋์ ๊ฐ๊ณ , ๊ทธ ํด๋ ์์๋ ๊ฐ๋ฐ ์ ๋ค์ํ ์ํฉ์ ์ฐ๊ธฐ ์ข์ ๋ฉ์๋๋ค, ์ฆ ํจ์ ์ฝ๋๋ค์ด ๋ค์ด ์๋ค.
โฐ ํ์ํ ๊ฒ ํ๋ ๊ฐ๋ง ๊ฐ์ ธ๋ค ์ฐ๋ ์์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ํจ์ฌ ์ข๋ค.
๐ฃ ๋ฆฌ์กํธ์์์ ์ฝ๋ ๋ถํ
โ๏ธ ๋ฆฌ์กํธ๋ SPA๋ก ์ฌ์ฉํ์ง ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊น์ง ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์, ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๋ ๋์ค์ ๋ถ๋ฌ์ค๊ธฐ ์ํด ์ด ๊ฐ๋ ์ ๋์ ํ๋ค => ๋์ ๋ถ๋ฌ์ค๊ธฐ
๐ญ. ์ ์ ๋ถ๋ฌ์ค๊ธฐ(static import)
/* ๊ธฐ์กด์๋ ํ์ผ์ ์ต์์์์ import ์ง์์๋ฅผ ์ด์ฉํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ์ผ์ ๋ถ๋ฌ์์ต๋๋ค. */
import moduleA from "library";
form.addEventListener("submit", e => {
e.preventDefault();
someFunction();
});
const someFunction = () => {
/* ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์ค๊ฐ์์ ๋ถ๋ฌ์จ ํ์ผ์ ์ฌ์ฉํ์ต๋๋ค. */
}
โฐ import ๊ตฌ๋ฌธ์ ๋ฌธ์์ ์์์ ์์นํ๊ณ , ๋ธ๋ก๋ฌธ ์์์๋ ์์นํ ์ ์๋ค.
๐ฎ. ๋์ ๋ถ๋ฌ์ค๊ธฐ(dynamic import)
form.addEventListener("submit", e => {
e.preventDefault();
/* ๋์ ๋ถ๋ฌ์ค๊ธฐ๋ ์ด๋ฐ ์์ผ๋ก ์ฝ๋์ ์ค๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋ฉ๋๋ค. */
import('library.moduleA')
.then(module => module.default)
.then(someFunction())
.catch(handleError());
});
const someFunction = () => {
/* moduleA๋ฅผ ์ฌ๊ธฐ์ ์ฌ์ฉํฉ๋๋ค. */
}
โฐ ์ฌ์ฉ์๊ฐ form ์์์ ์ ์ถํ ๊ฒฝ์ฐ์๋ง moduleA๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํ๋ค.
โฐ then ํจ์๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์ฝ๋๋ง ๊ฐ์ ธ์ค๋ฉฐ, ๊ฐ์ ธ์จ ์ฝ๋์ ๋ํ ๋ชจ๋ ํธ์ถ์ ํด๋น ํจ์ ๋ด๋ถ์ ์์ด์ผ ํ๋ค.
โฐ React.lazy ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
๐ฃ React.lazy()์ Suspense
๐ญ. React.lazy()
โ๏ธ react.lazy() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๋ค.
โฐ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก import ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ๋ ๋๋ง ์ง์ฐ์๊ฐ์ ์ค์ผ ์ ์๋ค.
import Component from './Component';
/* React.lazy๋ก dynamic import๋ฅผ ๊ฐ์๋๋ค. */
const Component = React.lazy(() => import('./Component'));
โฐ React.lazy๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ ๋จ๋ ์ผ๋ก ์ฐ์ผ ์๋ ์๊ณ , React.suspense ์ปดํฌ๋ํธ์ ํ์์์ ๋ ๋๋ง์ ํด์ผ ํ๋ค.
๐ฎ. React.Suspense
โ๏ธ ์์ง ๋ ๋๋ง์ด ์ค๋น๋์ง ์์ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ๋ก๋ฉ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ , ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๋ ๋๋ง์ด ์ค๋น๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ
โฐ lazy๋ฅผ ํตํด importํ๋ฉด ํด๋น path๋ก ์ด๋ํ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋๋ฐ ์ด ๊ณผ์ ์์ ๋ก๋ฉํ๋ ์๊ฐ์ด ์๊ธด๋ค.
/* 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 ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค.
๐ฏ. 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>
);
โฐ ๋ผ์ฐํฐ์ Suspense๋ฅผ ์ ์ฉํ๋ ๊ฒ
ใด ๋ผ์ฐํฐ๊ฐ ๋ถ๊ธฐ๋๋ ์ปดํฌ๋ํธ์์ ๊ฐ ์ปดํฌ๋ํธ์ React.lazy๋ฅผ ์ฌ์ฉํ์ฌ importํ๋ค.
ใด Route ์ปดํฌ๋ํธ๋ค์ Suspense๋ก ๊ฐ์ผ ํ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ฅผ fallback ์์ฑ์ผ๋ก ์ค์ ํด์ค๋ค.
ใด ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ด ์ค์ด๋๋ ์ฅ์ ์ด ์์ผ๋ ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๊ณผ์ ๋ง๋ค ๋ก๋ฉ ํ๋ฉด์ด ๋ณด์ฌ์ง๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S4) Unit 5. [์ปดํจํฐ ๊ณตํ] ์ด์์ฒด์ & ๋ฌธ์์ด๊ณผ ๊ทธ๋ํฝ & ๊ฐ๋น์ง ์ปฌ๋ ์ (1) | 2023.03.27 |
---|---|
S4) Unit 5. [์ปดํจํฐ ๊ณตํ] ์ปดํจํฐ ๊ตฌ์กฐ (2) | 2023.03.27 |
S4) Unit 4. [React] React Hooks (0) | 2023.03.23 |
S4) Unit 4. [React] Virtual DOM (0) | 2023.03.22 |
S4) Unit 3. [React] ๋ฒ๋ค๋ง๊ณผ ์นํฉ (0) | 2023.03.20 |