๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web

[Web] Webpack

๐Ÿ“˜ webpack์€ ๋ญ˜๊นŒ?

webpack ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€์žˆ๋‹ค.

At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph from one or more entry points and then combines every module your project needs into one or more bundles, which are static assets to serve your content from.

 

ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

 

๊ฒฐ๊ตญ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๋Š” ๊ฒƒ์ธ๋ฐ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž์›๋“ค HTML, CSS, Javscript, ์ด๋ฏธ์ง€ ๋“ฑ์„ ์กฐํ•ฉํ•ด์„œ ๋ณ‘ํ•ฉ๋œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

๐Ÿ“™ Webpack์„ ์™œ ์“ธ๊นŒ?

 

1. bundling

๋œป ๊ทธ๋Œ€๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋“ค์„ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฌถ์–ด์ค€๋‹ค!

๋งŒ์•ฝ html์—์„œ scriptํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด์„œ jsํŒŒ์ผ์„ ์ ์šฉ์‹œํ‚ค๊ฑฐ๋‚˜ cdn์„ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒฝ์šฐ ๊ทธ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ์œก์•ˆ์œผ๋กœ๋„ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. webpack์„ ์ด์šฉํ•˜๋ฉด ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ jsํŒŒ์ผ์„ ๋ฌถ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

2. code spliting

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

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

chunk
๋ฒˆ๋“ค๋˜๋Š” ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ๊ฐœ์˜ chunk๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

3. tree shaking

tree shaking์€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด ์ค€๋‹ค.

const sayHello = () => console.log('hello JongBin!');

sayHello();

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์›นํŒฉ์„ ์ด์šฉํ•ด ๋ฒˆ๋“ค๋งํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

console.log('hello JongBin!');

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์„œ ํ˜ธ์ถœํ–ˆ์„๋•Œ console.log() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋Š”๋ฐ ๋‹จ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์›นํŒฉ์€ ์ด๋ฅผ ์ธ์‹ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ  console.log() ๋ฉ”์„œ๋“œ ๋งŒ ํ˜ธ์ถœ๋˜๋„๋ก tree shaking ํ•ด์ค€๋‹ค.

(๋งŒ์•ฝ ์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ sayHello ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.)

 

4. source map

๋ฐฐํฌ์šฉ์œผ๋กœ ๋นŒ๋“œํ•œ ํŒŒ์ผ๊ณผ ์›๋ณธ ํŒŒ์ผ์„ ์„œ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ ์ค€๋‹ค.

production ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜์—ฌ ๋ฐฐํฌ์šฉ์œผ๋กœ ๋นŒ๋“œ๋œ ํŒŒ์ผ์—์„œ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์„๋•Œ ์ด ๋นŒ๋“œ๋œ ํŒŒ์ผ์€ ๋ฒˆ๋“ค๋˜๊ณ , ์••์ถ•๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋‚œ ๋ถ€๋ถ„์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›๋ณธ ํŒŒ์ผ๊ณผ ๋น„๊ตํ•ด์„œ ํ•ด๋‹น ๋ถ€๋ถ„์ด ์–ด๋Š ๋ถ€๋ถ„์ธ์ง€ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด source map์ด๋‹ค.

devtool: 'cheap-eval-source-map';

์œ„ ์ฝ”๋“œ๋ฅผ exportํ•˜๋Š” ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“’ webpack์˜ ํ•ต์‹ฌ ๊ฐœ๋…

webpack์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํ•ต์‹ฌ ๊ฐœ๋…๋งŒ ์ดํ•ดํ•˜๋ฉด webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค. ์ •๋ฆฌํ•ด ๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. Entry(์—”ํŠธ๋ฆฌ)

webpack์˜ ์„ค๋ช…์„ ๊ณต์‹๋ฌธ์„œ์—์„œ ์‚ดํŽด๋ณด๋ฉด webpack์€ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•œ๋‹ค.

๋งŒ์•ฝ login.js, header.js, footer.js ๋“ฑ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ(index.js)๋กœ ๋ฒˆ๋“ค์„ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ฆผ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

์ด๋•Œ index.js๊ฐ€ ์ง„์ž…์ (entry point)์ด๊ณ  ์„ธ ํŒŒ์ผ(login.js, header.js, footer.js)์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

2. Output(์ถœ๋ ฅ)

output ์†์„ฑ์€ ์ƒ์„ฑ๋œ ๋ฒˆ๋“ค์„ ๋‚ด๋ณด๋‚ผ ์œ„์น˜์™€ ์ด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ webpack์— ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๊ธฐ๋ณธ ์ถœ๋ ฅ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ./dist/main.js๋กœ , ์ƒ์„ฑ๋œ ๊ธฐํƒ€ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ./dist ํด๋”๋กœ ์„ค์ •๋œ๋‹ค.

