์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์‚ฌ์šฉํ•˜๊ธฐ

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

 

์œ„์— ์ •๋ฆฌ๊ฐ€ ๊ต‰์žฅํžˆ ์ž˜ ๋˜์–ด์žˆ๊ธฐ์— ์ €์žฅ์šฉ ..ใ…Žใ…Ž