webpack-starting-from-ground

๐Ÿ›  Webpack, ์ด๊ฒƒ๋งŒ์€ ์•Œ๊ณ ๊ฐ€์ž

Stars
4

Webpack, ์ด๊ฒƒ๋งŒ์€ ์•Œ๊ณ  ๊ฐ€์ž

์ด๊ฒƒ๋งŒ์€ ์•Œ์•„์•ผ ํ•˜์ง€ ์•Š์„๊นŒ

Webpack์€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. React ์•ฑ์„ ๋นŒ๋“œํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ ์ƒ๊ฐํ•˜๊ณ  CRA์˜ Webpack ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ํ•ต์‹ฌ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์—์„œ ๊ธ€์„ ์ ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Webpack์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋ฒˆ๋“ค๋Ÿฌ, ์ตœ์ ํ™” ์˜ต์…˜์„ ๊ณต๋ถ€ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” Webpack์˜ ๋™์ž‘์›๋ฆฌ์™€ ํ•ต์‹ฌ ์š”์†Œ๋“ค์„ ์ดํ•ดํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๊ธ€์—์„œ๋Š” Webpack์˜ ๊นŠ์ด์žˆ๋Š” ๋‚ด์šฉ๋ณด๋‹ค ์–•๊ฒŒ '์ด๊ฒƒ๋งŒ์€ ์•Œ์•„์•ผ ํ•˜์ง€ ์•Š์„๊นŒ' ๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋‚ด์šฉ์„ ์ ์–ด๋ดค์Šต๋‹ˆ๋‹ค.

Webpack์— ๋Œ€ํ•ด์„œ

webpack ์ถœ์ฒ˜

Webpack์€ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ •์  ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€, ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์ฃผ๋Š” ๋„๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์œ„์™€ ๊ฐ™์€ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

Bundle๊ณผ Chunk

์ถœ์ฒ˜

Bundle

Webpack์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋“ค์„ ์—ฐ๊ฒฐํ•œ(Concentarte) ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค. Bundle์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Chunk๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Chunk

๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ํŒŒ์ผ(Bundle)๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ Chunk๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋„ ์ž„์˜๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ Webpack์„ ์จ์•ผํ• ๊นŒ

์šฐ๋ฆฌ๊ฐ€ ์™œ Webpack์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ์ด์ „ ์›น์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์–ด๋• ๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋Š”๋ฐ ํ•˜๋‚˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์„ ์ผ์œผ์ผฐ๊ณ  ์š”์ฒญ ์ง€์—ฐ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ํฐ .js ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ, ์Šค์ฝ”ํ”„, ํฌ๊ธฐ, ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ๋Œ€ํ•œ ์ด์œ ๋กœ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

Webpack์˜ ํ•ต์‹ฌ ์›๋ฆฌ, ํ•ด๊ฒฐ์ฑ… IIFE, Imeadiately invoked function expressions (์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„)

IIFE๋Š” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ IIFE๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์Šค์ฝ”ํ”„ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IIFE๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์Šค์ฝ”ํ”„ ์ถฉ๋Œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š” ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Webpack์€ IIFE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ทธ ๋ฐ–์— ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋กœ์จ๋Š” Make, Gulp, Grund, Brocooli or Brunch๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค๋„ ์•Œ๋ ค์ง„๊ณผ ๊ฐ™์ด ๋ฒˆ๋“ค๋Ÿฌ(๋˜๋Š” ํ…Œ์Šคํฌ ๋Ÿฌ๋„ˆ)๋กœ์จ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ๋ฒˆ๋“ค๋งํ•ด์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ Webpack์€ dependency graph๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋นŒ๋“œ์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ๋กœ์จ ํฌ๊ณ  ๋ณต์žกํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (Grunt, Gulp๋Š” ์˜ค๋กœ์ง€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํˆด๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ dependency graph ๊ฐœ๋…์ด ์—†์Œ) ๋˜ํ•œ ๋น„์Šทํ•œ Browsify์™€ ๋น„๊ตํ•œ๋‹ค๋ฉด ์†๋„๋ฉด์—์„œ ์ข€ ๋” ์šฐ์›”ํ•ฉ๋‹ˆ๋‹ค.