๋ณดํ†ต path์™€ filename์„ ๋ช…์‹œํ•ด ์ค€๋‹ค.

output: {
  path: path.resolve(ROOT_DIR, development ? 'public' : 'build'),
  filename: 'js/[name].js',
},

path๋Š” core์— ์†ํ•˜๋ฉฐ, core๋Š” ๊ณตํ†ต์ ์ธ ๊ฒƒ์„ ๋ชจ์•„๋†“์•„ ์ดํ›„ node์—์„œ webpack์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•จ๊ป˜ installํ•œ๋‹ค.

 

3. Loaders(๋กœ๋”)

๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด webpack์€ JavaScript์™€ JSON ํŒŒ์ผ๋งŒ ์ดํ•ดํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒŒ์ผ, ๋งŒ์•ฝ babel์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด babel-loader๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์œ ํšจํ•œ ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. Plugins(ํ”Œ๋Ÿฌ๊ทธ์ธ)

webpack์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋“ค์„ ๋ฒˆ๋“คํ•˜๊ฒŒ ๋˜๋ฉด jsํŒŒ์ผ๋“ค๋งŒ ๋ฐฐํฌ์šฉ์œผ๋กœ ์ƒ์„ฑ์ด ๋˜๋Š”๋ฐ ์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],

// ./src/index.html์ธ ํŒŒ์ผ์„ ๋ฒˆ๋“คํ•ด ์ƒ์„ฑํ•œ๋‹ค.

plugin ์†์„ฑ์— ๋ฐฐ์—ด์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5. Mode(๋ชจ๋“œ)

์›นํŒฉ์„ ๊ตฌ๋™ํ•˜๋Š”๋ฐ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ 3๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. development(๊ฐœ๋ฐœ ๋ชจ๋“œ)
  2. production(๋ฐฐํฌ ๋ชจ๋“œ): ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฒˆ๋“ค๋ง ๊ณผ์ •์—์„œ ์ž์ฒด์ ์œผ๋กœ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•ด ์šฉ๋Ÿ‰์„ ์ค„์—ฌ์ค€๋‹ค.
  3. none(๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Œ)

development ๋ชจ๋“œ์™€ production ๋ชจ๋“œ๋Š” DefinePlugin์˜ process.env.NODE_ENV๋ฅผ ๊ฐ๊ฐ development, production๋กœ ์„ค์ •ํ•œ๋‹ค.

 

6. Browser Compatibility(๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ)

๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์›นํŒฉ์€ IE8 ์ดํ•˜๋ฅผ ์ œ์™ธํ•˜๊ณ , ES5๊ฐ€ ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋งŒ์•ฝ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ฆฌํ•„์„ ๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค.

 

7. cache

๋งŒ์•ฝ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ๋ฒˆ๋“ค๋งํ•˜๊ฒŒ ๋˜๋ฉด ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— cache๋ฅผ ture๋กœ ์„ค์ •ํ•ด์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋ฒˆ๋“ค๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

module.exports = {
  cache: false,
};

→ cache๋Š” development ๋ชจ๋“œ์—์„œ type: 'memory'๋กœ ์„ค์ •๋˜๊ณ  production ๋ชจ๋“œ์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.

 

8. module

๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ชจ๋“ˆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.

๋ชจ๋“ˆ์ด ์ƒ์„ฑ ๋  ๋•Œ ์š”์ฒญ๊ณผ ์ผ์น˜ํ•˜๋Š” Rule์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™์€ ๋ชจ๋“ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋”๋ฅผ ๋ชจ๋“ˆ์— ์ ์šฉ์‹œํ‚ค๊ฑฐ๋‚˜ ํŒŒ์„œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(https://webpack.kr/configuration/module/#modulerules)

 

rules rule์˜ ๋ฐฐ์—ด๋กœ์„œ test๋กœ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด์„œ ์ ์šฉํ•  ํŒŒ์ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ณ , use ์†์„ฑ์— ์–ด๋–ค ๋กœ๋”๋ฅผ ์ ์šฉ์‹œํ‚ฌ์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ exclude ์†์„ฑ์—๋Š” ์ ์šฉํ•˜์ง€ ์•Š์„ ํŒŒ์ผ๋“ค์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์กด์žฌํ•œ๋‹ค.)

 

 

์•Œ๋ฉด ์•Œ์ˆ˜๋ก ํ—ท๊ฐˆ๋ฆฌ๋Š” webpack.... ๊ธฐ๋Šฅ์ด ์ •๋ง ๋งŽ๋‹ค...