module bundler๋ ์น๊ฐ๋ฐ์ ํ์ํ ํ์ผ๋ค์ ๋ณํฉ+์์ถํฉ๋๋ค.
์๋ก์ด ํด๋ ์์ฑ ํ ํด๋๋ฅผ ์ด๊ณ ํฐ๋ฏธ๋์์ npm init -y
๋ก ์์ํ๋ฉด package.json ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
๋ค์์ผ๋ก webpack ๊ด๋ จ ํจํค์ง๋ค์ ์ค์นํฉ๋๋ค.
npm i -D webpack webpack-cli webpack-dev-server
์ฌ๊ธฐ์ -D ๋ devDependencies ํจํค์ง๋ฅผ ์ค์นํ๊ฒ ๋ค๋ ๋ช
๋ น์ด์
๋๋ค. devDependencies ๋ ๋ก์ปฌ ๊ฐ๋ฐ์ด๋ ํ
์คํธ์์ ํ์ํ ํจํค์ง๋ฅผ ๋งํฉ๋๋ค.
webpack.config.js ํ์ผ์ ์์ฑํ๊ณ , ์์ถ ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ถํด์ฃผ๋ npm i -D terser-webpack-plugin
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ค์นํฉ๋๋ค.
npx webpack
๋ช
๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์
๋ ฅํ์ฌ ์คํ์์ผ ์ฃผ๋ฉด dist ํด๋ ์์ bundle.js ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
css์ html ํ์ผ์ ์ค์ ํด ์ค ๋ชจ๋์ ์๋ ์ฝ๋๋ฅผ ์
๋ ฅํด ์ค์นํด์ค๋๋ค.
npm i -D html-webpack-plugin
, npm i -D mini-css-extract-plugin css-loader css-minimizer-webpack-plugin
config.js ํ์ผ ์์ ์๋์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ธํ ํด์ค๋๋ค.
const path = require("path"); // path๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
const TerserPlugin = require("terser-webpack-plugin"); //์์ถ ํ๋ฌ๊ทธ์ธ ๋ถ๋ฌ์ค๊ธฐ
const HtmlWebpackPlugin = require("html-webpack-plugin"); // html ํ๋ฌ๊ทธ์ธ ๋ถ๋ฌ์ค๊ธฐ
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // css ํ๋ฌ๊ทธ์ธ ๋ถ๋ฌ์ค๊ธฐ
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); // css ์์ถ ํ๋ฌ๊ทธ์ธ
module.exports = {
entry: "./src/js/index.js", // js ํ์ผ์ ์ง์
์
output: {
//๋น๋ํ์ ๋ ๋ฒ๋คํ์ผ ๊ด๋ จ ์์ฑ
filename: "bundle.js", // ๋ฒ๋คํ์ผ ์ด๋ฆ
path: path.resolve(__dirname, "./dist"), // ๋ฒ๋คํ์ผ ์์ฑ๋ ์ ๋ ๊ฒฝ๋ก์ง์
clean: true, // ๊ฒฝ๋ก์ ์ด๋ฏธ ํ์ผ์ด ์๋ค๋ฉด ์ง์ฐ๊ณ ๋ค์ ์์ฑํ๋ ์์ฑ
},
devtool: "source-map", // ๋น๋ํ ํ์ผ๊ณผ ์๋ณธํ์ผ์ ์ฐ๊ฒฐ
mode: "development", // ๋๋
ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋์ง ์ฐจ์ด production
plugins: [
new HtmlWebpackPlugin({
title: "keyboard",
template: "./index.html", //๋น๋ํ ํ์ผ, lodash ๋ฌธ๋ฒ ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ ํด์ค
inject: "body", // ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ค ๋ถ๋ถ, ๊ธฐ๋ณธ์ค์ ์ head
favicon: "./favicon.png",
}),
new MiniCssExtractPlugin({ filename: "style.css" }),
],
module: {
rules: [
{
test: /\.css$/, // css ํ์ผ์ loader๋ฅผ ํตํด ์ฝ์ด๋ค์
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
optimization: {
minimizer: [
new TerserPlugin(), // ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ์์ถ
new CssMinimizerPlugin(), // css ํ์ผ ์์ถ
],
},
};
<head>
<title>
<!-- ๐ lodash ๋ฌธ๋ฒ -->
<%= htmlWebpackPlugin.options.title %>
</title>
</head>
package.json ํ์ผ์ script ๋ถ๋ถ์ ์๋์ ์ฝ๋๋ฅผ ์
๋ ฅํด์ค ํ npm run build
๋ช
๋ น์ด๋ฅผ ์คํ์์ผ ์ฃผ๋ฉด ๋น๋๊ฐ ๋ฉ๋๋ค.
"scripts": {
"build" : "webpack --mode=production",
"dev": "webpack-dev-server" // npm run dev
},
๋ค์์ dev ์๋ฒ๋ฅผ ๋ฃ์ด์ฃผ๋ ์ค์ ์ ํ๋๋ฒ ์
๋๋ค.
webpack.config.js ํ์ผ์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด ์ค๋๋ค.
devServer: {
host: "localhost",
port: 8080,
open: true,
watchFiles: "index.html", // html ํ์ผ ๋ณํ ๊ฐ์ง, ์๋ ๋ฆฌํ๋ ์
},
ํฐ๋ฏธ๋์ npx webpack-dev-server
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด์ฃผ๋ฉด dev server ํ์ด์ง๊ฐ ์ด๋ฆฌ๊ฒ๋ฉ๋๋ค.