ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ๋ฅผ ์ํด์
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ ๋ฒ๋ค๋ฌ์ด๋ค.
Webpack์ ํ๋์ ์์์ (ex. index.js)์ ์์กด์ฑ์ ๊ฐ์ง๋
๋ชจ๋์ ๋ชจ๋ ์ถ์ ํ์ฌ ํ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ธ๋ค.
โ๋ชจ๋ ๋ฒ๋ค๋ฌ?
์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ํ๋์ ํ์ผ๋ก ํฉ์ณ์ฃผ๋ ๊ฒ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ผ๊ณ ํ๋ค.
HTML, CSS, JavaScript ๋ฑ์ ์์์ ์ ๋ถ ๊ฐ๊ฐ์ ๋ชจ๋๋ก ๋ณด๊ณ ,
์ด๋ฅผ ์กฐํฉํด ํ๋์ ๋ฌถ์์ผ๋ก ๋ฒ๋ค๋ง(๋น๋)ํ๋ ๋๊ตฌ์ด๋ค.
โ์ ์ฌ์ฉ?
๋ ๊ฐ์ .js ํ์ผ์์ ๊ฐ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ ๋ ์๊ธธ ์ ์๋
๋ณ์ ๊ฐ ์ถฉ๋์ ์ผ์ด๋์ง ์๊ฒ ํด์ฃผ๋ฉฐ, ๋ฒ๋ค ํ์ผ ์ฌ์ด์ฆ๋ฅผ ์ค์ฌ์ฃผ์ด
์ธํฐ๋ท ์๋๊ฐ ๋๋ฆฐ ๊ตญ๊ฐ์ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์ ์ฌ์ฉํ ์ ์๋ค.
์ฆ, ์ํํธ์จ์ด๋ฅผ ์ ๋ง๋ค์ด๋ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ ๋ฒ๋ค๋ง์ ๊ผญ ํ์ํ๋ค.
โ๏ธ์ฐธ๊ณ ) Webpack์์์ ๋ชจ๋์ JavaScript์ ๋ชจ๋์๋ง ๊ตญํํ์ง ์๋๋ค. HTML, CSS, ํน์ .jpg๋ .png ๊ฐ์ ์ด๋ฏธ์ง ํ์ผ๋ค๋ ์ ๋ถ ํฌํจํ ํฌ๊ด์ ์ธ ๊ฐ๋
์ด๋ค.
๋น๋
npm run build๋ฅผ ์คํํ๋ฉด React build ์์
์ด ์งํ๋๊ณ ,
index.html ํ์ผ์ ์์ถ๋์ด ๋ฐฐํฌ์ ์ต์ ํ๋ ์ํ๋ฅผ ์ ๊ณตํด ์ค๋ค.
๋ฒ๋ค๋ง
ํ์ผ์ ๋ฌถ๋ ์์
๊ทธ ์์ฒด๋ฅผ ๋งํ๋ค.
ํ์ผ์ ์์กด์ ๊ด๊ณ์ ์๋ ํ์ผ๋ค(import, export)
๊ทธ ์์ฒด ํน์ ๋ด๋ถ์ ์ผ๋ก ํฌํจ ๋์ด ์๋ ๋ชจ๋์ ์๋ฏธํ๋ค.
โ Entry : ๋ฒ๋ค๋ง์ ์ํ๋ ์์น
โ Output : ๋ฒ๋ค๋ง์ ๊ฒฐ๊ณผ๋ฌผ
โ Loaders
โ Plugins
โ Mode
โ Browser Compatibility
โ Webpack Dev Server
โ Clean Webpack Plugin
๋ค์ํ ํ๊ฒฝ๊ณผ target์ ์ปดํ์ผํ๋ค.
module.exports = {
target: ["web", "es5"], // ๊ธฐ๋ณธ๊ฐ์ด web
// ์์ฑ๋ ์ฝ๋๋ฅผ es5 ๋ฒ์ ์ผ๋ก ์ปดํ์ผ ํ๊ฒ ๋ค๊ณ ์ง์ ํ ๊ฒ์
};
Entry point
webpack์์์ entry๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ
์์ฑํ ์ฝ๋์ "์์์ "์ผ๋ก ์ดํดํ๋ฉด ํธํ๋ค.
Webpack์ Entry point๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง๊ฐ์ ์ ์ผ๋ก
์์กดํ๋ ๋ค๋ฅธ ๋ชจ๋๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์๋ผ ์ ์๋ค.
//๊ธฐ๋ณธ ๊ฐ
module.exports = {
...
entry: "./src/index.js",
};
-----
//์ง์ ๊ฐ
module.exports = {
...
entry: "./src/script.js",
};
/*
* ๊ธฐ๋ณธ ๊ฐ์ ./src/index.js์ด์ง๋ง,
* Entry ์์ฑ์ ์ค์ ํ์ฌ ๋ค๋ฅธ (๋๋ ์ฌ๋ฌ entry point)๋ฅผ ์ง์ ํ ์ ์๋ค.
*/
์์ฑ๋ ๋ฒ๋ค์ ๋ด๋ณด๋ผ ์์น์ ์ด ํ์ผ์ ์ด๋ฆ์
์ง์ ํ๋ ๋ฐฉ๋ฒ์ webpack์ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
const path = require('path'); // path ๋ชจ๋์ ์ฌ์ฉํด์ผ ํ๋ค.
module.exports = {
...
output: {
path: path.resolve(__dirname, "docs"), // ์ ๋ ๊ฒฝ๋ก๋ก ์ค์ ์ ํด์ผ ํ๋ค.
filename: "app.bundle.js",
clean: true // ์ค๋๋ ํ์ผ ์์ด ๋น๋์์ ์์ฑ๋ ํ์ผ๋ง ๋ณผ ์ ์๋ค.
},
};
Webpack์ ๊ธฐ๋ณธ์ ์ผ๋ก JavaScript์ JSON ํ์ผ๋ง ์ดํดํ๋ค.
๊ทธ๋์ loader๋ฅผ ์ฌ์ฉํ์ฌ JavaScript, JSON์ด ์๋ ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
(ex. CSS)
module.exports = {
...
module: {
rules: [
{
test: /\.css$/, // ํ์ผ๋ช
์ด .css๋ก ๋๋๋ ๋ชจ๋ ํ์ผ์ ์ ์ฉ
use: [MiniCssExtractPlugin.loader, "css-loader"], // ๋ฐฐ์ด ๋ง์ง๋ง ์ค๋ฅธ์ชฝ => ์ผ์ชฝ ์์ผ๋ก ์ ์ฉ
exclude: /node_modules/,
},
],
},
};
/*
* - test: ๋ณํ์ด ํ์ํ ํ์ผ๋ค์ ์๋ณํ๊ธฐ ์ํ ์์ฑ(ํ์)
* - use: ๋ณํ์ ์ํํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ก๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ฑ(ํ์)
* - exclude: ๋ฐ๋ฒจ๋ก ์ปดํ์ผํ์ง ์์ ํ์ผ์ด๋ ํด๋๋ฅผ ์ง์
* (๋ฐ๋๋ก include ์์ฑ์ ์ด์ฉํด ๋ฐ๋์ ์ปดํ์ผํด์ผ ํ ํ์ผ์ด๋ ํด๋ ์ง์ ๊ฐ๋ฅ)
*/
ํ๋ฌ๊ทธ์ธ์ ๋ฒ๋ค๋ง ๊ณผ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ์ํ๋
๋ค์ํ ์์
์ ํ ์ ์๋๋ก ๋์์ค๋ค.
โท html-webpack-plugin
๋ฒ๋ค๋ง ๊ณผ์ ์ค html ํ์ผ์ ์์ ์ด ์ํ๋
ํํ๋ก ๊ฐ๊ณตํ์ฌ ๋ฒ๋ค์ ํฌํจํ ์ ์๊ฒ ํด์ค๋ค.
// ์ค์น ํ require๋ก ๊ฐ์ ธ์์ ์ฌ์ฉ
npm i -D html-webpack-plugin
-----
const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
...
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new MiniCssExtractPlugin(),
],
};
/*
* ์์ ์์ ์์ html-webpack-plugin ์ ์์ฑ๋ ๋ชจ๋ ๋ฒ๋ค์
* ์๋์ผ๋ก ์ฝ์
ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ฉ HTML ํ์ผ์ ์์ฑํด ์ค๋ค.
* mini-css-extract-plugin์ CSS๋ฅผ ๋ณ๋์ ํ์ผ๋ก ์ถ์ถํด
* CSS๋ฅผ ํฌํจํ๋ JS ํ์ผ ๋น CSS ํ์ผ์ ์์ฑํด์ฃผ๊ฒ๋ ์ง์ํ๋ค.
*/
Webpack์ ๋ฒ์ 4๋ถํฐ๋ ์ ํํ ํญ๋ชฉ์ ๋ฐ๋ผ ์ต์ ํ๋ฅผ ์คํํ๋ค.
module.exports = {
...
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};
/*
* ์ต์ ํํ๊ธฐ ์ํด ๋ค์ํ ์ต์
์ด ์ง์์ด ๋๋๋ฐ,
* ๋ํ์ ์ผ๋ก minimize์ minimizer ๋ฑ์ ์ฌ์ฉํ๋ค.
*
* - minimize: TerserPlugin ๋๋ optimization.minimize์
* ๋ช
์๋ plugins๋ก bundle ํ์ผ์ ์ต์ํ(=์์ถ)์ํค๋ ์์
์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
*
* - minimizer: defualt minimizer์ ์ปค์คํ
๋
* TerserPlugin ์ธ์คํด์ค๋ฅผ ์ ๊ณตํด์ ์ฌ์ ์ํ ์ ์๋ค.
*/
๋ณ๊ฒฝ๋๋ ์ฝ๋๋ฅผ ๋ฐ๋ก ๋ฐ์ํด์(๋น๋๋ ๊ฒ์ฒ๋ผ) ๋ณผ ์ ์๋ค.
// ์ค์น ํ ์ฌ์ฉ
npm i -D webpack-dev-server
-----
/* webpack.config.js */
devServer: {
static: {
directory: path.resolve(__dirname, โdistโ)
},
port: 3001,
}
-----
/* package.json */
"script" : {
"build": "webpack"
"start": "webpack server --open --mode=development",
}
/*
* package.json์ script์ web pack server์ ์ถ๊ฐํ๋ฉด
* npm start๋ก ์คํ์์ผฐ์ ๋, ๋ณ๊ฒฝ๋๋ ์ฝ๋๋ฅผ ๋ฐ๋ก ๋ฐ์ํด์(๋น๋๋ ๊ฒ์ฒ๋ผ) ๋ณด์ฌ์ค๋ค.
*/
๊ธฐ์กด ๋น๋๋ฅผ ํตํด ์์ฑ๋์์ง๋ง,
์ฌ์ฉํ์ง ์์ ๋ฒ๋ค ํ์ผ์ ์ง์ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ํ๋ฌ๊ทธ์ธ์ด๋ค.
// ์ค์น ํ ์ฌ์ฉ
npm i -D clean-webpack-plugin
-----
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
Module.exports = {
โฆ
Plugin: [new CleanWebpackPlugin()]
}
module.exports = {
target: ["web", "es5"], // ๊ธฐ๋ณธ๊ฐ์ web
entry: "./src/script.js",
output: {
path: path.resolve(__dirname, "docs"),
filename: "app.bundle.js",
clean: true
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new MiniCssExtractPlugin(),
],
optimization: {
minimizer: [
new CssMinimizerPlugin(),
]
}
};
// package.json ์์ฑํ๊ธฐ
npm init -y
// ์นํฉ ์ค์นํ๊ธฐ
npm install -D webpack webpack-cli
๋ฒ๋ค๋ง์ ์ํ๋ ํ์ผ์ ์์น๋ฅผ entry,
๋ฒ๋ค๋ง์ ๊ฒฐ๊ณผ๋ฌผ์ output์ด๋ผ๊ณ ํ๋ค.
// ์นํฉ config ํ์ผ ์์ฑ(package.json์ด ์๋ ์์น์ ์์ฑ)
// path๋ชจ๋์ ๋ถ๋ฌ์์ ์ฌ์ฉํด์ผ ํ๋ค.
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'), // './dist'์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํดํ๋ค.
filename: 'app.bundle.js',
},
};
// npx webpack์ผ๋ก ๋ฒ๋ค๋งํ๊ธฐ
// package.json์ "scripts"์ "build": "webpack" ์ถ๊ฐํด ์ค๋ค.
// ์ค์น ํ ์ฌ์ฉ
npm i -D css-loader style-loader
-----
/* webpack.config.js */
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "app.bundle.js",
},
module: {
rules: [
{
// ํ์ผ๋ช
์ด .css๋ก ๋๋๋ ๋ชจ๋ ํ์ผ์ ์ ์ฉ
test: /\.css$/,
// ๋ฐฐ์ด ๋ง์ง๋ง ์์๋ถํฐ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์์ผ๋ก ์ ์ฉ
// ๋จผ์ css-loader๊ฐ ์ ์ฉ๋๊ณ , styled-loader๊ฐ ์ ์ฉ๋์ด์ผ ํ๋ค.
// ์์ ์ฃผ์!
use: ["style-loader", "css-loader"],
// loader๊ฐ node_modules ์์ ์๋ ๋ด์ฉ๋ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
// node_modules๋ ์ ์ธํด์ผ ํ๋ค.
exclude: /node_modules/,
},
],
},
};
// ์ดํ npm run build ๋ช
๋ น์ ํตํด ๋ฒ๋ค๋ง์ด ์ ๋์๋์ง ํ์ธํ๋ฉด ๋จ
npm i -D html-webpack-plugin
์ค์น ํ webpack.config.js ํ์ผ์ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ ์ฉํ๋ค.
์ ์ ์ฉ๋์์ผ๋ฉด, npm run build ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค.
const path = require("path");
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "docs"),
filename: "app.bundle.js",
clean: true,
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new CleanWebpackPlugin(),
],
devServer: {
static: {
directory: path.resolve(__dirname, "docs"),
},
port: 3001,
},
};
๐งคCRA ์์ด Webpack์ผ๋ก React ํ๊ฒฝ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ Webpack(๊ณต์๋ฌธ์)
๐ Webpack(๊ณต์๋ฌธ์) - why webpack
๐ CSS์ minify๋ฅผ ์ ์ฉํ๊ธฐ : mini-css-extract-plugin / css-minimizer-webpack-plugin
๐ WebpackManifestPlugin ์ฌ์ฉ๋ฒ