Webpack์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฒˆ๋“ค๋ง์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณธ๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์€ (๋ฒˆ๋“ค์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผํ•˜๋ฏ€๋กœ)์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆ๋“ค๋ง์„ ์‰ฝ๊ฒŒํ•˜๋ ค๋ฉด ํŒŒ์ผ๋“ค ๊ฐ„์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค์— ๊ทธ ์ฝ”๋“œ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์˜ˆ๋ฅผ ๋“ค์–ด lodash์—์„œ ๋‹จ์ผํ•จ์ˆ˜ ๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ lodash ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ์˜ ์ข…์†์„ฑ์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ์š”? ์ฝ”๋“œ์˜ ๋กœ๋”ฉ์ง€์—ฐ์€ ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ง‰์•„์•ผํ•˜๋ฉฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ฐœ๋ฐœ์ž์˜ ๋งŽ์€ ์ˆ˜์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์˜ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Webpack์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฒˆ๋“ค๋ง์˜ ์„ฑ๋Šฅ๊ณผ ์ตœ์ ํ™”๋ฅผ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ด์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋กœ๋“œํ•˜์—ฌ ์š”์ฒญ ์ง€์—ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Webpack์˜ ํ•ต์‹ฌ์š”์†Œ

์•„๋ž˜๋Š” Webpack์˜ core๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค์ž…๋‹ˆ๋‹ค. ์ด ์š”์†Œ๋“ค์„ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Entry
  • Output
  • Loaders
  • Plugins
  • Mode

create-react-app webpack(์ดํ•˜ 'CRA') ์„ค์ • ๋œฏ์–ด๋ณด๊ธฐ

CRA๋Š” React๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์ž…๋‹ˆ๋‹ค. ์ด CRA ์„ค์ •์—๋Š” React๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ Webpack ์„ค์ •๋“ค์ด ๊ธฐ๋ณธ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •๋“ค์„ ๋ณด๋ฉฐ React์—์„œ Webpack์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ CRA๋ฅผ ํ†ตํ•ด React ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ํ•˜๋ฉด Webpack ๊ด€๋ จ ์„ค์ •๋“ค์ด ์ˆจ๊ฒจ์ ธ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๊บผ๋‚ด์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  1. CRA๋ฅผ ํ†ตํ•œ React ํ™˜๊ฒฝ๊ตฌ์„ฑ
npx create-react-app myapp
  1. eject๋ฅผ ํ†ตํ•ด Webpack ์„ค์ •์„ ์™ธ๋ถ€๋กœ ๊บผ๋‚ด๊ธฐ
npm run eject

# ๋˜๋Š” yarn
yarn eject

์ด๋ ‡๊ฒŒ eject ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์„ค์ •์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ config์™€ script ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ config/webpack.config.js ์—์„œ Webpack ํ™˜๊ฒฝ์„ค์ •์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์š”์†Œ๋“ค์„ CRA์—์„œ์˜ webpack.config.js ์ฝ”๋“œ์—์„œ ๋ชจ๋“  ์„ค์ •์„ ์‚ดํŽด๋ณด์ง„ ์•Š๊ณ  ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„๋งŒ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Entry / Output

entry๋Š” building์˜ ์‹œ์ž‘์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, output์€ buidling ๋œ ํŒŒ์ผ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

entry: [
  // dev ๋ชจ๋“œ๋ฉด Hot reload(ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ž๋™ ๋ฐ˜์˜) ์„ค์ •์„ ์ถ”๊ฐ€
  isEnvDevelopment && require.resolve('react-dev-utils/webpackHotDevClient'),

  // src/index.js
  paths.appIndexJs
].filter(Boolean), // true๊ฐ’์ธ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜
output: {
  // build path, filename ์ง€์ •
  path: isEnvProduction ? paths.appBuild : undefined,
  filename: isEnvProduction
    ? 'static/js/[name].[contenthash:8].js' // ํ•ด์‹œ ๊ฐ’์„ ๋„ฃ์Œ์œผ๋กœ์จ ๋กœ์ปฌ์—์„œ ์บ์‹ฑ์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    : isEnvDevelopment && 'static/js/bundle.js',
  // more...
},

2. Loaders

loader๋Š” ๋ฒˆ๋“ค๋งํ•  ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋ชจ๋“ˆ์ด ๋  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ babel-loader๋ฅผ ํ†ตํ•ด ์ฝ์–ด๋“ค์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

loaders: [
  {
    test: /\.(js|mjs|jsx|ts|tsx)$/,
    include: paths.appSrc,
    loader: require.resolve("babel-loader")
    // ...
  }
];

๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋“ค ๋˜ํ•œ loader๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

loaders: [
  {
    test: /\.(js|mjs|jsx|ts|tsx)$/,
    include: paths.appSrc,
    loader: require.resolve("babel-loader")
    // ...
  },
  {
    test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
    loader: require.resolve("url-loader")
  }
];

3.Plugins

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฒˆ๋“ค ์ตœ์ ํ™”, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฃผ์ž…๊ณผ ๊ฐ™์€ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” HtmlWebPackPluglin์„ ์‚ฌ์šฉํ•˜์—ฌ filename์˜ ๊ฐ’์œผ๋กœ ์ง€์ •๋œ ํŒŒ์ผ์•ˆ์— <script> ํƒœ๊ทธ๋ฅผ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

plugins: [
  new HtmlWebpackPlugin(
    Object.assign(
      {},
      {
        inject: true,
        template: paths.appHtml // ./src/index.html
      },
      isEnvProduction
        ? {
            minify: {
              removeComments: true
              //...
            }
          }
        : undefined
    )
  )
  // more ...
];

4.Mode

webpack์„ ๊ตฌ๋™์‹œํ‚ฌ mode๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. development, production, none ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฐ๊ฐ์˜ ์„ค์ •์— ๋”ฐ๋ผ webpack์˜ ๋‚ด์žฅ๋œ ์ตœ์ ํ™”๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ• ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. webpack์˜ mode ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ์„ค์ •๋˜๋Š”์ง€ ์ž์„ธํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž„์˜๋กœ optimization ์†์„ฑ์— ์ตœ์ ํ™” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development',

์ง์ ‘ Bundle์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด? webpack-bundle-analyzer

๋ฒˆ๋“ค์˜ ๊ตฌ์„ฑ์‚ฌํ•ญ์„ ํ•œ๋ฒˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์–ด๋–ค ๊ตฌ์„ฑ์ด bundle์˜ ํฌ๊ธฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด์„œ Webpack ์„ค์ •์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ต์ฒด๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

webpack-bundle-analyzer

์ƒ๊ฐ

React๋กœ ๊ฐœ๋ฐœํ•˜๋ฉฐ ๋นŒ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ํฌ๊ฒŒ ๊ด€์‹ฌ์„ ๊ฐ€์ง€์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ๋“ค์ผ์ˆ˜๋ก ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ SPA๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฑด ๋งˆ์น˜ ์นด๋ฉ”๋ผ์˜ ์กฐ๋ฆฌ๊ฐœ์™€ ๋ Œ์ฆˆ๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์ง„๊ฐ€๊ฐ€ ์ผ๋ฐ˜์ธ๋ณด๋‹ค ์‚ฌ์ง„์„ ์ž˜ ์ฐ๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€ ์•„๋‹๊นŒ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋„๊ตฌ๋„ ํ•จ๊ป˜ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ธ๋„ค์ผ ์ถœ์ฒ˜