Bundler๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ JavaScript ํŒŒ์ผ(๋ชจ๋“ˆ)๊ณผ ์—์…‹(CSS, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ํ•˜๋‚˜ ๋˜๋Š” ์†Œ์ˆ˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์น˜๋Š” ๋„๊ตฌ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ webpack, Rollup, Parcel์ด ์žˆ๋‹ค.

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ˆ˜๋ฐฑ~์ˆ˜์ฒœ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๋ชจ๋“ˆ ํŒŒ์ผ์„ ๊ฐ๊ฐ HTTP ์š”์ฒญํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๋น„์šฉ์ด ๋ง‰๋Œ€
  • CommonJS ๋“ฑ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๋ชจ๋“ˆ ํ˜•์‹์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ
  • CSS, ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ์—์…‹์„ JavaScript์™€ ํ•จ๊ป˜ ํ†ตํ•ฉ ๊ด€๋ฆฌ ํ•„์š”
  • ์ตœ์ ํ™”(minification, tree-shaking, code splitting) ์ˆ˜ํ–‰

AS-IS (๋ฒˆ๋“ค๋Ÿฌ ์—†์ด)

๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ:
GET index.html
GET app.js
GET utils.js
GET lodash.js    โ† 600+ ๋‚ด๋ถ€ ๋ชจ๋“ˆ์ด๋ฉด 600+ ์š”์ฒญ
GET styles.css
GET ...
โ†’ ์ˆ˜๋ฐฑ ๊ฐœ์˜ HTTP ์š”์ฒญ = ๋А๋ฆฐ ๋กœ๋”ฉ

TO-BE (๋ฒˆ๋“ค๋Ÿฌ ์‚ฌ์šฉ)

๋นŒ๋“œ ์‹œ: [app.js + utils.js + lodash.js + ...] โ†’ bundle.js (1๊ฐœ ํŒŒ์ผ)

๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ:
GET index.html
GET bundle.js     โ† ์ตœ์ ํ™”๋œ ๋‹จ์ผ ํŒŒ์ผ
GET styles.css
โ†’ ์ตœ์†Œํ•œ์˜ HTTP ์š”์ฒญ = ๋น ๋ฅธ ๋กœ๋”ฉ

webpack์˜ ํ•ต์‹ฌ ๊ฐœ๋…

webpack์€ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋กœ, 5๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐœ๋…์ด ์žˆ๋‹ค:

๊ฐœ๋…์—ญํ• ๊ธฐ๋ณธ๊ฐ’
Entry์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์˜ ์‹œ์ž‘์ ./src/index.js
Output๋ฒˆ๋“ค ํŒŒ์ผ ์ถœ๋ ฅ ์œ„์น˜./dist/main.js
LoadersJS๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ(CSS, TS ๋“ฑ) ๋ณ€ํ™˜์—†์Œ
Plugins๋ฒˆ๋“ค ์ตœ์ ํ™”, ์—์…‹ ๊ด€๋ฆฌ ๋“ฑ ํ™•์žฅ์—†์Œ
Modedevelopment / production ์ตœ์ ํ™”production
// webpack.config.js ๊ธฐ๋ณธ ๊ตฌ์กฐ
module.exports = {
  entry: './src/index.js',
  output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') },
  module: {
    rules: [{ test: /\.css$/, use: 'css-loader' }]  // Loader
  },
  plugins: [new HtmlWebpackPlugin()],                // Plugin
  mode: 'production'
};

Dependency Graph (์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„)

๋ฒˆ๋“ค๋Ÿฌ์˜ ํ•ต์‹ฌ ๋™์ž‘ ์›๋ฆฌ:

entry: index.js
  โ”œโ”€โ”€ import App from './App.js'
  โ”‚     โ”œโ”€โ”€ import Button from './Button.js'
  โ”‚     โ””โ”€โ”€ import './App.css'
  โ”œโ”€โ”€ import { createStore } from 'redux'
  โ””โ”€โ”€ import './global.css'

โ†’ ์ด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ˆ˜์ง‘ โ†’ ๋ฒˆ๋“ค๋กœ ํ•ฉ์นจ

Vite์™€์˜ ๊ด€๊ณ„: Vite๋Š” ๊ฐœ๋ฐœ ์‹œ์—๋Š” ๋ฒˆ๋“ค๋ง์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  Native ESM์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋Š” Rollup์„ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์ด Vite๊ฐ€ ๋น ๋ฅธ ์ด์œ ์˜ ํ•ต์‹ฌ์ด๋‹ค โ€” ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋ฒˆ๋“ค๋Ÿฌ์˜ ๊ฐ€์žฅ ๋А๋ฆฐ ๋ถ€๋ถ„(์ „์ฒด ํฌ๋กค๋ง + ๋นŒ๋“œ)์„ ์ œ๊ฑฐํ•œ ๊ฒƒ.

์ฐธ๊ณ  ๋ฌธ์„œ