1. Webpack์ด๋?
Webpack์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ(module bundler)๋ค. ์น ๊ฐ๋ฐ์์ ์ฌ๋ฌ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ, CSS, ์ด๋ฏธ์ง ๋ฑ์ ํ๋์ ๋ฒ๋ค ํ์ผ๋ก ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
2. Webpack์ด ํ์ํ ์ด์
์น ๊ฐ๋ฐ์ด ์ ์ ๋ณต์กํด์ง๋ฉด์ ๋ค์ํ ํ์ผ๊ณผ ๋ชจ๋์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ ํ์์ฑ์ด ์๊น. Webpack์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์.
- ๋ชจ๋ํ ์ง์: ES6+ ๋ชจ๋, CommonJS, AMD ๋ฑ์ ๋ค์ํ ๋ชจ๋ ์์คํ ์ ์ง์ํจ
- ํ์ผ ํฌ๊ธฐ ์ต์ ํ: ์ฝ๋ ์์ถ, ํธ๋ฆฌ ์์ดํน(Tree Shaking) ๋ฑ์ ํตํด ์ต์ ํ ๊ฐ๋ฅ
- ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์: HMR(Hot Module Replacement) ๊ธฐ๋ฅ์ผ๋ก ์ฝ๋ ๋ณ๊ฒฝ ์ ๋น ๋ฅด๊ฒ ๋ฐ์๋จ
- ์์ ๊ด๋ฆฌ: CSS, ์ด๋ฏธ์ง, ํฐํธ ๋ฑ๋ ๋ชจ๋์ฒ๋ผ ๊ด๋ฆฌ ๊ฐ๋ฅ
3. Webpack์ ํต์ฌ ๊ฐ๋
Webpack์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ๋ฒ๋ค๋งํ๋ ๊ณผ์ ์์ ์ค์ํ ๋ช ๊ฐ์ง ๊ฐ๋ ์ ์ ๊ณตํจ.
(1) Entry (์ง์ ์ )
์ด๋ค ํ์ผ๋ถํฐ ๋ถ์ํ์ฌ ๋ฒ๋ค๋งํ ์ง ์ค์ ํ๋ ํญ๋ชฉ.
module.exports = {
entry: './src/index.js',
};
์ ์ฝ๋๋ src/index.js ํ์ผ์ ์์์ ์ผ๋ก ํ์ฌ ์์กด์ฑ์ ๋ถ์ํ๊ณ ๋ฒ๋ค๋งํจ.
(2) Output (์ถ๋ ฅ)
๋ฒ๋ค๋ง๋ ํ์ผ์ด ์์ฑ๋ ์์น์ ํ์ผ๋ช ์ ์ง์ ํจ.
module.exports = {
output: {
filename: 'bundle.js',
path: __dirname + '/dist',
},
};
์ ์ค์ ์ ๋ฐ๋ผ ๋ฒ๋ค๋ ํ์ผ์ด dist/bundle.js๋ก ์ ์ฅ๋จ.
(3) Loaders (๋ก๋)
์๋ฐ์คํฌ๋ฆฝํธ ์ด์ธ์ ํ์ผ(CSS, ์ด๋ฏธ์ง ๋ฑ)์ Webpack์ด ์ดํดํ ์ ์๋๋ก ๋ณํํ๋ ์ญํ ์ ํจ.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
};
์ ์ค์ ์ ํตํด .css ํ์ผ์ style-loader์ css-loader๋ก ๋ณํํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํจ.
(4) Plugins (ํ๋ฌ๊ทธ์ธ)
Webpack์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ ์ฝ๋ ์์ถ, ํ๊ฒฝ ๋ณ์ ์ค์ , HTML ํ ํ๋ฆฟ ์์ฑ ๋ฑ์ ์ง์ํจ.
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
],
};
์ ์ค์ ์ ์ฌ์ฉํ๋ฉด src/index.html ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก dist/index.html์ ์๋ ์์ฑํจ.
(5) Mode (๋ชจ๋)
Webpack์ development(๊ฐ๋ฐ)๊ณผ production(์ด์) ๋ชจ๋๋ฅผ ์ ๊ณตํ์ฌ ์ต์ ํ ๋ฐฉ์์ด ๋ค๋ฅด๊ฒ ์ ์ฉ๋จ.
module.exports = {
mode: 'development', // ๋๋ 'production'
};
- development: ๋น ๋ฅธ ๋น๋๋ฅผ ์ํ ์ค์ (์์ค๋งต ์์ฑ, ์ต์ ํ X)
- production: ์ฝ๋ ์ต์ ํ ๋ฐ ๋๋ ํ ์ ์ฉ (ํธ๋ฆฌ ์์ดํน, ๋ฏธ๋ํ์ด ๋ฑ)
4. Webpack ์ฌ์ฉ ์์
์๋๋ Webpack์ ํ์ฉํ์ฌ ๊ฐ๋จํ ๋ฒ๋ค๋ง์ ์ํํ๋ ์ค์ ์์ ์.
(1) ์ค์น
npm init -y
npm install webpack webpack-cli --save-dev
npm install style-loader css-loader html-webpack-plugin --save-dev
(2) ํ๋ก์ ํธ ๊ตฌ์กฐ
/webpack-demo
โโโ /src
โ โโโ index.js
โ โโโ style.css
โโโ /dist
โ โโโ index.html
โโโ webpack.config.js
โโโ package.json
(3) webpack.config.js ์ค์
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
],
mode: 'development',
};
(4) ์คํ ๋ฐ ๋ฒ๋ค๋ง
npx webpack
์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด dist/bundle.js ํ์ผ์ด ์์ฑ๋๋ฉฐ, ์ด๋ฅผ index.html์์ ๋ถ๋ฌ์ฌ ์ ์์.
5. Webpack์ ๋์
Webpack ์ธ์๋ ์ฌ๋ฌ ๋ฒ๋ค๋ฌ๊ฐ ์กด์ฌํจ. ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์.
- Vite: ๊ฐ๋ฐ ์๋๊ฐ ๋น ๋ฅด๊ณ ์ต์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์์ผ๋ก ํจ.
- Parcel: ์ค์ ์ด ๊ฑฐ์ ํ์ ์๋ ๊ฐํธํ ๋ฒ๋ค๋ฌ.
- Rollup: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ๋ค๋ง์ ์ต์ ํ๋ ๋๊ตฌ.
6. ๊ฒฐ๋ก
Webpack์ ํ๋์ ์ธ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ํ์์ ์ธ ๋๊ตฌ ์ค ํ๋๋ก, ๋ฒ๋ค๋ง๊ณผ ์ต์ ํ๋ฅผ ์ํํ์ฌ ๋ณด๋ค ํจ์จ์ ์ธ ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ ์ ์๋๋ก ๋๋ ์ญํ ์ ํจ. ํ์ง๋ง Vite ๋ฑ์ ์๋ก์ด ๋๊ตฌ๋ค์ด ๋ฑ์ฅํ๋ฉด์ ํ๋ก์ ํธ์ ํน์ฑ์ ๋ง๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํจ.