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 |
| Loaders | JS๊ฐ ์๋ ํ์ผ(CSS, TS ๋ฑ) ๋ณํ | ์์ |
| Plugins | ๋ฒ๋ค ์ต์ ํ, ์์ ๊ด๋ฆฌ ๋ฑ ํ์ฅ | ์์ |
| Mode | development / 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๊ฐ ๋น ๋ฅธ ์ด์ ์ ํต์ฌ์ด๋ค โ ๊ฐ๋ฐ ์ค์๋ ๋ฒ๋ค๋ฌ์ ๊ฐ์ฅ ๋๋ฆฐ ๋ถ๋ถ(์ ์ฒด ํฌ๋กค๋ง + ๋น๋)์ ์ ๊ฑฐํ ๊ฒ.