2023. 8. 12. 16:43ใStudy_Develop/React
์ฝ๋ ์คํ๋ฆฌํ (code splitting) ?
ํ์ด์ง๊ฐ ๋ก๋ ๋ ๋, ๋ถํ์ํ ์ปดํฌ๋ํธ๋ ๋ถ๋ฌ์ค์ง ์๊ณ ํ์ํ ์ปดํฌ๋ํธ๋ค๋ง ๋ถ๋ฌ์ค๋๋ก ํ๋ ๊ธฐ๋ฒ.
๋ฆฌ์กํธ์์๋ ์ ์ฉ์ด ๋์ง๋ง, ์นํฉ(webpack)์ ์ด์ฉํ ๋ค๋ฅธ ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์นํฉ๋ ๊ฐ๋จ ์ค๋ช ํ์๋ฉด, ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ํ์ผ๋ค์ ๋ฌถ๊ณ ์์ถํ์ฌ ํ๋์ ๊ฒฐ๊ณผ๋ฌผ๋ก ๋ง๋ค์ด์ฃผ๋ ์น๊ฐ๋ฐ ๋๊ตฌ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ๋ ๊ณผ์ ์์ ๋น๋(build)๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋๋ฐ, ์ด ๊ณผ์ ์์ ๋ชจ๋ ํ์ผ๋ค์ด ํ๋๋ก ํฉ์ณ์ง๊ฒ ๋๋ค. ์ฐ๋ฆฌ๊ฐ index.js, components๋ค๋ก ๋๋ด๋ ์์ค ์ฝ๋๋ค์ด ํ๋๋ก ํฉ์ณ์ง๊ฒ ๋๋ค. ๊ฐ๋จํ ํ๋ก์ ํธ๋ผ๋ฉด ์ํฅ์ด ์ ๊ฒ ์ง๋ง, ๊ฑฐ๋ํ ํ๋ก์ ํธ๋ผ๋ฉด(ํนํ spaํ์ด์ง์์) ๊ธธ๊ณ ๋ง์ js์ฝ๋๊ฐ ํ์ํ๋ค. ์ด ๊ฒฝ์ฐ ์ธํฐ๋ท ํ๊ฒฝ์ด ์ข์ง ๋ชปํ ๊ณณ์์๋ ๊ฑฐ๋ํ ์์ค์ฝ๋๋ค์ ๋ถ๋ฌ์ค๋๋ฐ ์๋นํ ๋ก๋ฉ ์๊ฐ์ ๊ฐ๊ฒ๋๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ณ ์ ์ฝ๋์์ ๋น์ฅ ์ฌ์ฉํ๋ ๋ถ๋ถ๋ง ๋ก๋ฉํ๊ณ , ํ์ฌ ํ์คํ์ง ์์ ์ฝ๋ ๋ถ๋ถ์ ๋ฐ๋ก ๋ถ๋ฆฌ์์ผ ๋์ค์ ๋ก๋ํจ์ผ๋ก์จ ๋ก๋ฉ์๊ฐ์ ๊ฐ์ ํ๋ ๊ฒ์ด ์ฝ๋ ์คํ๋ฆฌํ ์ด๋ค.
๊ทธ๋์ ์ด๋ค ์ปดํฌ๋ํธ๋ค์ ๋ถ๋ฆฌํ ์ง ๊ณ ๋ฏผ์ด ๋ง์์ง.
๊ทธ๋์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ํ๋ฉด ์ข์๊น?
- ํ์ด์ง๋ค์ ๋ถ๋ฆฌํจ.
- ์๋ฒ์ฌ์ด๋๋ ๋๋ง์ด ํ์ ์๋ ์ ๋ค์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํจ.
npm i @loadable/component
npm i --save-dev @types/loadable__component
-> react ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋ ๋ถํ ์ ํ์ฑํ ํ๋ค.
App.tsx>
import loadable from '@loadable/component';
const LogIn = loadable(()=> import( '@pages/Login'));
const SignUp = loadable(()=> import( '@pages/SignUp'));
์๋ ๊ฒ ํ์ด์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ๋ฅผ ํ์.
์ฝ๋ ๋น๋๊ธฐ ๋ก๋ฉ
๋ ๋์ ์ฌ์ฉ์ ์ํด ์ฝ๋๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ์ฝ๋ ๋น๋๊ธฐ ๋ก๋ฉ์ ๋ํ์ ์ธ ์์๊ฐ ์ฝ๋ ์คํ๋ฆฌํ ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก js ํจ์๋ import()ํจ์๋ฅผ ํตํด์ ๋ถ๋ฆฌํ ์ ์๋ค. import()ํจ์ ํํ๋ก ๋ฉ์๋ ์์์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ์ํ ๋ ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
ํจ์๋ฅผ ์ฝ๋์คํ๋ฆฌํ ํด๋ณด๊ธฐ
// src/notify.js
const notify = () => {
window.alert("์ข
์๋ฆฌ ์ธ๋ ค๋ผ");
};
export default notify;
// src/App.js
import "./App.css";
import notify from "./notify";
function App() {
const handleClick = () => {
notify();
};
return (
<div className="App">
<button onClick={handleClick}>Click!</button>
</div>
);
}
export default App;
๊ทธ๋ผ App์์ ์ ๋ฒํผ์ ๋๋ฅด๋ฉด alert์ด ์ ์๋ํ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ์ฌ์ค ์ ๋ฒํผ์ ํด๋ฆญํ๊ธฐ ์ ๊น์ง๋ notify๋ ํ์ ์๋ ์ฝ๋์ด๋ค.
์ด๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ์ ์ฉํ์ฌ, ์ง๊ธ ๋น์ฅ ํ์ํ์ง ์์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ์์ผ๋ณด์.
import "./App.css";
function App() {
const handleClick = () => {
import("./notify").then(({ default: notify }) => {
notify();
});
};
return (
<div className="App">
<button onClick={handleClick}>Click!</button>
</div>
);
}
export default App;
import ๋ฌธ์ ์ฝ๋ ๋ธ๋ก ์๋๋ก ๋ด๋ ธ๋ค.
์ด๋ import ๋ Promise๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
์ด๊ฒ์ ๋ฐ๋ฒจ stage-3๋จ๊ณ์ ์๋ dynamic import๋ผ๋ ๋ฌธ๋ฒ์ด๋ค.
ํ์ฌ๋ webpack์์ ์ง์์ค์ด๋ผ ์ค์ ์์ด ๋ฐ๋ก ์ฌ์ฉ๊ฐ๋ฅ
์ด ํจ์๋ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก Common JSํํ๋ก ๋ถ๋ฌ์์ ๋ฐ๋ก default๋ฅผ ๋ช ์ํด์ฃผ์ด์ผ ํจ.
์ด๋ ๊ฒ ํ๊ณ ๋์, ๊ฐ๋ฐ์ ๋๊ตฌ์์ Networkํญ์ ์ด์ ๋ค์์, ๋ฒํผ์ ๋๋ฌ๋ณด์๋ผ.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด 1.chunk.js๋ผ๋ ํ์ผ์ ๋ถ๋ฌ์ค๊ฒ ๋๊ณ , ๊ทธ ์์ notify๊ด๋ จ ์ฝ๋๊ฐ ๋ค์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ๋ถ๋ฆฌ๋ ํ์ผ์ ์ฒญํฌํ์ผ ์ด๋ผ๊ณ ํ๋ค.
https://velog.io/@velopert/react-code-splitting
๋ฆฌ์กํธ ํ๋ก์ ํธ ์ฝ๋ ์คํ๋ฆฌํ ์ ๋ณตํ๊ธฐ
์ฝ๋ ์คํ๋ฆฌํ , ๋ญ ๋ณ๊ฑฐ์๋์? ๊ทธ๋ฅ ์นํฉ์์ ํ๋ผ๋๋๋ก ํ๋ฉด ๋๋๊ฑธ์. ํ์ง๋ง! ๋ฆฌ์กํธ์์ ์ฝ๋ ์คํ๋ฆฌํ ์ด๋ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ํจ๊ป ํด๋ณด์ ๊ฒฝํ์ด ์์ผ์๋ค๋ฉด, ์ด ๋๊ฐ์ง ์์ ์ ํจ๊ป
velog.io
์์ ์ ๋ฆฌ๊ฐ ๊ต์ฅํ ์ ๋์ด์๊ธฐ์ ์ ์ฅ์ฉ ..ใ ใ